《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業界動態 > 一種嵌入式時鐘管理器的設計與實現

一種嵌入式時鐘管理器的設計與實現

2008-05-16
作者:張麗云,周洪利

  摘 要: 設計并實現了一種基于8051系列單片機的嵌入式時鐘管理器" title="管理器">管理器。該時鐘管理器提供了友好、簡潔的用戶接口,可便捷地實現定時功能。
  關鍵詞: 嵌入式 時鐘管理器 C51語言 8051單片機


  目前,在嵌入式產品的研發中,低檔微處理器軟件多采用裸機開發模式實現。在這種開發模式中,常有如下需求:
  (1)在經歷特定的時間段后,執行特定操作;
  (2)根據給定周期執行特定操作。
  傳統的作法是利用前后臺方式:設定硬件定時器,使其在后臺以特定周期對各相關操作的標志變量作計數操作;前臺則不斷對各標志變量巡回查詢,若發現標志變量達到預定值,則執行特定操作。可見,上述需求需直接操作硬件定時器實現,其過程繁瑣,且需要用戶對相關硬件有深入了解。因此,本文設計、實現了一種使用方便的低端系統時鐘管理器。
  本時鐘管理器適用于可提供至少一個硬件定時器的處理器。其為用戶提供了有益、友好的裁剪途徑,以滿足不同目標系統的實際需要。通過裁剪,該時鐘管理器的目標代碼最小可至100B以下,最大也不超過1KB。
  時鐘管理器在實現中,將與硬件密切相關的部分組成一獨立模塊(文件)。針對不同的目標系統處理器,更換該模塊即可。為使表述不過抽象,本文以8051系列單片機為目標系統處理器、C51為工具語言闡述該嵌入式時鐘管理器的設計與實現。
1 設計
  該時鐘管理器模塊(文件)結構如圖1所示。
  (1)configClk.h定義了有關系統裁剪、配置的可調參數,通過對configClk.h中相關宏參數的配置,即可實現對該時鐘管理器系統的配置和裁剪。
  (2)clk_impl.*功能模塊用來封裝目標系統的一個硬件定時器,以屏蔽不同處理器間的硬件差異,起到HAL(HardwareAbstractLayer)作用。系統時鐘在此構建。
  (3)clk.*模塊在clk_impl.*提供的HAL基礎上進一步封裝,通過一個鉤子(Hook)函數,為系統提供時鐘脈沖,且脈沖寬度可調(配置configClk.h中的相關宏參即可)。
  (4)WdLib.*模塊為用戶應用提供多個軟件定時器。
2 實現
2.1 硬件定時器的底層封裝

  硬件定時器底層封裝在圖1所示的clk_impl.*中實現。其中定義了一個初始化接口函數" title="接口函數">接口函數和一個定時器中斷的ISR(Interrupt Service Routine)。令選用的硬件時鐘為定時器0(可在configClk.h中配置)。


  (1)初始化接口函數void_clkInit(void){ }
  用戶通過調用該接口函數,可周期性地執行相應的ISR—clkTick_ISR,從而形成邏輯上的系統時鐘。另外,本接口函數不為用戶直接訪問,而在上層模塊clk.*中被調用。
  (2)定時器0的ISR—clkTick_ISR
  void clkTick_ISR (void) interrupt 1 using REG_GRP_FOR_
  SYS_CLK{ }
  其中:REG_GRP_FOR_SYS_CLK為定義于configClk.h中的可調參數,用來設定本ISR的工作寄存器組。
2.2 時鐘脈沖的提供
  時鐘脈沖在圖1所示的clk.*中實現。
  本文提供三個用戶接口函數和一個用戶可修改、但不可調用的鉤子函數(clkTick_ISR_hook僅能在clkTick_ISR中被調用)。其用戶接口聲明如下:
  extern void constructClk(void);
  extern void destructClk(void);
  extern UINT8 getClkRate(void);
  其中:constructClk用以構建系統時鐘,要使用本文所述的時鐘管理器,需首先通過調用_clkInit(定義于clk_impl.*模塊)實現對本函數的調用;destructClk用以解析業已構建的系統時鐘;getClkRate用以獲取系統當前的時鐘節拍率(即定義于configClk.h中的宏SYS_CLK_RATE的當前值)。
  clkTick_ISR_hook由系統聲明,用戶可修改其定義,其最終僅為系統作周期性調用。用戶可將自己需進行的周期性操作放于其中,后面敘述的軟件定時器的“守護”例程" title="例程">例程(wdDaemon)正是置于此處而被周期調用。由于置于其中的操作將在中斷執行,所以這些操作應盡可能簡短、省時。
2.3 軟件定時器的提供
  本功能在圖1所示的wdLib.*中實現。
  其為用戶提供了可快速、便捷地實現用戶定時需求的接口函數和一個被周期性調用的定時器守護例程wdDaemon。
  extern void constructWDOG(void);//為使用定時器系統作初始化操作
  extern void destructWDOG(void)//置定時器系統為初始態
  extern WDOG_ID wdCreate(void);//建立一個定時器,并返回其ID
  extern STATUS wdCancel(WDOG_ID wdId);//終止指定定時器并復位
  extern STATUS wdDelete(WDOG_ID wdId);//刪除指定定時器
  extern STATUS wdStart(WDOG_ID wdId,UINT16 ticks,VOIDFUNCPTR wdr);//啟動指定定時器,它會在指定時間后觸發給定操作
  其中:WDOG_ID為定時器ID類型,即UINT8。傳送給wdStart的參數“UINT16 ticks”指明定時時間長度,單位為系統時鐘節拍,1節拍=1/SYS_CLK_RATE(s)。因該參數的類型定為UINT16,故定時器的最大定時長度為216×(1/SYS_CLK_RATE),即216/SYS_CLK_RATE(s)。
  定時器的實現方案有靜態數組法和delta列表法兩種方法。這兩種方法各有優缺點:前者邏輯簡單,ROM用量小,但效率較低(與定時器數目相關);后者邏輯復雜,ROM用量大,但效率較高(與定時器數目無關)。應用中使用哪種方案,可在configClk.h中配置選擇。
2.3.1 靜態數組法
  靜態數組法的數據結構" title="數據結構">數據結構如下:
  struct wdNode {
   BOOL flag;//標明本結點是否已被使用
   UINT16 ticks;//用以定時的節拍數
   VOIDFUNCPTR rout;//定時到時需執行的操作
  } data wdList[_MAX_WDOG_NUM_];
  其中:_MAX_WDOG_NUM_指出了系統中允許的最大定時器數,其值決定于應用需求及系統資源量,可在configClk.h中設定。一個定時器結點占用5B的RAM空間。具有給定數據結構的靜態數組是方案實施的基礎。
  另外,該靜態數組作為軟件定時器的全局變量而存在,當系統中有多個定時器活動時,它們都將訪問該全局靜態數組。重要的是:它們的活動是異步的,所以,對該靜態數組(臨界資源)的訪問需作臨界保護。對于51系統,應采用開關中斷的方式實現,且應確保不會影響關中斷前的中斷狀態。
  (1)用戶接口定義
  上述用戶接口皆基于該靜態數組進行,限于篇幅,這里給出關鍵接口wdStart的定義。
  STATUS wdStart(WDOG_ID wdId,UINT16 ticks,
  VOIDFUNCPTR wdr) {
  if(wdId<_MAX_WDOG_NUM_) {
  if(wdList[wdId].flag) {//判斷給定定時器ID有效否
  RTX_ENTER_CRITICAL();//進入臨界區
  wdList[wdId].ticks=ticks;//操作靜態數組中的特定定時結點
  wdList[wdId].rout=wdr;
  RTX_EXIT_CRITICAL();//退出臨界區
  return OK;//定時器啟動成功
  }
  }
  return ERROR;//給定定時器ID無效
  }
  調用該接口函數,即可啟動已創建(wdCreate)的軟件定時器。當經歷ticks節拍后,給定函數wdr將被執行,以完成用戶的定時需求。
  (2)定時器守護例程
  定時器守護例程wdDaemon被置于前述的鉤子函數clkTick_ISR_hook中,以使其周期性執行。由于本例程自身的特點,它應作為clkTick_ISR_hook的最后一個調用函數。本例程是軟件定時器實現的核心,而其關鍵又是對系統棧的調整,為說明其實現流程,給出了如圖2所示的wdDaemon的棧(stack)結構。
  由圖2可知:wdDaemon的返回地址沒有入棧,因其為clkTick_ISR_hook中的最后一個函數調用,故其返回地址被優化掉。wdDaemon將棧頂的8B數據上移2B,然后將定時器指定函數的地址插入騰出的棧空間(2B)中。如此,該地址將會被IRET彈入IP中。由于IRET指令的執行而使中斷系統復位以重新響應外部中斷,同時也使定時器指定函數在非中斷態執行,從而不過分影響系統的響應速度。


2.3.2 delta列表法
  delta列表法僅維護有效定時器的鏈表" title="鏈表">鏈表,且鏈表中的定時器結點按定時剩余時間由小到大排列,使距timeout點最近的定時器作為鏈表的首結點。鏈表中定時器結點的順序由其獨特的結點插入算法決定:如有5個定時器,其定時長度分別為10、14、21、32和39,當其組成delta列表時,定時值最小的結點為首結點,其定時存儲值為10,而后依序排列,其定時存儲值分別為4、7、11、7,即后一個定時器的定時存儲值由自己的實際定時值與相鄰的前一個定時器的實際定時值相減而得。可見,除首結點外的所有定時器的計數操作在其插入delta列表時就已完成。因而當定時器守護例程確定timeout的定時器時,只需對首結點進行減1或刪除的操作,而不需遍歷整個列表,從而使delta列表的操作與定時器數量無關。這使delta列表法在大量定時器管理中大顯其能。
  該法在系統中實現的數據結構為一靜態雙向鏈表:
  struct wdNode {
  BOOL          flag;
  UINT16         ticks;
  VOIDFUNCPTR rout;
  UINT8         prior;
  UINT8         next;
  } idata wdList[_MAX_WDOG_NUM_];
  UINT8 headIdx; //索引首結點
  有了delta列表法的思路及其實現的數據結構,在靜態數組法具體實現的基礎上,便可得此法的具體實現。
  應用中如果目標系統ROM較小,且系統中啟用的定時器少,則用靜態數組法;若目標系統ROM較大,且系統中用到的定時器較多,則用delta列表法。
3 應用
  針對前述的嵌入式系統中的定時需求,利用定時器管理系統給出其實現代碼。
  假定“特定操作”為void specFunc(void),“特定時間段”長度為10分鐘。
  (1)在經歷特定的時間段后,執行特定操作。
  #include ″clk.h″
  #include ″wdLib.h″
  void main(void ) {
   WDOG_ID wdId;
   constructClk();constructWDOG();
   wdId=wdCreate();
   wdStart(wdId,10*ONE_MINUTE,specFunc);
  while(1);
  }
  (2)以給定周期周期性地執行特定操作。
  基于前者,只需在void specFunc(void)函數體的最后加入下述代碼即可:
  wdStart(wdId,10*ONE_MINUTE,specFunc);
  注:該給定周期為10分鐘。
  由于本時鐘管理器只需一個硬件定時器的支持,所以其具有廣泛的適用性。使用時,只需進行簡單的配置,即可為裸露的目標系統加以簡單的軟件抽象層。其友好的用戶接口有效降低了嵌入式系統的開發難度,提高了目標系統的可靠性。筆者已在實際項目中多次使用了該時鐘管理器。基于該時鐘管理器的目標系統運行穩定、可靠,從而充分說明該時鐘管理器設計的實用性和科學性。
參考文獻
1 RTX51 Tiny User′s Guide.Keil Software Inc,2001
2 蔡美琴,張為民.MCS-51系列單片機系統及其應用.北京:高等教育出版社,1992
3 Jean J.Labrosse.Embedded Systems Building Blocks.2nd Edition.R&D Books,CMP Media Inc,1999
4 Comer,Douglas.Operating System Design.The XINU Approach. Prentice-Hall Inc,1984
5 VxWorks Programmer′s Guide.Wind River,2003
6 嚴蔚敏,吳偉民.數據結構.北京:清華大學出版社,1998
7 Jean J.Labrosse.μC/OSII,The Real-Time Kernel.R&D Books,CMP Medis Inc,1999
8 湯子瀛,哲鳳屏,湯小丹.計算機操作系統.西安:西安電子科技大學出版社,1998

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美一区三区二区在线观看| 亚洲日本免费| 国产日韩欧美在线视频观看| 欧美gay视频| 久久精品91久久久久久再现| 一区二区三区日韩欧美| 亚洲高清123| 亚洲欧美高清| 激情综合中文娱乐网| 欧美日韩成人一区| 浪潮色综合久久天堂| 欧美一区二区三区视频在线观看 | 久久国产精品网站| 国产精品99久久久久久www| 亚洲区中文字幕| **性色生活片久久毛片| 国产午夜精品在线观看| 国产精品久久久久久超碰| 欧美乱妇高清无乱码| 免费高清在线一区| 欧美在线观看视频一区二区三区| 亚洲一区二区免费视频| 亚洲精品久久久久久一区二区| 欧美制服丝袜| 午夜精品久久久久久99热软件| 这里只有精品视频| 一本色道久久| 99成人免费视频| 亚洲免费久久| 99国产欧美久久久精品| 日韩视频免费观看高清完整版| 亚洲国产精品成人| 亚洲大胆视频| 亚洲第一精品福利| 亚洲国产一区二区三区在线播| 国产一区在线免费观看| 国产亚洲va综合人人澡精品| 国产伦一区二区三区色一情| 国产欧美精品日韩区二区麻豆天美| 国产精品高潮呻吟久久av无限| 欧美日韩综合在线| 国产精品成人播放| 欧美视频在线看| 欧美午夜精品一区| 国产精品毛片| 国产欧美大片| 国产亚洲一区二区精品| 国内一区二区三区| 亚洲福利视频免费观看| 国内久久精品| 亚洲成色最大综合在线| 亚洲欧洲日产国码二区| 亚洲作爱视频| 亚洲尤物在线视频观看| 午夜在线电影亚洲一区| 亚洲高清网站| 99热在这里有精品免费| 亚洲一区在线直播| 欧美一区二区在线免费观看| 久久久久国内| 欧美电影美腿模特1979在线看| 久久资源av| 欧美精品 国产精品| 欧美揉bbbbb揉bbbbb| 国产精品日本| 激情综合视频| 亚洲美女性视频| 亚洲美女中出| 亚洲欧美日韩精品久久亚洲区 | 欧美激情在线狂野欧美精品| 欧美日韩国产在线| 国产精品亚洲а∨天堂免在线| 国产精品视频导航| 国产麻豆成人精品| 曰韩精品一区二区| 99re这里只有精品6| 亚洲欧美国产va在线影院| 亚洲电影在线免费观看| 一本色道久久综合一区| 欧美在线一级va免费观看| 免费人成精品欧美精品| 国产精品magnet| 激情欧美日韩| 夜夜嗨网站十八久久| 欧美一级免费视频| 亚洲精品一级| 欧美一级精品大片| 欧美jjzz| 国产精品亚洲不卡a| 在线播放国产一区中文字幕剧情欧美| 91久久在线| 亚洲欧美在线看| 99精品国产福利在线观看免费 | 精品不卡在线| 亚洲伦理中文字幕| 欧美一级二级三级蜜桃| 一本到高清视频免费精品| 久久国产精品亚洲77777| 欧美日本三级| 国产真实精品久久二三区| 日韩午夜黄色| 亚洲高清一二三区| 午夜天堂精品久久久久| 欧美1区3d| 国产视频久久网| 中文在线不卡| 亚洲色图自拍| 欧美精品一区二区三区高清aⅴ| 激情文学一区| 久久精品人人做人人爽| 久久久久国产精品一区三寸| 国产日韩视频| 先锋影院在线亚洲| 久久成人18免费网站| 国产欧美日韩在线 | 亚洲一级在线观看| 亚洲欧美日韩高清| 国产精品露脸自拍| 亚洲午夜一级| 性欧美1819sex性高清| 国产精品久久久久久久久久ktv| 9人人澡人人爽人人精品| 夜夜嗨av一区二区三区网页| 欧美看片网站| 日韩视频在线你懂得| 宅男在线国产精品| 国产精品va在线播放| 亚洲一区二区三区四区五区黄| 亚洲欧美日本国产专区一区| 国产精品日韩欧美一区| 午夜电影亚洲| 久久亚洲午夜电影| 亚洲国产精品99久久久久久久久| 亚洲精品乱码久久久久久黑人 | 欧美日韩国产成人在线免费| 亚洲精品久久嫩草网站秘色| 一本色道久久综合亚洲精品婷婷 | 久久超碰97中文字幕| 国内精品视频在线播放| 亚洲国产小视频| 欧美精品日韩精品| 99国产精品国产精品久久| 亚洲免费人成在线视频观看| 国产精品永久免费在线| 久久国产精品色婷婷| 欧美国产丝袜视频| 夜夜精品视频一区二区| 亚洲欧美一区二区在线观看| 国产色婷婷国产综合在线理论片a| 久久激情中文| 欧美久久久久中文字幕| 一区二区三区www| 欧美中日韩免费视频| 激情五月综合色婷婷一区二区| 亚洲精品一区二区三区四区高清 | 香蕉成人伊视频在线观看| 国产三级精品三级| 亚洲激情视频在线播放| 欧美噜噜久久久xxx| 亚洲一区视频| 免费在线日韩av| 亚洲一区二区三区在线观看视频| 久久久国产精品一区二区中文| 亚洲国产一二三| 午夜日韩av| 亚洲国产精品一区二区三区| 亚洲一区国产| 伊人成人在线视频| 宅男精品视频| 国内精品久久久久影院 日本资源| 亚洲精品美女久久久久| 国产精品99免费看| 久久国产日韩| 欧美午夜精彩| 亚洲电影免费| 欧美日韩一卡| 久久精品国产一区二区电影| 欧美日韩一二三区| 亚洲国产精品久久91精品| 欧美日韩裸体免费视频| 欧美怡红院视频| 欧美日韩国产综合一区二区| 欧美一区永久视频免费观看| 欧美精品一区二区三区蜜桃 | 国产一区日韩二区欧美三区| 一本久道久久综合狠狠爱| 国产亚洲欧美一区二区| 亚洲天堂网在线观看| 亚洲第一成人在线| 欧美在线观看视频一区二区三区 | 国产精品v日韩精品| 亚洲国内精品| 国产麻豆午夜三级精品| 99精品99久久久久久宅男| 狠狠久久亚洲欧美专区| 亚洲欧美日韩在线| 99精品视频免费| 免费精品99久久国产综合精品| 亚洲一区日本| 欧美视频国产精品|