1、前言
通過[嵌入式軟件架構(gòu)設(shè)計-任務(wù)調(diào)度]了解到 MCU 的三種任務(wù)調(diào)度:前后臺順序執(zhí)行法、時間片論法和操作系統(tǒng),下面介紹一個基于時間片論法的任務(wù)調(diào)度模塊開源代碼。
2、介紹
代碼主要特點(diǎn)有:
- 適用于裸機(jī)平臺
- 移植簡單,三個核心函數(shù),初始化、啟動和任務(wù)調(diào)度管理
- 可動態(tài)地添加/刪除普通任務(wù),也能添加/刪除中斷任務(wù)
- 普通任務(wù)具備簡單的調(diào)度優(yōu)先級功能
- 實(shí)現(xiàn)了簡單的 MCU 負(fù)載率計算,根據(jù)負(fù)載率可參考評估系統(tǒng)的實(shí)時性和響應(yīng)性
實(shí)現(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í)行,從而實(shí)現(xiàn)調(diào)度優(yōu)先級功能(并非搶占式)
- 根據(jù)普通空閑任務(wù)運(yùn)行次數(shù)和中斷空閑任務(wù)運(yùn)行次數(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
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
mcu
+關(guān)注
關(guān)注
146文章
17915瀏覽量
362588 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7122瀏覽量
125258 -
開源代碼
+關(guān)注
關(guān)注
0文章
37瀏覽量
3175
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦

基于OMPL的運(yùn)動規(guī)劃介紹與教程_ROS_開源代碼1 #開源代碼
機(jī)器人開源硬件源代碼代碼控制算法開源代碼
薪盡火傳
發(fā)布于 :2022年08月24日 16:28:03

基于OMPL的運(yùn)動規(guī)劃介紹與教程_ROS_開源代碼 2#開源代碼
機(jī)器人開源硬件源代碼代碼控制算法開源代碼
薪盡火傳
發(fā)布于 :2022年08月24日 16:28:41

基于OMPL的運(yùn)動規(guī)劃介紹與教程_ROS_開源代碼3 #開源代碼
機(jī)器人開源硬件源代碼代碼控制算法開源代碼
薪盡火傳
發(fā)布于 :2022年08月24日 16:29:46

基于OMPL的運(yùn)動規(guī)劃介紹與教程_ROS_開源代碼4 #開源代碼
機(jī)器人開源硬件源代碼代碼控制算法開源代碼
薪盡火傳
發(fā)布于 :2022年08月24日 16:29:51
簡單的任務(wù)調(diào)度代碼
通過定時器節(jié)拍控制任務(wù)執(zhí)行周期,此代碼的中斷函數(shù)時AVR的簡單的任務(wù)調(diào)度.rar (2.4 KB )
發(fā)表于 06-12 04:35
FreeRTOS如何使用delay作為系統(tǒng)延時、任務(wù)調(diào)度
請教一個問題,最近在學(xué)習(xí)使用FreeRTOS,想像原子一樣在delay.c里添加RTOS的系統(tǒng)支持,即使用tick時鐘作延時?,F(xiàn)在有幾個問題:1、在啟動任務(wù)調(diào)度器前,如果調(diào)用了delay_ms
發(fā)表于 06-10 04:37
DSO138學(xué)習(xí)型示波器的開源代碼
DLO-138是針對DSO138學(xué)習(xí)型示波器的開源代碼,如果你希望對138軟件進(jìn)行修改(或者增加通道),那么基于這個工程應(yīng)該是不錯的。步驟:1 準(zhǔn)備工作下載開源代碼DLO-138:安裝arduino1.8.5(高版本可能支持stm32有問題)下載Arduino_STM32
發(fā)表于 08-06 09:23
調(diào)度器的原理及其任務(wù)調(diào)度代碼實(shí)現(xiàn)
、超級循環(huán)2、時間片與時標(biāo)3、調(diào)度算法介紹1)時間片輪轉(zhuǎn)調(diào)度2)強(qiáng)制試調(diào)度4、注意事項所有任務(wù)的執(zhí)行時間不能超過時標(biāo)的時間三、任務(wù)
發(fā)表于 02-17 07:07
你了解RT-Thread中的啟動任務(wù)調(diào)度時機(jī)嗎
中斷?仔細(xì)閱讀跟蹤代碼發(fā)現(xiàn),在切換到第一個任務(wù)時候,使用的api是rt_hw_context_switch_to,閱讀其源代碼,可以發(fā)現(xiàn)在最后一句,通過恢復(fù)PC LR跳轉(zhuǎn)到目標(biāo)任務(wù),于
發(fā)表于 02-14 16:09
μC/OS-II 任務(wù)調(diào)度機(jī)制的改進(jìn)
介紹μC/OS-II 任務(wù)調(diào)度機(jī)制,并提出一種改進(jìn)方法,使μC/OS-II變成一個兼?zhèn)鋵?shí)時與分時任務(wù)調(diào)度機(jī)制的操作系統(tǒng); 論述改進(jìn)后系統(tǒng)的特點(diǎn)和要注意的問題,給出部分
發(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ā)布版本的

評論