iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
0
IoT

玩玩 BLE系列 第 18

[Day 18] TI-RTOS 任務(Task)

上篇文章有說過,TI-RTOS有四種的執行續,
優先級由高到低分別是硬體中斷(Hwi)、軟體中斷(Swi)、任務(Task)和空閒任務(Idle Task),
現在來看一下要任務要怎麼使用。

建立多個任務(Task)讓晶片看起來能同時處理多件事情,
事實上處理器一次還是只能處理一個任務,
而其他任務則是處於其他狀態,
以下是任務可能的狀態,

  • Running 任務正在被執行,永遠都只有一個任務會處於這個狀態
  • Ready 任務已經準備好被執行,但目前處理器正在執行優先級更高的事
  • Blocked 任務進行到一半被其他優先級更高的任務或執行緒中斷
  • Terminated 任務進行到一半時被終止
  • Inactive 任務處於不活躍清單

下面程式碼介紹如何建立一個任務,

...
/* TI-RTOS 任務的標頭檔 */
#include <ti/sysbios/knl/Task.h>

/* 每個任務都用獨立的Stack, 
  * 所以要先準備一個記憶體空間來讓任務使用。
  * */
uint8_t sbcTaskStack[TASK_STACK_SIZE];

/* Task object (to be constructed) */
Task_Struct task0;

int main() {
    // Configure task
    Task_Params taskParams;

    // TI-RTOS 用來初始化 Task_Params 的API ,這邊會給部分變數預設值
    Task_Params_init(&taskParams); 
    // 有些變數沒有預設值,必須要自行設定
    taskParams.stack = sbcTaskStack; // 規劃給任務使用的Stack位址
    taskParams.stackSize = TASK_STACK_SIZE;
    taskParams.priority = TASK_PRIORITY; // 任務的優先級,數字越大代表該任務越重要

    // TI-RTOS 建立任務的API
    // 第一個參數是該任務的物件,用來建立、解除任務
    // 第二個參數是該任務的主程式,通常裡面會有一個無窮迴圈
    // 第三個參數是該任務的設定參數
    // 第四個參數是該任務的Error_Block
    Task_construct(&task0, taskFunction, &taskParams, NULL);

    // 這邊簡單理解就是系統正式跑起來了,要走到這邊,剛剛建立的任務才會被執行起來
    BIOS_start();}
}
/* 任務的主程式 */
void taskFunction(UArg arg0, UArg arg1)
{
    /* Local variables. Variables here go onto task stack!! */
    /* Run one-time code when task starts */
    while (1) /* Run loop forever (unless terminated) */
    {
        /*
         * 在這邊等待一段時間或是等待一個訊號
         *  Examples:
         *  ``Sempahore_pend()``
         *  ``Event_pend()``
         *  ``Task_sleep()``
         *
         * 按照訊號或其他需求執行相關的工作
         */
    }
}

上一篇
[Day 17] TI-RTOS 執行緒(Thread)
下一篇
[Day 19] TI-RTOS 定時器(Clock)
系列文
玩玩 BLE27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
vcc1688
iT邦新手 5 級 ‧ 2023-12-19 16:44:24

Task_construct(&task0, taskFunction, &taskParams, NULL);

taskFunction 內不知明原因 跑飛了

能用何API free掉,,再重新 Task_construct(&task0, taskFunction, &taskParams, NULL);
一次嗎?

我要留言

立即登入留言