久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5109|回復(fù): 22
收起左側(cè)

分享自己寫的基于時(shí)間調(diào)度器編程架構(gòu),擺脫大循環(huán)編程方式 C語言程序

  [復(fù)制鏈接]
ID:554500 發(fā)表于 2021-10-12 12:07 | 顯示全部樓層 |閱讀模式
剛學(xué)習(xí)單片機(jī)編程的時(shí)候,喜歡把所有的函數(shù)放到while大循環(huán)里。
代碼量少的時(shí)候還湊合,代碼量一大就不太好了。效率低。反應(yīng)慢。
后來參考下面這本書,試著寫寫。效果還可以。已經(jīng)用在很多項(xiàng)目產(chǎn)品里。
因?yàn)闀鴽]辦法上傳。喜歡的自己去弄一本吧。

55.jpg

11.jpg 22.jpg
33.jpg
44.jpg
  1. #ifndef _SCH_task_
  2. #define _SCH_task_

  3. #include "STC8Hxx.H"
  4. #include<stdio.h>


  5. #define SCH_MAX_TASKS 15  //最大任務(wù)個(gè)數(shù),實(shí)際任務(wù)個(gè)數(shù)必須小于這個(gè)值

  6. typedef struct
  7. {
  8.         void (*Ptask)(void); //函數(shù)指針
  9.         u16 Delay;        //延遲時(shí)標(biāo),第一次調(diào)度延時(shí)
  10.         u16 Period;        //調(diào)用函數(shù)周期,如果等于0,則表示任務(wù)為單次任務(wù)。只執(zhí)行一次就刪除了.
  11.         u8 RunMe;                //任務(wù)執(zhí)行標(biāo)志
  12.         u8 Co_op;                //任務(wù)類型,0合作式任務(wù),1及時(shí)型任務(wù)(在中斷函數(shù)里執(zhí)行)
  13.         u8 State;         //任務(wù)狀態(tài),使能/失能  
  14. }sTask;

  15. extern sTask xdata SCH_tasks_G[SCH_MAX_TASKS];        //定義一個(gè)結(jié)構(gòu)體數(shù)組
  16. extern volatile u8 xdata SCH_tasks_Count;        //添加成功的任務(wù)個(gè)數(shù)

  17. extern void SCH_Task_Init(void);  //結(jié)構(gòu)體數(shù)據(jù)初始化
  18. extern   u8 SCH_Task_Add(void (*pFunction)(void),u16 Delay,u16 Period,u8 Co_op,u8 State);  //添加任務(wù)
  19. extern void SCH_Task_Update(void);   //更新任務(wù)隊(duì)列
  20. extern void SCH_Task_Dispatch(void); //任務(wù)調(diào)度
  21. extern void SCH_Task_cmd(u8 NewState);  //使能調(diào)度器,沒有函數(shù)原型。暫時(shí)不用
  22. extern          u8 SCH_Task_NewState(void (*pFunction)(void),u8 NewState);  //設(shè)置新的任務(wù)狀態(tài)
  23. extern          u8 SCH_Task_Delete(void (*pFunction)(void));  //刪除任務(wù)

  24. #endif
復(fù)制代碼
  1. //任務(wù)更新(放在中斷函數(shù)里)
  2. void SCH_Task_Update()
  3. {
  4.         u8 xdata i;
  5.         for(i=0;i<SCH_tasks_Count;i++)
  6.         {
  7.                 if(SCH_tasks_G[i].Ptask!=0)
  8.                 {
  9.                         if(SCH_tasks_G[i].Delay == 1)                //如果等于0,那么:調(diào)度周期=時(shí)基x2
  10.                         {
  11.                                  //任務(wù)需要運(yùn)行,間隔時(shí)間到了
  12.                                  if(SCH_tasks_G[i].Co_op==0)
  13.                                  {
  14.                                           if(SCH_tasks_G[i].State==1)  //判斷任務(wù)狀態(tài)是否使能
  15.                                                         SCH_tasks_G[i].RunMe=1;        //合作式任務(wù)
  16.                                  }
  17.                                  else
  18.                                  {
  19.                                                 if(SCH_tasks_G[i].State==1)  //判斷任務(wù)狀態(tài)是否使能
  20.                                                         SCH_tasks_G[i].Ptask();//及時(shí)型立即運(yùn)行
  21.                                           SCH_tasks_G[i].RunMe=0;
  22.                                           if(SCH_tasks_G[i].Period == 0) //如果是單次任務(wù),則刪除
  23.                                           {
  24.                                                 SCH_tasks_G[i].Ptask =0;
  25.                                            }
  26.                                   }
  27.                                 if(SCH_tasks_G[i].Period != 0)
  28.                                 {
  29.                                         //如果不是單次任務(wù),則等待下一個(gè)調(diào)度周期
  30.                                         SCH_tasks_G[i].Delay = SCH_tasks_G[i].Period;        
  31.                                 }
  32.                         }
  33.                         else
  34.                         {
  35.                                 //如果任務(wù)還沒準(zhǔn)備好運(yùn)行,延遲減1
  36.                                  SCH_tasks_G[i].Delay -= 1;
  37.                         }
  38.                 }
  39.         }        
  40. }
復(fù)制代碼
51hei.png
上圖.c和.h文件下載: 基于時(shí)間的調(diào)度器.zip (614.59 KB, 下載次數(shù): 93)

評分

參與人數(shù) 2黑幣 +55 收起 理由
5083 + 5 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:672792 發(fā)表于 2021-10-12 18:04 | 顯示全部樓層
好文章,值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:712493 發(fā)表于 2021-10-12 23:59 來自觸屏版 | 顯示全部樓層
在讀,標(biāo)記,好文
回復(fù)

使用道具 舉報(bào)

ID:359272 發(fā)表于 2021-10-13 09:21 | 顯示全部樓層
有點(diǎn)rtos的感覺,感謝分享
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-10-13 10:02 | 顯示全部樓層
slf252 發(fā)表于 2021-10-13 09:21
有點(diǎn)rtos的感覺,感謝分享

自學(xué)的,我也不咋懂這些!參考文檔,隨便寫寫。
自我感覺思路是對的,理解能力有限。
回復(fù)

使用道具 舉報(bào)

ID:71535 發(fā)表于 2021-10-13 20:14 | 顯示全部樓層
#在這里快速回復(fù)#多謝樓主分享,學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:744327 發(fā)表于 2021-10-14 08:26 | 顯示全部樓層
樓主邏輯能力很好,值得學(xué)習(xí)一下。
回復(fù)

使用道具 舉報(bào)

ID:960619 發(fā)表于 2021-10-14 10:31 來自觸屏版 | 顯示全部樓層
這是不是就相當(dāng)用定時(shí)器延時(shí)執(zhí)行對應(yīng)需要執(zhí)行的任務(wù)
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-10-14 13:44 | 顯示全部樓層
baobao125 發(fā)表于 2021-10-14 10:31
這是不是就相當(dāng)用定時(shí)器延時(shí)執(zhí)行對應(yīng)需要執(zhí)行的任務(wù)

對的,周期性執(zhí)行。
這種方式使代碼簡潔。效率也高。代碼的可讀性也清晰。
回復(fù)

使用道具 舉報(bào)

ID:298123 發(fā)表于 2021-10-19 13:30 | 顯示全部樓層
實(shí)際項(xiàng)目不可能這樣的!
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-10-20 08:35 | 顯示全部樓層
hz_dyg 發(fā)表于 2021-10-19 13:30
實(shí)際項(xiàng)目不可能這樣的!

可以把你的見解貼出來啊。大家學(xué)習(xí)學(xué)習(xí)。
這幾年我做的項(xiàng)目都用這種方式,沒出什么問題。
也許不適合你的項(xiàng)目。把你的方法說說唄,我也想學(xué)更好的方法。
回復(fù)

使用道具 舉報(bào)

ID:313048 發(fā)表于 2021-10-20 10:01 | 顯示全部樓層
這其實(shí)就是定時(shí)器定時(shí),然后標(biāo)志位置位,while循環(huán)查詢標(biāo)志位是否true、true就去執(zhí)行該函數(shù)而已,相當(dāng)于把程序復(fù)雜化了吧,只是說這樣看起來在while里面的內(nèi)容比較少,而實(shí)際上這個(gè)里面的內(nèi)容并沒有發(fā)生比較大的變化,任務(wù)線還是只有一條。
就比如
while(1)
{
if(led_flag){ LED_show();led_flag = 0;}
else if(beep_flag){ Beep_Run();beep_flag = 0;}
...
}
timer()
{
count++;
if(count==100) led_flag = 1;
else if(count == 200) beep_flag=1;
...
}
這種方式和你的是異曲同工。

不過不得不說你這種寫的方式看起來比較舒服點(diǎn)。
慢慢來,路還很長,共同進(jìn)步。
回復(fù)

使用道具 舉報(bào)

ID:298123 發(fā)表于 2021-10-20 10:36 | 顯示全部樓層
18701931930 發(fā)表于 2021-10-20 08:35
可以把你的見解貼出來啊。大家學(xué)習(xí)學(xué)習(xí)。
這幾年我做的項(xiàng)目都用這種方式,沒出什么問題。
也許不適合你 ...

你可能做的是簡單的項(xiàng)目,沒有什么復(fù)雜功能的。簡單的項(xiàng)目,用定時(shí)器,定時(shí)器中斷記數(shù)去做任務(wù)標(biāo)記,主循環(huán)查詢?nèi)蝿?wù)標(biāo)記做相應(yīng)任務(wù)處理。稍微復(fù)雜點(diǎn)項(xiàng)目用類似tinyOS來做任務(wù),更復(fù)雜的用類似FreeRTOS或uCOS等
回復(fù)

使用道具 舉報(bào)

ID:339654 發(fā)表于 2021-10-20 15:00 | 顯示全部樓層
這本書我看過,并且跟著寫了一個(gè)調(diào)度器,并且添加了串口打印調(diào)度器工作狀態(tài)和系統(tǒng)資源使用情況
回復(fù)

使用道具 舉報(bào)

ID:908826 發(fā)表于 2021-10-20 17:23 | 顯示全部樓層
里面那個(gè)及時(shí)型是不是可以打斷合作型,或者換個(gè)問法,我沒看出來在合作型運(yùn)行的時(shí)候及時(shí)型能否打斷合作型程序的運(yùn)行。請樓主指點(diǎn)一下
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-10-20 20:20 | 顯示全部樓層
AUG 發(fā)表于 2021-10-20 10:01
這其實(shí)就是定時(shí)器定時(shí),然后標(biāo)志位置位,while循環(huán)查詢標(biāo)志位是否true、true就去執(zhí)行該函數(shù)而已,相當(dāng)于把 ...

謝謝指點(diǎn)!
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-10-20 20:22 | 顯示全部樓層
hz_dyg 發(fā)表于 2021-10-20 10:36
你可能做的是簡單的項(xiàng)目,沒有什么復(fù)雜功能的。簡單的項(xiàng)目,用定時(shí)器,定時(shí)器中斷記數(shù)去做任務(wù)標(biāo)記,主循 ...

我只是量力而行啊。
經(jīng)驗(yàn)需要慢慢積累!
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-10-20 20:26 | 顯示全部樓層
weijoyer 發(fā)表于 2021-10-20 15:00
這本書我看過,并且跟著寫了一個(gè)調(diào)度器,并且添加了串口打印調(diào)度器工作狀態(tài)和系統(tǒng)資源使用情況

書是好書,只是自己理解能力有限。
不知道這樣寫對不對。有時(shí)間的話,麻煩幫我看看。
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-10-20 20:27 | 顯示全部樓層
13205495918 發(fā)表于 2021-10-20 17:23
里面那個(gè)及時(shí)型是不是可以打斷合作型,或者換個(gè)問法,我沒看出來在合作型運(yùn)行的時(shí)候及時(shí)型能否打斷合作型程 ...

及時(shí)型是在中斷里執(zhí)行的
回復(fù)

使用道具 舉報(bào)

ID:908826 發(fā)表于 2021-10-25 08:37 | 顯示全部樓層
前輩,方便分享一下您截圖的這個(gè)工程嗎?我移植失敗,想對比一下看看是哪里的問題。
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-10-25 10:57 | 顯示全部樓層
13205495918 發(fā)表于 2021-10-25 08:37
前輩,方便分享一下您截圖的這個(gè)工程嗎?我移植失敗,想對比一下看看是哪里的問題。

已上傳!!

代碼工程文件.zip

305.23 KB, 下載次數(shù): 22, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:908826 發(fā)表于 2021-10-25 19:33 | 顯示全部樓層

謝謝前輩
回復(fù)

使用道具 舉報(bào)

ID:795427 發(fā)表于 2021-10-25 23:42 | 顯示全部樓層
學(xué)到了中心思想,學(xué)以致用。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人福利视频 | 国产成人精品一区二区三区 | 噜久寡妇噜噜久久寡妇 | 免费日韩av网站 | 久久久久网站 | 久久精品免费一区二区 | 色婷婷亚洲国产女人的天堂 | 中文字幕一二三区 | av免费网站在线 | 亚洲日韩中文字幕 | 国内精品视频在线观看 | 欧美一级免费看 | 中文字幕av亚洲精品一部二部 | 综合色播 | 久久一视频 | 一级欧美| 在线免费观看黄视频 | 久久久69| 国产一区二区三区精品久久久 | 精品久久久网站 | 91视频在线观看免费 | 日韩中文字幕一区二区三区 | 中文字幕乱码视频32 | 日韩一区二区视频 | 激情一区二区三区 | 国产色播av在线 | www日韩欧美| 欧美综合一区 | 久久精品亚洲精品国产欧美 | 国产精品一区二区av | 国产999精品久久久 日本视频一区二区三区 | 午夜免费影视 | 精品中文字幕一区 | 欧美性受 | 亚洲精品电影 | 欧美日高清视频 | 日韩在线观看一区 | 免费高潮视频95在线观看网站 | 51ⅴ精品国产91久久久久久 | 亚洲一区二区三区在线视频 | 中文字幕精品一区二区三区精品 |