1、前言
通過[嵌入式軟件架構設計-任務調度]了解到 MCU 的三種任務調度:前后臺順序執(zhí)行法、時間片論法和操作系統(tǒng),下面介紹一個基于時間片論法的任務調度模塊開源代碼。
2、介紹
代碼主要特點有:
- 適用于裸機平臺
- 移植簡單,三個核心函數(shù),初始化、啟動和任務調度管理
- 可動態(tài)地添加/刪除普通任務,也能添加/刪除中斷任務
- 普通任務具備簡單的調度優(yōu)先級功能
- 實現(xiàn)了簡單的 MCU 負載率計算,根據負載率可參考評估系統(tǒng)的實時性和響應性
實現(xiàn)思路:
- 通過1ms定時器中斷服務函數(shù)進行任務調度計時和任務狀態(tài)就緒切換
- 普通任務在主循環(huán)中判斷就緒狀態(tài)并執(zhí)行,而中斷任務則在中斷服務函數(shù)中判斷就緒狀態(tài)并執(zhí)行
- 普通任務在創(chuàng)建時會根據優(yōu)先級在普通任務列表中進行排序,優(yōu)先級越高的函數(shù)在列表中越靠前
- 當正在執(zhí)行的普通任務每次執(zhí)行完畢后,都會重新從普通任務列表中從頭開始判斷狀態(tài)并執(zhí)行,從而實現(xiàn)調度優(yōu)先級功能(并非搶占式)
- 根據普通空閑任務運行次數(shù)和中斷空閑任務運行次數(shù)得到 MCU 的負載率計算
3、代碼示例
源文件部分代碼如下
/**
* @brief 創(chuàng)建新的任務調度
*
* @note 任務函數(shù)不能被阻塞,盡量保證任務執(zhí)行的時間小于 1ms,且調度周期一定要大于調度函數(shù)任務耗時
* @param[in] pfnTask 回調任務函數(shù)
* @param[in] time 調度周期, 單位ms.
* @param[in] priority 調度優(yōu)先級 5-250, 其他預留, 值越小, 優(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、下載鏈接
下載鏈接可復制
https://gitee.com/const-zpc/cTask
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
mcu
+關注
關注
146文章
17846瀏覽量
360540 -
操作系統(tǒng)
+關注
關注
37文章
7095瀏覽量
124964 -
開源代碼
+關注
關注
0文章
37瀏覽量
3157
發(fā)布評論請先 登錄
相關推薦
熱點推薦




FreeRTOS如何使用delay作為系統(tǒng)延時、任務調度
請教一個問題,最近在學習使用FreeRTOS,想像原子一樣在delay.c里添加RTOS的系統(tǒng)支持,即使用tick時鐘作延時?,F(xiàn)在有幾個問題:1、在啟動任務調度器前,如果調用了delay_ms
發(fā)表于 06-10 04:37
DSO138學習型示波器的開源代碼
DLO-138是針對DSO138學習型示波器的開源代碼,如果你希望對138軟件進行修改(或者增加通道),那么基于這個工程應該是不錯的。步驟:1 準備工作下載開源代碼DLO-138:安裝arduino1.8.5(高版本可能支持stm32有問題)下載Arduino_STM32
發(fā)表于 08-06 09:23
調度器的原理及其任務調度代碼實現(xiàn)
、超級循環(huán)2、時間片與時標3、調度算法介紹1)時間片輪轉調度2)強制試調度4、注意事項所有任務的執(zhí)行時間不能超過時標的時間三、任務
發(fā)表于 02-17 07:07
你了解RT-Thread中的啟動任務調度時機嗎
中斷?仔細閱讀跟蹤代碼發(fā)現(xiàn),在切換到第一個任務時候,使用的api是rt_hw_context_switch_to,閱讀其源代碼,可以發(fā)現(xiàn)在最后一句,通過恢復PC LR跳轉到目標任務,于
發(fā)表于 02-14 16:09
μC/OS-II 任務調度機制的改進
介紹μC/OS-II 任務調度機制,并提出一種改進方法,使μC/OS-II變成一個兼?zhèn)鋵崟r與分時任務調度機制的操作系統(tǒng); 論述改進后系統(tǒng)的特點和要注意的問題,給出部分
發(fā)表于 04-15 11:21
?14次下載
【開源鴻蒙】下載OpenHarmony 4.1 Release源代碼
本文介紹了如何下載開源鴻蒙(OpenHarmony)操作系統(tǒng) 4.1 Release版本的源代碼,該方法同樣可以用于下載OpenHarmony最新開發(fā)版本(master分支)或者4.0 Release、3.2 Release等發(fā)布版本的

評論