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