rt-thread學習1 - 執行緒
阿新 • • 發佈:2020-12-15
技術標籤:rt-thread作業系統rtosstm32實時作業系統
rt-thread學習1 - 執行緒
1. 執行緒相關狀態
2. 執行緒相關API
執行緒相關就這幾個流程
2.1 動態執行緒建立
rt_thread_t rt_thread_create(const char* name,
void (*entry)(void* parameter),
void * parameter,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick);
引數 | 描述 |
---|---|
name | 執行緒的名稱;執行緒名稱的最大長度由 rtconfig.h 中的巨集 RT_NAME_MAX 指定,多餘部分會被自動截掉 |
entry | 執行緒入口函式 |
parameter | 執行緒入口函式引數 |
stack_size | 執行緒棧大小,單位是位元組 |
priority | 執行緒的優先順序。優先順序範圍根據系統配置情況(rtconfig.h 中的 RT_THREAD_PRIORITY_MAX 巨集定義),如果支援的是 256 級優先順序,那麼範圍是從 0~255,數值越小優先順序越高,0 代表最高優先順序,STM32支援32級 |
tick | 執行緒的時間片大小。時間片(tick)的單位是作業系統的時鐘節拍。當系統中存在相同優先順序執行緒時,這個引數指定執行緒一次排程能夠執行的最大時間長度。這個時間片執行結束時,排程器自動選擇下一個就緒態的同優先順序執行緒進行執行 |
返回 | —— |
thread | 執行緒建立成功,返回執行緒控制代碼 |
RT_NULL | 執行緒建立失敗 |
2.2 建立靜態執行緒
rt_err_t rt_thread_init(struct rt_thread* thread,
const char* name,
void (*entry)( void* parameter), void* parameter,
void* stack_start, rt_uint32_t stack_size,
rt_uint8_t priority, rt_uint32_t tick);
看到沒?只返回對錯,連控制代碼,棧地址都要你提供,動態不用啊,說好大小,我返回你控制代碼
引數 | 描述 |
---|---|
thread | 執行緒控制代碼。執行緒控制代碼由使用者提供出來,並指向對應的執行緒控制塊記憶體地址 |
name | 執行緒的名稱;執行緒名稱的最大長度由 rtconfig.h 中定義的 RT_NAME_MAX 巨集指定,多餘部分會被自動截掉 |
entry | 執行緒入口函式 |
parameter | 執行緒入口函式引數 |
stack_start | 執行緒棧起始地址 |
stack_size | 執行緒棧大小,單位是位元組。在大多數系統中需要做棧空間地址對齊(例如 ARM 體系結構中需要向 4 位元組地址對齊) |
priority | 執行緒的優先順序。優先順序範圍根據系統配置情況(rtconfig.h 中的 RT_THREAD_PRIORITY_MAX 巨集定義),如果支援的是 256 級優先順序,那麼範圍是從 0 ~ 255,數值越小優先順序越高,0 代表最高優先順序 |
tick | 執行緒的時間片大小。時間片(tick)的單位是作業系統的時鐘節拍。當系統中存在相同優先順序執行緒時,這個引數指定執行緒一次排程能夠執行的最大時間長度。這個時間片執行結束時,排程器自動選擇下一個就緒態的同優先順序執行緒進行執行 |
返回 | —— |
RT_EOK | 執行緒建立成功 |
-RT_ERROR | 執行緒建立失敗 |
2.3 刪除執行緒
這裡僅將動態執行緒改變位close態,釋放佔用的堆疊還是需要空閒執行緒來執行
rt_err_t rt_thread_delete(rt_thread_t thread);
引數 | 描述 |
---|---|
thread | 要刪除的執行緒控制代碼 |
返回 | —— |
RT_EOK | 刪除執行緒成功 |
-RT_ERROR | 刪除執行緒失敗 |
靜態執行緒是用下面這個:
rt_err_t rt_thread_detach (rt_thread_t thread);
引數 | 描述 |
---|---|
thread | 執行緒控制代碼,它應該是由 rt_thread_init 進行初始化的執行緒控制代碼。 |
返回 | —— |
RT_EOK | 執行緒脫離成功 |
-RT_ERROR | 執行緒脫離失敗 |
2.4 啟動執行緒
將剛初始化,還是初始態的執行緒改變為就緒態
rt_err_t rt_thread_startup(rt_thread_t thread);
引數 | 描述 |
---|---|
thread | 執行緒控制代碼 |
返回 | —— |
RT_EOK | 執行緒啟動成功 |
-RT_ERROR | 執行緒起動失敗 |
2.5 其他操作
-
獲取當前執行的執行緒
rt_thread_t rt_thread_self(void);
返回 描述 thread 當前執行的執行緒控制代碼 RT_NULL 失敗,排程器還未啟動 -
讓出處理器,重新開始排程
-
將自己掛在執行緒佇列尾部,即有相同優先順序執行緒會切換相同優先順序執行緒,沒有才是自己
rt_err_t rt_thread_yield(void);
-
pass
-
-
執行緒掛起態固定時間後再就緒態
rt_err_t rt_thread_sleep(rt_tick_t tick); rt_err_t rt_thread_delay(rt_tick_t tick); rt_err_t rt_thread_mdelay(rt_int32_t ms);
引數 描述 tick/ms 執行緒睡眠的時間: sleep/delay 的傳入引數 tick 以 1 個 OS Tick 為單位 ; mdelay 的傳入引數 ms 以 1ms 為單位; 返回 —— RT_EOK 操作成功 -
執行緒掛起
官方不建議使用,使用往後要手動切換執行緒(呼叫rt_schedule())
rt_err_t rt_thread_suspend (rt_thread_t thread);
引數 描述 thread 執行緒控制代碼 返回 —— RT_EOK 執行緒掛起成功 -RT_ERROR 執行緒掛起失敗,因為該執行緒的狀態並不是就緒狀態 -
執行緒控制
可以對執行緒進行一些控制,比如:更改優先順序
rt_err_t rt_thread_control(rt_thread_t thread, rt_uint8_t cmd, void* arg);
函式引數 描述 thread 執行緒控制代碼 cmd 指示控制命令 arg 控制引數 返回 —— RT_EOK 控制執行正確 -RT_ERROR 失敗 cmd命令:
-
RT_THREAD_CTRL_CHANGE_PRIORITY:動態更改執行緒的優先順序RT_THREAD_CTRL_STARTUP:開始執行一個執行緒,等同於 rt_thread_startup() 函式呼叫;
RT_THREAD_CTRL_CLOSE:關閉一個執行緒,等同於 rt_thread_delete() 函式呼叫。
-
-
設定和刪除空閒鉤子
空閒執行緒時會去執行一些任務,注意:不要往裡面放能掛起的東西,比如:獲取訊號量
rt_err_t rt_thread_idle_sethook(void (*hook)(void)); rt_err_t rt_thread_idle_delhook(void (*hook)(void));
函式引數 描述 hook 設定的鉤子函式 返回 —— RT_EOK 設定成功 -RT_EFULL 設定失敗 函式引數 描述 hook 刪除的鉤子函式 返回 —— RT_EOK 刪除成功 -RT_ENOSYS 刪除失敗 -
設定排程器鉤子
任務切換時會執行
void rt_scheduler_sethook(void (*hook)(struct rt_thread* from, struct rt_thread* to));
void hook(struct rt_thread* from, struct rt_thread* to);
函式引數 描述 from 表示系統所要切換出的執行緒控制塊指標 to 表示系統所要切換到的執行緒控制塊指標