@
目录
- 13 线程
- 13.1 线程创建
- 13.2 线程启动
- 13.3 线程挂起
- 13.4 线程延时
- 13.5 线程超时
- 13.6 线程退出 && 线程删除

https://github.com/wdfk-prog/RT-Thread-Study
13 线程
13.1 线程创建
- 初始化上下文信息
- 将栈初始化为
#
号
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;/* 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 = (unsignedlong)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 = (unsignedlong)texit; /* lr */stack_frame->exception_stack_frame.pc = (unsignedlong)tentry; /* entry point, pc */stack_frame->exception_stack_frame.psr = 0x01000000L; /* PSR */#if USE_FPUstack_frame->flag =0;#endif /* USE_FPU *//* return task's current stack address */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,这是一个特定的值,表示默认的状态
- 初始化线程定时器
13.2 线程启动
- 上锁
- 该函数将恢复一个线程并将其放入系统就绪队列。
- 停止线程定时器
- 从挂起链表中移除,插入就绪链表中
- 解锁并调度
13.3 线程挂起
- 设置状态为挂起状态
- 等待下一次触发时挂起
13.4 线程延时
- 设置定时器超时时间并启动
- 执行一次调度安排
rt_thread_delay
和rt_thread_delay_until
delay 是相对时间,delay_until 是绝对时间
13.5 线程超时
- 线程定时器超时后,从挂起链表中移除,插入就绪链表中
13.6 线程退出 && 线程删除
- 线程退出
- 设置线程状态为
RT_THREAD_CLOSE
- 从就绪链表中移除
- 释放线程资源
- 设置线程状态为