剛學習單片機編程的時候,喜歡把所有的函數放到while大循環里。
代碼量少的時候還湊合,代碼量一大就不太好了。效率低。反應慢。
后來參考下面這本書,試著寫寫。效果還可以。已經用在很多項目產品里。
因為書沒辦法上傳。喜歡的自己去弄一本吧。
55.jpg (68.03 KB, 下載次數: 83)
下載附件
2021-10-12 12:02 上傳
11.jpg (207.21 KB, 下載次數: 98)
下載附件
2021-10-12 11:54 上傳
22.jpg (204.82 KB, 下載次數: 89)
下載附件
2021-10-12 11:54 上傳
33.jpg (152.25 KB, 下載次數: 68)
下載附件
2021-10-12 11:54 上傳
44.jpg (99.05 KB, 下載次數: 81)
下載附件
2021-10-12 11:54 上傳
- #ifndef _SCH_task_
- #define _SCH_task_
- #include "STC8Hxx.H"
- #include<stdio.h>
- #define SCH_MAX_TASKS 15 //最大任務個數,實際任務個數必須小于這個值
- typedef struct
- {
- void (*Ptask)(void); //函數指針
- u16 Delay; //延遲時標,第一次調度延時
- u16 Period; //調用函數周期,如果等于0,則表示任務為單次任務。只執行一次就刪除了.
- u8 RunMe; //任務執行標志
- u8 Co_op; //任務類型,0合作式任務,1及時型任務(在中斷函數里執行)
- u8 State; //任務狀態,使能/失能
- }sTask;
- extern sTask xdata SCH_tasks_G[SCH_MAX_TASKS]; //定義一個結構體數組
- extern volatile u8 xdata SCH_tasks_Count; //添加成功的任務個數
- extern void SCH_Task_Init(void); //結構體數據初始化
- extern u8 SCH_Task_Add(void (*pFunction)(void),u16 Delay,u16 Period,u8 Co_op,u8 State); //添加任務
- extern void SCH_Task_Update(void); //更新任務隊列
- extern void SCH_Task_Dispatch(void); //任務調度
- extern void SCH_Task_cmd(u8 NewState); //使能調度器,沒有函數原型。暫時不用
- extern u8 SCH_Task_NewState(void (*pFunction)(void),u8 NewState); //設置新的任務狀態
- extern u8 SCH_Task_Delete(void (*pFunction)(void)); //刪除任務
- #endif
復制代碼- //任務更新(放在中斷函數里)
- void SCH_Task_Update()
- {
- u8 xdata i;
- for(i=0;i<SCH_tasks_Count;i++)
- {
- if(SCH_tasks_G[i].Ptask!=0)
- {
- if(SCH_tasks_G[i].Delay == 1) //如果等于0,那么:調度周期=時基x2
- {
- //任務需要運行,間隔時間到了
- if(SCH_tasks_G[i].Co_op==0)
- {
- if(SCH_tasks_G[i].State==1) //判斷任務狀態是否使能
- SCH_tasks_G[i].RunMe=1; //合作式任務
- }
- else
- {
- if(SCH_tasks_G[i].State==1) //判斷任務狀態是否使能
- SCH_tasks_G[i].Ptask();//及時型立即運行
- SCH_tasks_G[i].RunMe=0;
- if(SCH_tasks_G[i].Period == 0) //如果是單次任務,則刪除
- {
- SCH_tasks_G[i].Ptask =0;
- }
- }
- if(SCH_tasks_G[i].Period != 0)
- {
- //如果不是單次任務,則等待下一個調度周期
- SCH_tasks_G[i].Delay = SCH_tasks_G[i].Period;
- }
- }
- else
- {
- //如果任務還沒準備好運行,延遲減1
- SCH_tasks_G[i].Delay -= 1;
- }
- }
- }
- }
復制代碼
51hei.png (5.41 KB, 下載次數: 87)
下載附件
2021-10-12 16:30 上傳
上圖.c和.h文件下載:
基于時間的調度器.zip
(614.59 KB, 下載次數: 93)
2021-10-12 11:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|