1、前言
通過[嵌入式軟件架構設計-任務調度]了解到 MCU 的三種任務調度:前后臺順序執行法、時間片論法和操作系統,下面介紹一個基于時間片論法的任務調度模塊開源代碼。
2、介紹
代碼主要特點有:
- 適用于裸機平臺
- 移植簡單,三個核心函數,初始化、啟動和任務調度管理
- 可動態地添加/刪除普通任務,也能添加/刪除中斷任務
- 普通任務具備簡單的調度優先級功能
- 實現了簡單的 MCU 負載率計算,根據負載率可參考評估系統的實時性和響應性
實現思路:
- 通過1ms定時器中斷服務函數進行任務調度計時和任務狀態就緒切換
- 普通任務在主循環中判斷就緒狀態并執行,而中斷任務則在中斷服務函數中判斷就緒狀態并執行
- 普通任務在創建時會根據優先級在普通任務列表中進行排序,優先級越高的函數在列表中越靠前
- 當正在執行的普通任務每次執行完畢后,都會重新從普通任務列表中從頭開始判斷狀態并執行,從而實現調度優先級功能(并非搶占式)
- 根據普通空閑任務運行次數和中斷空閑任務運行次數得到 MCU 的負載率計算
3、代碼示例
源文件部分代碼如下
/**
* @brief 創建新的任務調度
*
* @note 任務函數不能被阻塞,盡量保證任務執行的時間小于 1ms,且調度周期一定要大于調度函數任務耗時
* @param[in] pfnTask 回調任務函數
* @param[in] time 調度周期, 單位ms.
* @param[in] priority 調度優先級 5-250, 其他預留, 值越小, 優先級越高
*/
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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
mcu
+關注
關注
146文章
17148瀏覽量
351186 -
操作系統
+關注
關注
37文章
6822瀏覽量
123331 -
開源代碼
+關注
關注
0文章
36瀏覽量
2950
發布評論請先 登錄
相關推薦
FreeRTOS如何使用delay作為系統延時、任務調度
請教一個問題,最近在學習使用FreeRTOS,想像原子一樣在delay.c里添加RTOS的系統支持,即使用tick時鐘作延時。現在有幾個問題:1、在啟動任務調度器前,如果調用了delay_ms
發表于 06-10 04:37
DSO138學習型示波器的開源代碼
DLO-138是針對DSO138學習型示波器的開源代碼,如果你希望對138軟件進行修改(或者增加通道),那么基于這個工程應該是不錯的。步驟:1 準備工作下載開源代碼DLO-138:安裝arduino1.8.5(高版本可能支持stm32有問題)下載Arduino_STM32
發表于 08-06 09:23
你了解RT-Thread中的啟動任務調度時機嗎
中斷?仔細閱讀跟蹤代碼發現,在切換到第一個任務時候,使用的api是rt_hw_context_switch_to,閱讀其源代碼,可以發現在最后一句,通過恢復PC LR跳轉到目標任務,于
發表于 02-14 16:09
μC/OS-II 任務調度機制的改進
介紹μC/OS-II 任務調度機制,并提出一種改進方法,使μC/OS-II變成一個兼備實時與分時任務調度機制的操作系統; 論述改進后系統的特點和要注意的問題,給出部分
發表于 04-15 11:21
?14次下載
【開源鴻蒙】下載OpenHarmony 4.1 Release源代碼
本文介紹了如何下載開源鴻蒙(OpenHarmony)操作系統 4.1 Release版本的源代碼,該方法同樣可以用于下載OpenHarmony最新開發版本(master分支)或者4.0 Release、3.2 Release等發布版本的
評論