1. 程式人生 > 其它 >rt-thread學習1 - 執行緒

rt-thread學習1 - 執行緒

技術標籤: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 其他操作
  1. 獲取當前執行的執行緒

    rt_thread_t rt_thread_self(void);
    
    返回描述
    thread當前執行的執行緒控制代碼
    RT_NULL失敗,排程器還未啟動
  2. 讓出處理器,重新開始排程

    1. 將自己掛在執行緒佇列尾部,即有相同優先順序執行緒會切換相同優先順序執行緒,沒有才是自己

      rt_err_t rt_thread_yield(void);
      
    2. pass

  3. 執行緒掛起態固定時間後再就緒態

    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操作成功
  4. 執行緒掛起

    官方不建議使用,使用往後要手動切換執行緒(呼叫rt_schedule())

    rt_err_t rt_thread_suspend (rt_thread_t thread);
    
    引數描述
    thread執行緒控制代碼
    返回——
    RT_EOK執行緒掛起成功
    -RT_ERROR執行緒掛起失敗,因為該執行緒的狀態並不是就緒狀態
  5. 執行緒控制

    可以對執行緒進行一些控制,比如:更改優先順序

    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() 函式呼叫。

  6. 設定和刪除空閒鉤子

    空閒執行緒時會去執行一些任務,注意:不要往裡面放能掛起的東西,比如:獲取訊號量

    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刪除失敗
  7. 設定排程器鉤子

    任務切換時會執行

    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表示系統所要切換到的執行緒控制塊指標