關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > μC/OSII中軟件定時器的優缺點與改進

        μC/OSII中軟件定時器的優缺點與改進

        作者: 時間:2011-04-18 來源:網絡 收藏

          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:部分的代碼同上,只是回調函數的參數不需要重新賦值。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 贵州省| 布尔津县| 手机| 巴青县| 城固县| 河南省| 鄂托克旗| 永嘉县| 多伦县| 兴海县| 怀柔区| 蒙自县| 田阳县| 漳浦县| 海原县| 年辖:市辖区| 察哈| 安塞县| 嫩江县| 拉萨市| 崇礼县| 新郑市| 兴业县| 高清| 闵行区| 中江县| 汉阴县| 拜泉县| 平利县| 塔城市| 辽阳市| 五台县| 姜堰市| 合肥市| 玉环县| 萝北县| 本溪| 镇安县| 登封市| 铁力市| 平泉县|