第二十一讲 任务的删除
生活随笔
收集整理的這篇文章主要介紹了
第二十一讲 任务的删除
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
任務刪除主要完成的事情:
1、從就緒列表,延時列表等里面刪除。?2、任務釋放占用的資源。
任務刪除的方式有兩種:
1、其他任務強制刪除他。2、其他任務請求一個標志位,然后這個這個任務判斷這個標志位是否有效,然后刪除自己。
?
?
刪除的時候通常會設置一個刪除回調函數,具體的資源釋放都工作會放在回調函數中。
task結構體中增加: {task->clean = (void(*)(void *))0; // 設置清理函數task->cleanParam = (void *)0; // 設置傳遞給清理函數的參數task->requestDeleteFlag = 0; // 請求刪除標記 }?
連接回調函數
tTaskSetCleanCallFunc(tTask * task,void(*clean)deleteCallBack(void *para),void *para) {task->clran=deleteCallBack;task->clranParam=para; }強制刪除指定的任務
void tTaskForceDelete (tTask * task) {uint32_t status = tTaskEnterCritical();if (task->state & TINYOS_TASK_STATE_DELAYED) {tTimeTaskRemove(task);}else if (!(task->state & TINYOS_TASK_STATE_SUSPEND)){tTaskSchedRemove(task);}// 刪除時,如果有設置清理回調函數,則調用清理函數if (task->clean) {task->clean(task->cleanParam); //調用回調函數 }if (currentTask == task) {tTaskSched();}// 退出臨界區 tTaskExitCritical(status); }請求刪除和檢查請求比較簡單,就是設置刪除標志位和檢查刪除標志位。
void tTaskRequestDelete (tTask * task) {uint32_t status = tTaskEnterCritical();task->requestDeleteFlag = 1;tTaskExitCritical(status); }uint8_t tTaskIsRequestedDelete (void) {uint8_t delete;uint32_t status = tTaskEnterCritical();delete = currentTask->requestDeleteFlag;tTaskExitCritical(status); return delete; }task運行tTaskIsRequestedDelete 后,發現有其他task刪除自己,那就會調用函數刪除自己。可以和強制刪除函數對比看,還是比較類似的。
void tTaskDeleteSelf (void) {uint32_t status = tTaskEnterCritical();// 任務在調用該函數時,必須是處于就緒狀態,不可能處于延時或掛起等其它狀態// 所以,只需要從就緒隊列中移除即可 tTaskSchedRemove(currentTask);// 刪除時,如果有設置清理函數,則調用清理函數if (currentTask->clean){currentTask->clean(currentTask->cleanParam);}// 接下來,肯定是切換到其它任務去運行 tTaskSched();tTaskExitCritical(status); }?這個例子還沒涉及到堆棧的釋放等等。
轉載于:https://www.cnblogs.com/nasduc/p/8572635.html
總結
以上是生活随笔為你收集整理的第二十一讲 任务的删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RSA加密解密简单使用
- 下一篇: HyperLedger Fabric 错