1、前言
通過嵌入式軟件架構(gòu)設(shè)計-任務(wù)調(diào)度了解到 MCU 的三種任務(wù)調(diào)度:前后臺順序執(zhí)行法、時間片論法和操作系統(tǒng),下面介紹一個基于時間片論法的任務(wù)調(diào)度模塊開源代碼。
2、介紹
代碼主要特點有:
- 適用于裸機(jī)平臺
- 移植簡單,三個核心函數(shù),初始化、啟動和任務(wù)調(diào)度管理
- 可動態(tài)地添加/刪除普通任務(wù),也能添加/刪除中斷任務(wù)
- 普通任務(wù)具備簡單的調(diào)度優(yōu)先級功能
- 實現(xiàn)了簡單的 MCU 負(fù)載率計算,根據(jù)負(fù)載率可參考評估系統(tǒng)的實時性和響應(yīng)性
實現(xiàn)思路:
- 通過1ms定時器中斷服務(wù)函數(shù)進(jìn)行任務(wù)調(diào)度計時和任務(wù)狀態(tài)就緒切換
- 普通任務(wù)在主循環(huán)中判斷就緒狀態(tài)并執(zhí)行,而中斷任務(wù)則在中斷服務(wù)函數(shù)中判斷就緒狀態(tài)并執(zhí)行
- 普通任務(wù)在創(chuàng)建時會根據(jù)優(yōu)先級在普通任務(wù)列表中進(jìn)行排序,優(yōu)先級越高的函數(shù)在列表中越靠前
- 當(dāng)正在執(zhí)行的普通任務(wù)每次執(zhí)行完畢后,都會重新從普通任務(wù)列表中從頭開始判斷狀態(tài)并執(zhí)行,從而實現(xiàn)調(diào)度優(yōu)先級功能(并非搶占式)
- 根據(jù)普通空閑任務(wù)運行次數(shù)和中斷空閑任務(wù)運行次數(shù)得到 MCU 的負(fù)載率計算
3、代碼示例
源文件部分代碼如下
/**
* @brief 創(chuàng)建新的任務(wù)調(diào)度
*
* @note 任務(wù)函數(shù)不能被阻塞,盡量保證任務(wù)執(zhí)行的時間小于 1ms,且調(diào)度周期一定要大于調(diào)度函數(shù)任務(wù)耗時
* @param[in] pfnTask 回調(diào)任務(wù)函數(shù)
* @param[in] time 調(diào)度周期, 單位ms.
* @param[in] priority 調(diào)度優(yōu)先級 5-250, 其他預(yù)留, 值越小, 優(yōu)先級越高
*/
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
閱讀全文