rt_hw_stack_init 函数的内部
rt_uint8_t *rt_hw_stack_init( void *tentry,
void *parameter,
rt_uint8_t *stack_add,
void *texit)
{
struct stack_frame *stack_frame;
rt_uint8_t *stk;
unsigned long i;
stk = stack_addr + sizeof(rt_uint32_t);
stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);
stk -= sizeof(struct stack_frame);
stack_frame = (struct stack_frame *)stk;
/* init all register */
for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++)
{
((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef;
}
stack_frame->exception_stack_frame.r0 = (unsigned long)parameter; /* r0:argument */
stack_frame->exception_stack_frame.r1 = 0; /* r1 */
stack_frame->exception_stack_frame.r2 = 0; /* r2 */
stack_frame->exception_stack_frame.r3 = 0; /* r3 */
stack_frame->exception_stack_frame.r12 = 0; /* r12 */
stack_frame->exception_stack_frame.lr = (unsigned long)texit; /* lr */
stack_frame->exception_stack_frame.pc = (unsigned long)tentry; /* enter point, pc */
stack_frame->exception_stack_frame.psr = 0x01000000L; /* PSR */
/* return task's current stack address */
return stk;
1、修改thread -> sp的位置
stk = stack_addr + sizeof(rt_uint32_t);
stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);
stk -= sizeof(struct stack_frame);stack_frame = (struct stack_frame *)stk;
这三句的作用是
sp从给出的栈地址开始向下移动stack_frame大小的空间
这个stack_frame是用来后面虚构栈的内容用的
2、虚构栈的内容
/* init all register */
for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++)
{
((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef;
}stack_frame->exception_stack_frame.r0 = (unsigned long)parameter; /* r0:argument */
stack_frame->exception_stack_frame.r1 = 0; /* r1 */
stack_frame->exception_stack_frame.r2 = 0; /* r2 */
stack_frame->exception_stack_frame.r3 = 0; /* r3 */
stack_frame->exception_stack_frame.r12 = 0; /* r12 */
stack_frame->exception_stack_frame.lr = (unsigned long)texit; /* lr */
stack_frame->exception_stack_frame.pc = (unsigned long)tentry; /* enter point, pc */
stack_frame->exception_stack_frame.psr = 0x01000000L; /* PSR */
把这一部分虚构出来,并赋予虚构的值。
最后实际使用的时候会把这个stack_frame部分的值填满,最后修改pc和psr寄存器的值,就可以运行线程了。
总结
rt_thread_create函数的作用:
1、分配一个rt_thread作为句柄
2、分配线程的栈
3、初始化这个栈内的参数