日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 工業(yè)控制 > 工業(yè)控制
[導讀] μC/OSII具有小巧、性能穩(wěn)定、開源等眾多優(yōu)點,并且μC/OSII大部分用ANSI C語言編寫,系統(tǒng)的移植非常容易。在μC/OSII I2.81及以后的版本中[2],加入了對軟件定時器的支持,使得μC/OSII操作系統(tǒng)更加完

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

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

  1  對軟件定時器的介紹

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

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

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

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

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

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

  2  對軟件定時器的改進

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

  2.1  對軟件定時器相關數(shù)據(jù)結構改進

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

  typedefstructos_tmr_call {

  OS_TMR_CALLBACKOSTmrCallback; /*回調函數(shù)*/

  void *OSTmrCallbackArg;/*回調函數(shù)指針*/

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

  } OS_TMR_CALL;

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

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

  ③ 定義定時器就緒表:

  INT8UOSTmrRdyGrp;

  INT8UOSTmrRdyTbl[OS_TMR_CFG_MAX/8 + 1];

  當定時器定時完成時,把定時器優(yōu)先級寫入就緒表,回調函數(shù)任務根據(jù)優(yōu)先級執(zhí)行回調函數(shù)。

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

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

  2.2.1  軟件定時器創(chuàng)建函數(shù)OSTmrCreate

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

  OSTmrCallbackTbl [prio].OSTmrCallback = callback;

  OSTmrCallbackTbl [prio].OSTmrCallbackArg = callback_arg;

  OSTmrCallbackTbl [prio].OSTmr = ptmr;

  2.2.2  對定時器任務OSTmr_Task的改進

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


 


圖1  OSTmr_Task的流程

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

  if (OSTmrTime == ptmr?>OSTmrMatch) {

  prio = ptmr?>OSTmrPrio;

  pfnct =OSTmrCall[prio].OSTmrCallback;

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

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

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

  }

  }

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

  函數(shù)OSTmrStop只需修改與回調函數(shù)執(zhí)行相關的部分即可,例如,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); /*發(fā)送回調函數(shù)執(zhí)行信號量*/

  }else {

  *perr = OS_ERR_TMR_NO_CALLBACK;

  }

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

  2.2.4  回調函數(shù)任務OSTmr_TaskCallback()

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

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

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

  OSSemPend(OSTmrSemCallback, 0, &err);

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

  while (OSTmrRdyGrp) {

  ……/*從定時器就緒表中得到最高優(yōu)先級的定時器回調函數(shù)*/

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

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

  pfnct = OSTmrCall[prio].OSTmrCallback;

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

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

  }

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

  }

  }

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

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

  3  實驗測試

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

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


 


圖2  軟件定時器運行界面

  經實驗測試,系統(tǒng)運行正常,定時器回調函數(shù)得到及時的執(zhí)行,系統(tǒng)實時性得到很大的提高。

  4 結語

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

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉