线程
线程创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| rt_uint8_t *rt_hw_stack_init(void *tentry,
void *parameter,
rt_uint8_t *stack_addr,
void *texit)
{
struct stack_frame *stack_frame;
rt_uint8_t *stk;
unsignedlong 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;
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 = (unsignedlong)parameter;
stack_frame->exception_stack_frame.r1 = 0;
stack_frame->exception_stack_frame.r2 = 0;
stack_frame->exception_stack_frame.r3 = 0;
stack_frame->exception_stack_frame.r12 = 0;
stack_frame->exception_stack_frame.lr = (unsignedlong)texit;
stack_frame->exception_stack_frame.pc = (unsignedlong)tentry;
stack_frame->exception_stack_frame.psr = 0x01000000L;
#if USE_FPU
stack_frame->flag =0;
#endif
return stk;
}
|
R0-R3: 这些寄存器在函数调用时通常用于传递参数。R0被设置为传入的参数,而R1到R3被初始化为0。这是因为在这个特定的上下文中,我们只需要一个参数。如果有更多的参数,它们会被放在R1,R2,和R3中。
LR (Link Register): 这个寄存器通常包含函数返回地址。LR被设置为texit,当任务完成时,它会跳转到这个地址。
PC (Program Counter): 这个寄存器包含下一条要执行的指令的地址。PC被设置为tentry,这意味着当任务开始时,它会从这个地址开始执行。
PSR (Program Status Register): 这个寄存器包含了关于程序状态的信息,如条件代码和中断禁用位。在这个函数中,PSR被设置为0x01000000L,这是一个特定的值,表示默认的状态
线程启动
上锁
该函数将恢复一个线程并将其放入系统就绪队列。
解锁并调度
线程挂起
线程延时
rt_thread_delay
和 rt_thread_delay_until
delay是相对时间,delay_until是绝对时间
线程超时
- 线程定时器超时后,从挂起链表中移除,插入就绪链表中
线程退出 && 线程删除
线程退出
- 设置线程状态为
RT_THREAD_CLOSE
- 从就绪链表中移除
- 释放线程资源