File: rtdef.h
結構#
492 | /** |
- 一些基本資料,如名字等
505 | rt_list_t list; /**< the object list */ |
- 兩條鏈:thread list、object list
507 | /* stack point and entry */ |
- stack 相關的
513 | /* error code */ |
- 狀態,下面會列出來所有可能
517 | /* priority */ |
- 與權限相關的
525 |
|
- event、sig、tick
544 | void (*cleanup)(struct rt_thread *tid); /**< cleanup function when thread exit */ |
cleanup
函數及user_data
狀態#
- 一共有 6 種狀態
471 |
File: thread.h
- 下圖為官方文本的 thread 流向圖,接著一個一個的看下去
初始化、建立 thread#
靜態記憶體管理#
功能 | 回傳值 |
---|---|
初始化 thread | RT-EOK |
*thread |
*name |
*entry |
*parameter |
---|---|---|---|
thread 本體 | 名字 | 要執行的副程式 | 副程式參數 |
*stack_start |
stack_size |
priority |
tick |
---|---|---|---|
thread 堆疊起點 | thread 堆疊大小 | 優先級 | 可執行的 tick 數 |
199 | /** |
- 透過
_rt_thread_init
完成初始化
功能 | 回傳值 |
---|---|
初始化 thread | RT_EOK |
*thread |
*name |
*entry |
*parameter |
---|---|---|---|
thread 本體 | 名字 | 要執行的副程式 | 副程式參數 |
*stack_start |
stack_size |
priority |
tick |
---|---|---|---|
thread 堆疊起點 | thread 堆疊大小 | 優先級 | 可執行的 tick 數 |
118 | static rt_err_t _rt_thread_init(struct rt_thread *thread, |
- 首先將傳入的資料填入結構
136 | /* init thread stack */ |
- 接著設定堆疊,使用
rt_hw_stack_init
來完成(根據不同 cpu 有不同的方式,rt_hw_stack_init
在 /libcpu 中針對不同的 cpu 有不同的函式宣告)
141 | /* priority init */ |
- 設定 priority 及 mask
151 | /* tick init */ |
- 最後依序完成 tick、sig、hook 等的初始化
動態記憶體管理#
功能 | 回傳值 |
---|---|
建立 thread | thread |
*name |
*entry |
*parameter |
---|---|---|
名字 | 要執行的副程式 | 副程式參數 |
*stack_start |
stack_size |
priority |
tick |
---|---|---|---|
thread 堆疊起點 | thread 堆疊大小 | 優先級 | 可執行的 tick 數 |
344 | /** |
- 首先 allocate 一塊給 thread,一塊給堆疊
- 再呼叫
_rt_thread_init
完成初始化
啟動 thread#
功能 | 回傳值 | thread |
---|---|---|
啟動 thread | RT_EOK |
欲啟動的 thread |
252 | /** |
- 設定 priority
/* calculate priority attribute */ |
- 這些參數是用來計算權限的,
scheudler
會用到
276 | RT_DEBUG_LOG(RT_DEBUG_THREAD, ("startup a thread:%s with priority:%d\n", |
- 最後將 stat 設為
RT_THREAD_SUSPEND
,再透過rt_thread_resume
來完成啟動 - 啟動完成後呼叫
rt_scheduler()
來執行一次調度
暫停、復原 thread#
功能 | 回傳值 | *thread |
---|---|---|
暫停 thread | RT-EOK |
欲暫停的 thread |
630 | /** |
- 首先將狀態修改為
RT_THREAD_SUSPEND
,接著將 thread 從 tlist 移除,結束 timer
Code: rt_thread_delay
功能 | 回傳值 | tick |
---|---|---|
延遲 thread | RT-EOK |
欲延遲的時間 |
519 | /** |
- 透過
rt_thread_sleep
實作
功能 | 回傳值 |
---|---|
使 thread 休眠 | RT-EOK |
tick |
---|
欲睡眠的時間 |
481 | /** |
復原 thread#
功能 | 回傳值 | *thread |
---|---|---|
復原 thread | RT-EOK |
欲復原的 thread |
676 | /** |
- 首先從 suspend list 移除,停止 timer,掛回去 ready list
rt_schedule_insert_thread
會將狀態修改成RT_THREAD_READY
離開、刪除 thread#
功能 | 回傳值 |
---|---|
暫停 thread | void |
81 | void rt_thread_exit(void) |
- 首先從 ready list 中移除,修改狀態為
RT_THREAD_CLOSE
,從 timer list 中移除
99 | if ((rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE) && |
- 如果為系統的 thread,且
cleanup
函式沒有被定義時,呼叫rt_object_detach
來完成移除的動作 - 否則,將 thread 插入至
rt_thread_defunct
,此鏈上面的 thread 會由 idle 清除。
刪除 thread#
動態記憶體管理#
功能 | 回傳值 | *thread |
---|---|---|
刪除 thread | RT-EOK |
欲刪除的 thread |
394 | /** |
- 如果此 thread 已經啟動過了,將此 thread 從 ready list 移除
416 | /* release thread timer */ |
- 接著將 timer 還回去,修改狀態為
RT_THREAD_CLOSE
,插入至rt_thread_defunct
靜態記憶體管理#
功能 | 回傳值 |
---|---|
刪除 thread | RT-EOK |
*thread |
---|
欲刪除的 thread |
294 | /** |
- 與 delete 不同的差在第32行
控制 thread#
功能 | 回傳值 |
---|---|
控制 thread | RT-EOK |
*thread |
cmd |
*argv |
---|---|---|
欲控制的 thread | 需執行的動作 | 伴隨動作的參數 |
549 | /** |