動態

詳情 返回 返回

rtthread學習筆記系列 -- 13 線程 - 動態 詳情

@[toc]
 title=

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_delayrt_thread_delay_until delay 是相對時間,delay\_until 是絕對時間

13.5 線程超時

  • 線程定時器超時後,從掛起鏈表中移除,插入就緒鏈表中

13.6 線程退出 && 線程刪除

  • 線程退出

    • 設置線程狀態為 RT_THREAD_CLOSE
    • 從就緒鏈表中移除
    • 釋放線程資源

Add a new 評論

Some HTML is okay.