|
|
剛學(xué)習(xí)單片機(jī)編程的時候,喜歡把所有的函數(shù)放到while大循環(huán)里。
代碼量少的時候還湊合,代碼量一大就不太好了。效率低。反應(yīng)慢。
后來參考下面這本書,試著寫寫。效果還可以。已經(jīng)用在很多項目產(chǎn)品里。
因為書沒辦法上傳。喜歡的自己去弄一本吧。
- #ifndef _SCH_task_
- #define _SCH_task_
- #include "STC8Hxx.H"
- #include<stdio.h>
- #define SCH_MAX_TASKS 15 //最大任務(wù)個數(shù),實際任務(wù)個數(shù)必須小于這個值
- typedef struct
- {
- void (*Ptask)(void); //函數(shù)指針
- u16 Delay; //延遲時標(biāo),第一次調(diào)度延時
- u16 Period; //調(diào)用函數(shù)周期,如果等于0,則表示任務(wù)為單次任務(wù)。只執(zhí)行一次就刪除了.
- u8 RunMe; //任務(wù)執(zhí)行標(biāo)志
- u8 Co_op; //任務(wù)類型,0合作式任務(wù),1及時型任務(wù)(在中斷函數(shù)里執(zhí)行)
- u8 State; //任務(wù)狀態(tài),使能/失能
- }sTask;
- extern sTask xdata SCH_tasks_G[SCH_MAX_TASKS]; //定義一個結(jié)構(gòu)體數(shù)組
- extern volatile u8 xdata SCH_tasks_Count; //添加成功的任務(wù)個數(shù)
- extern void SCH_Task_Init(void); //結(jié)構(gòu)體數(shù)據(jù)初始化
- extern u8 SCH_Task_Add(void (*pFunction)(void),u16 Delay,u16 Period,u8 Co_op,u8 State); //添加任務(wù)
- extern void SCH_Task_Update(void); //更新任務(wù)隊列
- extern void SCH_Task_Dispatch(void); //任務(wù)調(diào)度
- extern void SCH_Task_cmd(u8 NewState); //使能調(diào)度器,沒有函數(shù)原型。暫時不用
- extern u8 SCH_Task_NewState(void (*pFunction)(void),u8 NewState); //設(shè)置新的任務(wù)狀態(tài)
- extern u8 SCH_Task_Delete(void (*pFunction)(void)); //刪除任務(wù)
- #endif
復(fù)制代碼- //任務(wù)更新(放在中斷函數(shù)里)
- 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,那么:調(diào)度周期=時基x2
- {
- //任務(wù)需要運(yùn)行,間隔時間到了
- if(SCH_tasks_G[i].Co_op==0)
- {
- if(SCH_tasks_G[i].State==1) //判斷任務(wù)狀態(tài)是否使能
- SCH_tasks_G[i].RunMe=1; //合作式任務(wù)
- }
- else
- {
- if(SCH_tasks_G[i].State==1) //判斷任務(wù)狀態(tài)是否使能
- SCH_tasks_G[i].Ptask();//及時型立即運(yùn)行
- SCH_tasks_G[i].RunMe=0;
- if(SCH_tasks_G[i].Period == 0) //如果是單次任務(wù),則刪除
- {
- SCH_tasks_G[i].Ptask =0;
- }
- }
- if(SCH_tasks_G[i].Period != 0)
- {
- //如果不是單次任務(wù),則等待下一個調(diào)度周期
- SCH_tasks_G[i].Delay = SCH_tasks_G[i].Period;
- }
- }
- else
- {
- //如果任務(wù)還沒準(zhǔn)備好運(yùn)行,延遲減1
- SCH_tasks_G[i].Delay -= 1;
- }
- }
- }
- }
復(fù)制代碼
上圖.c和.h文件下載:
基于時間的調(diào)度器.zip
(614.59 KB, 下載次數(shù): 93)
2021-10-12 11:55 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|