|
26 | 26 | /*****************************/
|
27 | 27 | /* CPU Mode */
|
28 | 28 | /*****************************/
|
29 |
| -#define USERMODE 0x10 |
30 |
| -#define FIQMODE 0x11 |
31 |
| -#define IRQMODE 0x12 |
32 |
| -#define SVCMODE 0x13 |
33 |
| -#define ABORTMODE 0x17 |
34 |
| -#define UNDEFMODE 0x1b |
35 |
| -#define MODEMASK 0x1f |
36 |
| -#define NOINT 0xc0 |
| 29 | +#define USERMODE 0x10 |
| 30 | +#define FIQMODE 0x11 |
| 31 | +#define IRQMODE 0x12 |
| 32 | +#define SVCMODE 0x13 |
| 33 | +#define ABORTMODE 0x17 |
| 34 | +#define UNDEFMODE 0x1b |
| 35 | +#define MODEMASK 0x1f |
| 36 | +#define NOINT 0xc0 |
37 | 37 |
|
38 | 38 | /**
|
39 | 39 | * This function will initialize thread stack
|
40 | 40 | *
|
41 | 41 | * @param tentry the entry of thread
|
42 |
| - * @param parameter the parameter of entry |
| 42 | + * @param parameter the parameter of entry |
43 | 43 | * @param stack_addr the beginning stack address
|
44 | 44 | * @param texit the function will be called when thread exit
|
45 | 45 | *
|
46 | 46 | * @return stack address
|
47 | 47 | */
|
48 | 48 | rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
|
49 |
| - rt_uint8_t *stack_addr, void *texit) |
| 49 | + rt_uint8_t *stack_addr, void *texit) |
50 | 50 | {
|
51 |
| - rt_uint32_t *stk; |
| 51 | + rt_uint32_t *stk; |
52 | 52 |
|
53 |
| - stk = (rt_uint32_t*)stack_addr; |
54 |
| - *(stk) = (rt_uint32_t)tentry; /* entry point */ |
55 |
| - *(--stk) = (rt_uint32_t)texit; /* lr */ |
56 |
| - *(--stk) = 0; /* r12 */ |
57 |
| - *(--stk) = 0; /* r11 */ |
58 |
| - *(--stk) = 0; /* r10 */ |
59 |
| - *(--stk) = 0; /* r9 */ |
60 |
| - *(--stk) = 0; /* r8 */ |
61 |
| - *(--stk) = 0; /* r7 */ |
62 |
| - *(--stk) = 0; /* r6 */ |
63 |
| - *(--stk) = 0; /* r5 */ |
64 |
| - *(--stk) = 0; /* r4 */ |
65 |
| - *(--stk) = 0; /* r3 */ |
66 |
| - *(--stk) = 0; /* r2 */ |
67 |
| - *(--stk) = 0; /* r1 */ |
68 |
| - *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */ |
| 53 | + stack_addr += sizeof(rt_uint32_t); |
| 54 | + stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8); |
| 55 | + stk = (rt_uint32_t *)stack_addr; |
69 | 56 |
|
70 |
| - /* cpsr */ |
71 |
| - if ((rt_uint32_t)tentry & 0x01) |
72 |
| - *(--stk) = SVCMODE | 0x20; /* thumb mode */ |
73 |
| - else |
74 |
| - *(--stk) = SVCMODE; /* arm mode */ |
| 57 | + *(--stk) = (rt_uint32_t)tentry; /* entry point */ |
| 58 | + *(--stk) = (rt_uint32_t)texit; /* lr */ |
| 59 | + *(--stk) = 0xdeadbeef; /* r12 */ |
| 60 | + *(--stk) = 0xdeadbeef; /* r11 */ |
| 61 | + *(--stk) = 0xdeadbeef; /* r10 */ |
| 62 | + *(--stk) = 0xdeadbeef; /* r9 */ |
| 63 | + *(--stk) = 0xdeadbeef; /* r8 */ |
| 64 | + *(--stk) = 0xdeadbeef; /* r7 */ |
| 65 | + *(--stk) = 0xdeadbeef; /* r6 */ |
| 66 | + *(--stk) = 0xdeadbeef; /* r5 */ |
| 67 | + *(--stk) = 0xdeadbeef; /* r4 */ |
| 68 | + *(--stk) = 0xdeadbeef; /* r3 */ |
| 69 | + *(--stk) = 0xdeadbeef; /* r2 */ |
| 70 | + *(--stk) = 0xdeadbeef; /* r1 */ |
| 71 | + *(--stk) = (rt_uint32_t)parameter; /* r0 : argument */ |
75 | 72 |
|
76 |
| - /* return task's current stack address */ |
77 |
| - return (rt_uint8_t *)stk; |
| 73 | + /* cpsr */ |
| 74 | + if ((rt_uint32_t)tentry & 0x01) |
| 75 | + *(--stk) = SVCMODE | 0x20; /* thumb mode */ |
| 76 | + else |
| 77 | + *(--stk) = SVCMODE; /* arm mode */ |
| 78 | + |
| 79 | + /* return task's current stack address */ |
| 80 | + return (rt_uint8_t *)stk; |
78 | 81 | }
|
79 | 82 |
|
0 commit comments