@[toc]
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_FPU
stack_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_untildelay 是相對時間,delay\_until 是絕對時間
13.5 線程超時
- 線程定時器超時後,從掛起鏈表中移除,插入就緒鏈表中
13.6 線程退出 && 線程刪除
-
線程退出
- 設置線程狀態為
RT_THREAD_CLOSE - 從就緒鏈表中移除
- 釋放線程資源
- 設置線程狀態為