欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
適合51單片機和STM32的簡易任務調度器
[打印本頁]
作者:
李牧林
時間:
2019-9-14 18:38
標題:
適合51單片機和STM32的簡易任務調度器
這個代碼是從網上看到,經過少量修改得到的,如果有侵刪請告知。
//===========簡易任務調度器==============
#define TASK_MAX 2 //任務的數量記得匹配一下
typedef struct _TASK_COMPONENTS
{
unsigned char TaskNumber; //表示任務的編號
unsigned char Run; // 0表示任務不運行,1表示任務運行
unsigned int Timer; // 表示任務的執行間隔時間
unsigned int ItvTime; // 參數傳遞作用,數值上等于Timer
void (*TaskHook)(void); //任務函數
}TASK_COMPONENTS;
static TASK_COMPONENTS TaskComps[]= //任務的編號,從0開始
{
{0,0,1000,1000, Task1}, //因為定時器是1ms的,也就是這個任務的執行間隔時間是200ms
{1,0,10, 10, Task2}, //****按照格式可以補充你的任務****/
};
void TaskHangup(unsigned char Task_Num)//任務掛起函數,參數就是你的任務編號
{
TaskComps[Task_Num].Run=0;
}
void TaskRecovery(unsigned char Task_Num)//任務恢復函數,參數就是你的任務編號
{
TaskComps[Task_Num].Run=1;
}
void TaskRemarks(void) //放在你的定時器中斷里面 定時器需要設定1ms中斷一次
{
unsigned char i;
for (i=0; i<TASK_MAX; i++) // 逐個任務時間處理
{
if (TaskComps[i].Timer) // 時間不為0
{
TaskComps[i].Timer--; // 減去一個節拍
if ((TaskComps[i].Timer == 0) ||(TaskComps[i].Timer>0XFFF0)) // 時間減完了 [/size][/indent][size=4]//如果任務執行時間比較長,可能當時間片減到0的時候任務還在執行,然后減下去就溢出,是0XFFFF
//所以用[/size][size=4]0XFFF0[/size][size=4]這個值保證溢出的時候也能執行下面的語句
{
TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢復計時器值,從新下一次
TaskComps[i].Run = 1; // 任務可以運行
}
}
}
}
void TaskProcess(void)//放在你的while(1)循環里面
{
unsigned char i;
for (i=0; i<TASK_MAX; i++) // 逐個任務判斷是否達到執行條件
{
if (TaskComps[i].Run) // 達到執行條件
{
TaskComps[i].Run = 0; // 標志清0 把這句話放下面會出現異常 原因暫未查明
TaskComps[i].TaskHook(); // 運行任務
}
}
MCU_IDLE();//進入低功耗模式
}[/size]</font>
復制代碼
一些說明:
1、MCU_IDLE();//進入低功耗模式
32和51的低功耗函數是不一樣的,這里只是提供一種低功耗的思路,比如51低功耗函數直接操作PCON寄存器,定時器中斷會喚醒,喚醒后會執行
TaskRemarks函數,判斷任務時間是否到了,到了標志位置1。
2、
Task1等函數具體可以更換為自己的任務函數名稱,但是在這個文件內使用的話記得加extern聲明一下是外部函數。
3、這個調度器實際上就是一個定時器做事件的時間基準,建議任務函數內部的延時時間不要大于任務執行的間隔時間。因為實際的執行過程一定是任務0先執行(即使里面有長延時函數),接著執行任務1,任務2等。
總結:該調度器只是簡單按照任務次序輪詢,無法按照任務執行的間隔時間做實時切換。對于大部分對任務執行時間精確度要求不高的場合,是比較好用的。這樣的架構也會使代碼相對簡潔一些。
作者:
xieqinfu
時間:
2023-6-24 22:37
思路好像還不錯
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1