• 正文
    • 1、前言
    • 2、介紹
    • 3、代碼示例
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

任務(wù)調(diào)度開源代碼

04/25 13:29
340
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

1、前言

通過嵌入式軟件架構(gòu)設(shè)計(jì)-任務(wù)調(diào)度了解到 MCU 的三種任務(wù)調(diào)度:前后臺(tái)順序執(zhí)行法、時(shí)間片論法和操作系統(tǒng),下面介紹一個(gè)基于時(shí)間片論法的任務(wù)調(diào)度模塊開源代碼。

2、介紹

代碼主要特點(diǎn)有:

  • 適用于裸機(jī)平臺(tái)
  • 移植簡(jiǎn)單,三個(gè)核心函數(shù),初始化、啟動(dòng)和任務(wù)調(diào)度管理
  • 可動(dòng)態(tài)地添加/刪除普通任務(wù),也能添加/刪除中斷任務(wù)
  • 普通任務(wù)具備簡(jiǎn)單的調(diào)度優(yōu)先級(jí)功能
  • 實(shí)現(xiàn)了簡(jiǎn)單的 MCU 負(fù)載率計(jì)算,根據(jù)負(fù)載率可參考評(píng)估系統(tǒng)的實(shí)時(shí)性和響應(yīng)性

實(shí)現(xiàn)思路:

  • 通過1ms定時(shí)器中斷服務(wù)函數(shù)進(jìn)行任務(wù)調(diào)度計(jì)時(shí)和任務(wù)狀態(tài)就緒切換
  • 普通任務(wù)在主循環(huán)中判斷就緒狀態(tài)并執(zhí)行,而中斷任務(wù)則在中斷服務(wù)函數(shù)中判斷就緒狀態(tài)并執(zhí)行
  • 普通任務(wù)在創(chuàng)建時(shí)會(huì)根據(jù)優(yōu)先級(jí)在普通任務(wù)列表中進(jìn)行排序,優(yōu)先級(jí)越高的函數(shù)在列表中越靠前
  • 當(dāng)正在執(zhí)行的普通任務(wù)每次執(zhí)行完畢后,都會(huì)重新從普通任務(wù)列表中從頭開始判斷狀態(tài)并執(zhí)行,從而實(shí)現(xiàn)調(diào)度優(yōu)先級(jí)功能(并非搶占式)
  • 根據(jù)普通空閑任務(wù)運(yùn)行次數(shù)和中斷空閑任務(wù)運(yùn)行次數(shù)得到 MCU 的負(fù)載率計(jì)算

3、代碼示例

源文件部分代碼如下

/**
* @brief      創(chuàng)建新的任務(wù)調(diào)度
*
* @note       任務(wù)函數(shù)不能被阻塞,盡量保證任務(wù)執(zhí)行的時(shí)間小于 1ms,且調(diào)度周期一定要大于調(diào)度函數(shù)任務(wù)耗時(shí)
* @param[in]  pfnTask 回調(diào)任務(wù)函數(shù)
* @param[in]  time    調(diào)度周期, 單位ms.
* @param[in]  priority 調(diào)度優(yōu)先級(jí) 5-250, 其他預(yù)留, 值越小, 優(yōu)先級(jí)越高
*/
void cTASK_Creat(TaskRunCB pfnTask, uint16_t time, uint8_t priority)
{
int i, j;

if (priority < 5)
{
priority = 5;
}

if (priority > 250)
{
priority = 250;
}

for (i = 0; i < CTASK_SUPPORT_NUM; i++)
{
if (sg_tTaskManage.task[i].priority < priority)
{
continue;
}

if (sg_tTaskManage.task[i].isUsed)
{
for (j = CTASK_SUPPORT_NUM - 1; j > i; j--)
{
sg_tTaskManage.task[j] = sg_tTaskManage.task[j - 1];
sg_tTaskManage.task[j - 1].isUsed = false;
}
}

sg_tTaskManage.task[i].isUsed = true;
sg_tTaskManage.task[i].isRunnig = false;
sg_tTaskManage.task[i].itvTime = time;
sg_tTaskManage.task[i].pfnTaskHook = pfnTask;
sg_tTaskManage.task[i].timer = time;
sg_tTaskManage.task[i].priority = priority;
break;
}
}
頭文件接口定義/* Exported types ----------------------------------------------------------------------------------------------------*/

typedef void (*TaskRunCB)(void);

/* Exported constants ------------------------------------------------------------------------------------------------*/
/* Exported macro ----------------------------------------------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------------------------------------------------*/

extern void cTASK_Init(void);
extern void cTASK_Remarks(void);
extern void cTASK_Start(void);

extern void cTASK_Creat(TaskRunCB pfnTask, uint16_t time, uint8_t priority);
extern void cTASK_Destory(TaskRunCB pfnTask);

extern void cTASK_IsrCreat(TaskRunCB pfnTask, uint16_t time);
extern void cTASK_IsrDestory(TaskRunCB pfnTask);

extern uint8_t cTASK_GetLoadRate(void);
extern uint32_t cTASK_GetSysTimer(void);

4、下載鏈接

下載鏈接可復(fù)制https://gitee.com/const-zpc/cTask

相關(guān)推薦