日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

任务的删除

發(fā)布時(shí)間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 任务的删除 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1 任務(wù)的刪除
      • 1.1 任務(wù)刪除問(wèn)題
      • 1.2 安全刪除原理
      • 1.3 設(shè)計(jì)實(shí)現(xiàn)

1 任務(wù)的刪除

1.1 任務(wù)刪除問(wèn)題

刪除任務(wù)需要做如下兩項(xiàng)工作:

  • 將任務(wù)從所在隊(duì)列中刪除。
  • 釋放關(guān)閉占用的資源。
  • 1.2 安全刪除原理

    安全刪除方式一:設(shè)置清理回調(diào)函數(shù),在強(qiáng)制刪除時(shí)調(diào)用。

    安全刪除方式之二:設(shè)置刪除請(qǐng)求標(biāo)志,由任務(wù)自己決定何時(shí)刪除。

    兩種刪除方式的比較:

    1.3 設(shè)計(jì)實(shí)現(xiàn)

    添加刪除清理和請(qǐng)求刪除標(biāo)志位函數(shù):

    請(qǐng)求刪除函數(shù):

    檢查是否請(qǐng)求刪除函數(shù):

    刪除自己函數(shù):

    強(qiáng)制刪除函數(shù):

    關(guān)鍵代碼實(shí)現(xiàn)如下:

    /********************************************************************************************************** ** Function name : tTaskSetCleanCallFunc ** Descriptions : 設(shè)置任務(wù)被刪除時(shí)調(diào)用的清理函數(shù) ** parameters : task 待設(shè)置的任務(wù) ** parameters : clean 清理函數(shù)入口地址 ** parameters : param 傳遞給清理函數(shù)的參數(shù) ** Returned value : 無(wú) ***********************************************************************************************************/ void tTaskSetCleanCallFunc (tTask * task, void (*clean)(void * param), void * param) {task->clean = clean;task->cleanParam = param; }/********************************************************************************************************** ** Function name : tTaskForceDelete ** Descriptions : 強(qiáng)制刪除指定的任務(wù) ** parameters : task 需要?jiǎng)h除的任務(wù) ** Returned value : 無(wú) ***********************************************************************************************************/ void tTaskForceDelete (tTask * task) {// 進(jìn)入臨界區(qū)uint32_t status = tTaskEnterCritical();// 如果任務(wù)處于延時(shí)狀態(tài),則從延時(shí)隊(duì)列中刪除if (task->state & TINYOS_TASK_STATE_DELAYED) {tTimeTaskRemove(task);}// 如果任務(wù)不處于掛起狀態(tài),那么就是就緒態(tài),從就緒表中刪除else if (!(task->state & TINYOS_TASK_STATE_SUSPEND)){tTaskSchedRemove(task);}// 刪除時(shí),如果有設(shè)置清理函數(shù),則調(diào)用清理函數(shù)if (task->clean) {task->clean(task->cleanParam);}// 如果刪除的是自己,那么需要切換至另一個(gè)任務(wù),所以執(zhí)行一次任務(wù)調(diào)度if (currentTask == task) {tTaskSched();}// 退出臨界區(qū)tTaskExitCritical(status); }/********************************************************************************************************** ** Function name : tTaskRequestDelete ** Descriptions : 請(qǐng)求刪除某個(gè)任務(wù),由任務(wù)自己決定是否刪除自己 ** parameters : task 需要?jiǎng)h除的任務(wù) ** Returned value : 無(wú) ***********************************************************************************************************/ void tTaskRequestDelete (tTask * task) {// 進(jìn)入臨界區(qū)uint32_t status = tTaskEnterCritical();// 設(shè)置清除刪除標(biāo)記task->requestDeleteFlag = 1;// 退出臨界區(qū)tTaskExitCritical(status); }/********************************************************************************************************** ** Function name : tTaskIsRequestedDelete ** Descriptions : 是否已經(jīng)被請(qǐng)求刪除自己 ** parameters : 無(wú) ** Returned value : 非0表示請(qǐng)求刪除,0表示無(wú)請(qǐng)求 ***********************************************************************************************************/ uint8_t tTaskIsRequestedDelete (void) {uint8_t delete;// 進(jìn)入臨界區(qū)uint32_t status = tTaskEnterCritical();// 獲取請(qǐng)求刪除標(biāo)記delete = currentTask->requestDeleteFlag;// 退出臨界區(qū)tTaskExitCritical(status); return delete; }/********************************************************************************************************** ** Function name : tTaskDeleteSelf ** Descriptions : 刪除自己 ** parameters : 無(wú) ** Returned value : 無(wú) ***********************************************************************************************************/ void tTaskDeleteSelf (void) {// 進(jìn)入臨界區(qū)uint32_t status = tTaskEnterCritical();// 任務(wù)在調(diào)用該函數(shù)時(shí),必須是處于就緒狀態(tài),不可能處于延時(shí)或掛起等其它狀態(tài)// 所以,只需要從就緒隊(duì)列中移除即可tTaskSchedRemove(currentTask);// 刪除時(shí),如果有設(shè)置清理函數(shù),則調(diào)用清理函數(shù)if (currentTask->clean){currentTask->clean(currentTask->cleanParam);}// 接下來(lái),肯定是切換到其它任務(wù)去運(yùn)行tTaskSched();// 退出臨界區(qū)tTaskExitCritical(status); }

    參考資料:

  • 【李述銅】從0到1自己動(dòng)手寫(xiě)嵌入式操作系統(tǒng)
  • 總結(jié)

    以上是生活随笔為你收集整理的任务的删除的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。