《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > μC/OSII中軟件定時器的優缺點與改進
μC/OSII中軟件定時器的優缺點與改進
摘要: μC/OSII是一種基于優先級的搶占式操作系統,實時性很強。而系統中軟件定時器沒有優先級,回調函數順序執行,這樣就降低了系統的實時性。因此,本文對軟件定時器進行改進,定時器中加入優先級,回調函數按優先級執行,從而提高系統的實時性。
Abstract:
Key words :

     μC/OSII具有小巧、性能穩定、開源等眾多優點,并且μC/OSII大部分用ANSI C語言編寫,系統的移植非常容易。在μC/OSII I2.81及以后的版本中[2],加入了對軟件定時器的支持,使得μC/OSII操作系統更加完善。

  μC/OSII是一種基于優先級的搶占式操作系統,實時性很強。而系統中軟件定時器沒有優先級,回調函數順序執行,這樣就降低了系統的實時性。因此,本文對軟件定時器進行改進,定時器中加入優先級,回調函數按優先級執行,從而提高系統的實時性。

  1  對軟件定時器的介紹

  μC/OSII系統中的時間管理功能包括任務延時與軟件定時器,而軟件定時器的主要作用是,對函數周期性或者一次性執行的定時,利用軟件定時器控制塊與“定時器輪”管理軟件定時器。定時器控制塊的結構如同任務控制塊,創建一個定時器時,從空閑定時器控制塊鏈表中得到一個空閑控制塊,并對其賦值。

  軟件定時器也需要一個時鐘節拍驅動,而這個驅動一般是硬件實現的,一般使用μC/OSII操作系統中任務延時的時鐘節拍來驅動軟件定時器。每個時鐘節拍OSTmrCtr(全局變量,初始值為0)增1, 當OSTmrCtr的值等于為OS_TICKS_PER_SEC /OS_TMR_CFG_TICKS_PER_SEC(此兩者的商決定軟件定時器的頻率)時,調用函數OSTmrSignal(),此函數發送信號量OSTmrSemSignal(初始值為0,決定軟件定時器掃描任務OSTmr_Task的運行)。也就是說,對定時器的處理不在時鐘節拍中斷函數中進行,而是以發生信號量的方式激活任務OSTmr_Task(具有很高的優先級)。任務OSTmr_Task對定時器進行檢測處理,包括定時器定時完成的判斷、回調函數的執行。

  μC/OSII 2.86中與軟件定時器相關的函數包括:

  ① 軟件定時器內部靜態函數。獲取與釋放定時器控制塊函數OSTmr_Alloc()、OSTmr_Free();定時器插入相應“時間輪”組函數OSTmr_Link();從相應“時間輪”組中刪除定時器函數OSTmr_Unlink();軟件定時器任務初始化函數OSTmr_InitTask();定時器掃描任務OSTmr_Task;定時器上鎖與解鎖函數OSTmr_Lock()與OSTmr_Unlock()(在μC/OSII 2.91中,此兩函數被任務調度鎖定與解鎖函數代替)。

 ?、?定時器外部接口函數。定時器創建與刪除函數OSTmrCreate()、OSTmrDel();定時器啟動與停止函數OSTmrStart()、OSTmrStop();定時器剩余時間與當前狀態查詢函數OSTmrRemainGet()、OSTmrStateGet();軟件定時器的初始化OSTmr_Init();發送信號量OSTmrSemSignal函數OSTmrSignal();定時器名稱查詢函數OSTmrNameGet()。

  由于軟件定時器的回調函數的執行都是在任務OSTmr_Task中執行,如果多個定時器同時定時完成,則在定時器任務中執行多個定時器的回調函數,因此定時器任務的執行時間不確定。而且定時器回調函數是順序執行的,如果某個定時器回調函數需要盡快執行以實現精確定時,就難以實現了。由于各個定時器沒有優先級,因此了影響系統的實時性。

  2  對軟件定時器的改進

  為提高軟件定時器回調函數執行的實時性,給每個定時器賦予一個優先級。當定時完成時,并且定時器的回調函數不為空,則把定時器的優先級寫于軟件定時器就緒表中。任務OSTmr_Task對相應“時間輪”檢查結束后,如果在掃描各個定時器前軟件定時器就緒表為零而掃描之后不為零,則發送信號量激活回調函數任務OSTmr_TaskCallback。在此任務中,回調函數根據軟件定時器就緒表中的優先級執行相應的回調函數,這樣就提高了系統的實時性。

  2.1  對軟件定時器相關數據結構改進

 ?、?定義結構體OS_TMR_CALL,存儲定時器的回調函數、函數的參數、定時器指針,形式如下:

  typedefstructos_tmr_call {

  OS_TMR_CALLBACKOSTmrCallback; /*回調函數*/

  void *OSTmrCallbackArg;/*回調函數指針*/

  OS_TMR *OSTmr; /*定時器指針*/

  } OS_TMR_CALL;

  在頭文件ucos_ii.h中,定義OSTmrCallbackTbl[OS_TMR_CFG_MAX],OS_TMR_CFG_MAX表示系統中配置的軟件定時器數量。

 ?、?在軟件定時器控制塊中加入成員變量OSTmrPrio(定時器優先級),刪去變量OSTmrCallback(回調函數)、OSTmrCallbackArg(回調函數參數),為了測試的方便,可暫不刪除這兩個變量。

 ?、?定義定時器就緒表:

  INT8UOSTmrRdyGrp;

  INT8UOSTmrRdyTbl[OS_TMR_CFG_MAX/8 + 1];

  當定時器定時完成時,把定時器優先級寫入就緒表,回調函數任務根據優先級執行回調函數。

 ?、?定義信號量OSTmrSemCallback(初始值0 ),當定時完成后,發送此信號量,激活回調函數任務,以執行回調函數。

  2.2  與軟件定時器相關的函數函數與任務的改進

  2.2.1  軟件定時器創建函數OSTmrCreate

  在創建函數OSTmrCreate的參數中加入優先級參數prio。調用創建函數時,對定時器控制塊中的成員變量賦值,并給回調函數數組的相應單元賦值,形式如下:

  OSTmrCallbackTbl [prio].OSTmrCallback = callback;

  OSTmrCallbackTbl [prio].OSTmrCallbackArg = callback_arg;

  OSTmrCallbackTbl [prio].OSTmr = ptmr;

  2.2.2  對定時器任務OSTmr_Task的改進

  當有定時器定時完成,把定時器優先級寫入軟件定時器就緒表中,并根據就緒表前后的值判斷時候發送信號量OSTmrSemSignal,以激活回調函數任務。任務OSTmr_Task的流程如圖1所示。

OSTmr_Task的流程
 


圖1  OSTmr_Task的流程

  把定時器優先級寫入定時器就緒表的代碼如下所示:

  if (OSTmrTime == ptmr>OSTmrMatch) {

  prio = ptmr>OSTmrPrio;

  pfnct =OSTmrCall[prio].OSTmrCallback;

  if (pfnct != (OS_TMR_CALLBACK)0) { /*加入定時器回調函數就緒表*/

  OSTmrRdyGrp|= (INT8U)(1 《 (INT8U)(prio 》 0x03));

  OSTmrRdyTbl[prio >> 0x03]|= (INT8U)(1 《 (INT8U)(prio & 0x07));

  }

  }

  2.2.3  對定時器停止函數OSTmrStop()的修改

  函數OSTmrStop只需修改與回調函數執行相關的部分即可,例如,case OS_TMR_OPT_CALLBACK_ARG: 部分的代碼如下:

  case OS_TMR_OPT_CALLBACK_ARG:

  prio = ptmr>OSTmrPrio;

  pfnct = OSTmrCall[prio].OSTmrCallback;

  if (pfnct != (OS_TMR_CALLBACK)0) {

  ……/*prio加入定時器就緒表*/

  OSTmrCall[prio].OSTmrCallbackArg =(void *)callback_arg;

  OSSemPost(OSTmrSemCallback); /*發送回調函數執行信號量*/

  }else {

  *perr = OS_ERR_TMR_NO_CALLBACK;

  }

  而case OS_TMR_OPT_CALLBACK:部分的代碼同上,只是回調函數的參數不需要重新賦值。

  2.2.4  回調函數任務OSTmr_TaskCallback()

  在源文件tmr.c中加入回調函數任務OSTmr_TaskCallback(),根據定時器就緒表中的優先級執行相應回調函數,回調函數任務的結構如下所示:

  static voidOSTmr_TaskCallback(void *p_arg) {……/*變量定義*/

  for (;;){//請求信號量OSTmrSemCallback

  OSSemPend(OSTmrSemCallback, 0, &err);

  OSTmr_Lock();/*定時器上鎖*/

  while (OSTmrRdyGrp) {

  ……/*從定時器就緒表中得到最高優先級的定時器回調函數*/

  ……/*刪除就緒表中的占有位*/

  OSTmr_Unlock(); /*定時器上鎖*/

  pfnct = OSTmrCall[prio].OSTmrCallback;

 ?。?pfnct)((void *)(OSTmrCall[prio].OSTmr),OSTmrCall[prio].OSTmrCallbackArg); /*執行回調函數*/

  OSTmr_Lock(); /*定時器上鎖*/

  }

  OSTmr_Unlock();/*定時器解鎖*/

  }

  }

  由以上代碼可知,訪問就緒表時定時器上鎖,而執行回調函數時處于定時器解鎖狀態。如果回調函數執行時間較長,在下一個軟件定時器節拍到來時,定時器掃描任務可以得到及時的執行,當前回調函數執行完成后,可以及時得執行就緒表中最高優先級定時器的回調函數。由此可以看出,高優先級定時器的回調函數得到及時執行,系統的實時性提高。

  實驗測試發現,在回調函數任務OSTmr_TaskCallback中,使用任務調度上鎖與解鎖比使用定時器上鎖與解鎖(即信號量的請求)執行速度快一些。畢竟回調函數任務的優先級很高(一般僅次于定時器掃描任務OSTmr_Task的優先級),所以使用任務調度鎖定比定時器鎖定要好一些。當然,還可以使用開關中斷的方式對就緒表進行訪問,可以根據實際情況選擇使用哪種方式。

  3  實驗測試

  本次實驗使用軟件開發環境IAR 5.30,以基于CortexM3內核的路虎LPC1768開發板作為硬件實驗平臺[6],對實時操作系統μC/OSII 2.86進行改進。

  對改進后的操作系統進行測試,在主函數中創建一個啟動任務,在啟動任務中創建4個周期定時器(系統中“時間輪”數設為4),賦予不同優先級與定時值,每個定時器控制一個LED的閃爍,啟動這4個定時器。在啟動函數中創建4個任務,每個任務也是控制一個LED燈的閃爍(利用任務延時),之后啟動任務掛起。利用μC/OSII CSPY插件觀察各定時器的運行情況,如圖2所示。

軟件定時器運行界面
 


圖2  軟件定時器運行界面

  經實驗測試,系統運行正常,定時器回調函數得到及時的執行,系統實時性得到很大的提高。

  4 結語

  軟件定時器改進后,定時器任務的執行時間確定,僅與同時完成定時的定時器數目有關,對處于就緒表中的定時器回調函數按優先級執行,使高優先級定時器的回調函數得到及時的執行,提高了系統的實時性。

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美日韩国产专区| 香蕉久久久久久久av网站| 在线激情影院一区| 欧美极品在线观看| 国产精品素人视频| 欧美一区二区在线播放| 国产精品久久久999| 国内激情久久| 激情久久久久久久久久久久久久久久| 欧美成人激情视频免费观看| 麻豆国产va免费精品高清在线| 亚洲综合第一| 亚洲第一免费播放区| 一区二区三区国产| 亚洲国产免费看| 欧美影院午夜播放| 亚洲高清三级视频| 欧美一级片在线播放| 久久理论片午夜琪琪电影网| 国产精品自拍网站| 欧美视频二区| 性欧美暴力猛交69hd| 欧美日韩在线电影| 久久噜噜噜精品国产亚洲综合| 欧美激情在线狂野欧美精品| 国产三级欧美三级日产三级99| 欧美日韩亚洲国产一区| 欧美日韩综合视频网址| 99精品免费网| 美女视频黄 久久| 亚洲一区精品在线| 亚洲一区二区三区四区在线观看| 欧美成人一区二区三区在线观看| 亚洲天堂成人在线观看| 国产毛片精品视频| 亚洲缚视频在线观看| 国产模特精品视频久久久久| 国产一区二区三区自拍| 久久精品免费看| 欧美区在线观看| 亚洲国产精品国自产拍av秋霞| 好吊一区二区三区| 久久精品人人做人人爽电影蜜月| 亚洲精品少妇30p| 欧美sm极限捆绑bd| 国产日韩一区二区三区在线| 欧美激情一区二区久久久| 99国产精品视频免费观看| 欧美成人a视频| 国产精品视频xxxx| 国产精品久久久久久久久| 亚洲一区二区在线免费观看视频| 伊伊综合在线| 亚洲影院色在线观看免费| 狠狠色综合日日| 国产亚洲一级高清| 国产精品久久久久久久久免费桃花| 亚洲摸下面视频| 一区二区三区毛片| 国产精品亚洲激情| 国产精品综合视频| 国产精品高潮久久| 国产精品三级久久久久久电影| 欧美一区日本一区韩国一区| 国产伦精品一区二区三区在线观看| 国产一区91| 亚洲国产日韩在线一区模特| 国产精品丝袜91| 老鸭窝91久久精品色噜噜导演| 国产精品日韩欧美大师| 欧美日韩亚洲一区二| 亚洲天堂成人| 国产精品视频yy9099| 黄色成人精品网站| 亚洲高清一区二区三区| 欧美国产精品劲爆| 亚洲高清不卡| 午夜精品偷拍| 国产精品video| 欧美成人69| 国产精品无码专区在线观看| 亚洲精品国产精品乱码不99| 亚洲狼人精品一区二区三区| 国产欧美91| 国产偷自视频区视频一区二区| 欧美日本韩国一区| 欧美精品一级| 国产麻豆91精品| 欧美一区二区三区成人| 亚洲国产小视频在线观看| 欧美日韩精品一区二区| avtt综合网| 国产日本亚洲高清| 精品成人免费| 红桃视频一区| 日韩一二在线观看| 国产午夜精品视频免费不卡69堂| 先锋影院在线亚洲| 国产精品盗摄久久久| 亚洲视频欧美在线| 亚洲黄色小视频| 欧美电影免费观看| 精久久久久久久久久久| 亚洲国产91精品在线观看| 欧美有码在线观看视频| 加勒比av一区二区| 黄色成人av在线| 亚洲第一伊人| 久久视频在线免费观看| av成人动漫| 亚洲美女在线看| 亚洲一区二区视频在线观看| 亚洲欧美资源在线| 欧美高清在线精品一区| 日韩一级二级三级| 男人的天堂成人在线| 精品福利免费观看| 91久久夜色精品国产网站| 尤物精品国产第一福利三区| 国产精品一区二区你懂得| 欧美日韩亚洲一区二区三区在线| 欧美激情欧美激情在线五月| 欧美片第1页综合| 亚洲福利视频在线| 欧美久久久久中文字幕| 国内精品国语自产拍在线观看| 一本色道88久久加勒比精品| 亚洲电影毛片| 麻豆精品精品国产自在97香蕉| 黄网站免费久久| 国模精品一区二区三区色天香| 欧美黄色视屏| 欧美 日韩 国产 一区| 99在线精品免费视频九九视| 欧美专区在线播放| 最新日韩av| 久久久久五月天| 美女国内精品自产拍在线播放| 伊人夜夜躁av伊人久久| 国产精品视频xxx| 亚洲精选一区| 欧美精品国产| 亚洲第一色中文字幕| 伊人伊人伊人久久| 午夜久久一区| 欧美在线视频全部完| 国产精品日韩在线观看| 国产精品久久久久一区二区| 欧美日韩精品在线观看| 激情综合久久| 久久人人爽人人爽爽久久| 欧美有码在线视频| 国产一区在线观看视频| 在线日韩欧美| 在线看无码的免费网站| 久久久久久**毛片大全| 欧美日韩精品一区二区三区| 国产精品一级| 久久久综合视频| 亚洲图片欧美午夜| 亚洲国产精品一区二区久| 欧美午夜视频网站| 欧美亚男人的天堂| 久久精品视频免费播放| 久久久7777| 欧美日韩大片一区二区三区| 99xxxx成人网| 欧美xart系列在线观看| 欧美精品免费观看二区| 欧美日韩免费视频| 国产亚洲成av人片在线观看桃| 黑人一区二区三区四区五区| 国产精品视频最多的网站| 欧美在线一区二区三区| 久久大香伊蕉在人线观看热2| 欧美va日韩va| 亚洲精品乱码久久久久| 欧美jizzhd精品欧美喷水| 国产无遮挡一区二区三区毛片日本| 亚洲国产岛国毛片在线| 怡红院精品视频在线观看极品| 亚洲裸体俱乐部裸体舞表演av| 国产日韩欧美精品一区| 久久一区国产| 亚洲欧美日韩另类精品一区二区三区| 欧美激情精品久久久久久久变态| 久久天天躁夜夜躁狠狠躁2022| 正在播放日韩| 亚洲黄色免费| 欧美在线视频一区| 国产精品久久久999| 亚洲婷婷综合色高清在线| 黄色工厂这里只有精品| 99国产精品| 国产美女一区二区| 久久九九国产| 久久国产精品久久久久久电车| 亚洲国产精品尤物yw在线观看| 日韩网站在线看片你懂的| 亚洲免费成人av电影| 欧美日韩精品久久久| 亚洲性色视频| 亚洲永久字幕| 国产精品手机视频| 巨乳诱惑日韩免费av| 欧美日韩视频| 狠狠色狠狠色综合日日小说| 欧美性jizz18性欧美| 国产麻豆精品久久一二三| 亚洲美女少妇无套啪啪呻吟| 黄色国产精品一区二区三区| 午夜宅男久久久| 欧美乱妇高清无乱码| 韩日视频一区| 在线观看成人网| 欧美视频一区二区三区| 亚洲国产经典视频| 欧美黄污视频| 欧美激情亚洲国产| 亚洲大胆人体在线| 欧美日韩无遮挡| 久久久亚洲国产美女国产盗摄| 欧美精品午夜视频| 正在播放欧美一区| 欧美一区二区三区在线视频| 美女999久久久精品视频| 国产色视频一区| 亚洲高清久久网| 欧美日韩一区二区三区视频| 国产精品v一区二区三区| 在线一区二区三区四区| 久久亚洲精品中文字幕冲田杏梨| 亚洲欧美视频在线观看| 精品va天堂亚洲国产| 国产拍揄自揄精品视频麻豆| 老司机免费视频久久| 国产精品一区二区三区久久| 亚洲精品国产日韩| 在线观看亚洲视频| 国产精品电影网站| 久久精品一区二区三区中文字幕| 欧美激情第1页| 国内精品久久久久影院优| 国产日韩精品一区二区三区| 久久精品国产第一区二区三区| 亚洲美女精品成人在线视频| 亚洲欧美视频在线观看| 一色屋精品亚洲香蕉网站| 亚洲视频欧美在线| 国产有码在线一区二区视频| 农村妇女精品| 永久555www成人免费| 欧美一区二区三区在线播放| 中文欧美字幕免费| 亚洲国产日韩在线| 精品999久久久| 亚洲成人原创| 久久久综合精品| 欧美国产日韩a欧美在线观看| 欧美日韩精品一区| 亚洲福利小视频| 亚洲电影免费观看高清完整版在线观看| 国产麻豆精品theporn| 黄色工厂这里只有精品| 久久精品国产欧美激情| 国产精品视频免费观看www| 久久综合给合| 久久久久**毛片大全| 国外成人在线视频网站| 欧美日韩国产一级| 在线成人www免费观看视频| 欧美成人精品在线播放| 欧美日韩国产区一| 国产亚洲精品高潮| 亚洲免费黄色| 亚洲一区二区在线视频| 免费一级欧美片在线播放| 日韩午夜中文字幕| av72成人在线| 欧美精品97| 欧美日韩国产成人精品| 亚洲性图久久| 影音先锋中文字幕一区二区| 欧美精品一区二区三区很污很色的| 亚洲国产精品999| 亚洲精品国偷自产在线99热| 国产一区二区三区四区hd| 欧美激情成人在线视频| 午夜精品亚洲| aa级大片欧美三级| 亚洲素人一区二区| 欧美视频中文一区二区三区在线观看| 国产欧美1区2区3区| 噜噜噜在线观看免费视频日韩| 欧美精品一区二区三区一线天视频| 精品不卡在线| 亚洲电影自拍| 欧美国产日本韩| 一本色道久久综合亚洲精品不| 免费视频一区| 在线免费观看日本欧美| 欧美日韩亚洲视频一区| 国产欧美精品一区二区色综合| 在线日韩中文字幕| 久久久久亚洲综合| 性久久久久久久| 久久久久这里只有精品| 亚洲一区二区三区四区视频| 蜜桃av噜噜一区| 欧美成人在线网站| 欧美日韩亚洲视频| 欧美午夜久久久| 国产自产精品| 国产区在线观看成人精品| 在线欧美三区| 欧美一区二区在线播放| 亚洲视频欧洲视频| 亚洲美女中文字幕| 美女视频黄 久久| 蜜臀a∨国产成人精品| 国产一区二区无遮挡| 夜夜嗨av一区二区三区免费区| 亚洲欧洲在线观看| 久久综合久久美利坚合众国| 久久久久久黄| 夜夜嗨av一区二区三区中文字幕| 欧美午夜不卡| 亚洲小说欧美另类社区|