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

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

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亚洲国产精品_日韩亚洲一区二区
欧美国产精品一区| 国产情侣一区| 欧美在线精品免播放器视频| 在线视频免费在线观看一区二区| 亚洲欧洲精品一区二区精品久久久 | 久久精品男女| 性久久久久久久久久久久| 中文在线不卡视频| 在线午夜精品自拍| 在线亚洲欧美视频| 亚洲性夜色噜噜噜7777| 在线天堂一区av电影| 亚洲天堂成人| 亚洲一区二区视频在线观看| 亚洲一区二区三区四区五区黄| 亚洲五月婷婷| 亚洲伊人伊色伊影伊综合网| 亚洲一二三区精品| 午夜精品福利一区二区蜜股av| 亚洲免费在线精品一区| 亚洲一区二区在线| 亚洲欧美日韩综合一区| 亚洲欧美日韩另类| 欧美伊人久久| 亚洲国产成人tv| 最新成人av在线| 亚洲蜜桃精久久久久久久| 99在线|亚洲一区二区| 亚洲视频在线视频| 香蕉成人伊视频在线观看| 欧美一区高清| 久久久久久伊人| 欧美成人日本| 欧美日韩在线三级| 国产乱码精品| 激情综合自拍| 亚洲日韩欧美视频| 亚洲视频大全| 欧美制服丝袜第一页| 最新亚洲一区| 亚洲天堂av电影| 久久精品成人欧美大片古装| 可以免费看不卡的av网站| 欧美成人午夜77777| 欧美日韩一区二区在线播放| 国产精品一区二区a| 一区在线免费| 一本久久a久久免费精品不卡| 亚洲欧美久久| 亚洲电影天堂av| av不卡在线| 欧美中文在线视频| 欧美黄色一区| 国产精品视频免费| 激情一区二区三区| 99精品热视频| 欧美在线视频二区| 一区二区三区高清| 久久精品欧美日韩精品| 欧美黄色片免费观看| 国产精品夜色7777狼人| 亚洲大胆女人| 亚洲一区二区在| 亚洲精品久久久久久下一站| 亚洲欧美成人网| 麻豆国产精品777777在线| 欧美日韩一区二区三区在线| 国内精品久久久久影院色| 亚洲毛片在线免费观看| 久久aⅴ国产紧身牛仔裤| 中日韩视频在线观看| 久久久久久尹人网香蕉| 欧美日韩在线亚洲一区蜜芽| 激情综合亚洲| 亚洲欧美国产毛片在线| 99re66热这里只有精品3直播| 久久gogo国模啪啪人体图| 欧美日韩精品一区视频| 黄色成人精品网站| 亚洲特级毛片| 一本色道久久88综合日韩精品| 久久精品视频导航| 国产精品久久久久久av福利软件 | 一本久道久久综合狠狠爱| 久久精品女人的天堂av| 午夜精品免费在线| 欧美日韩国产欧| 伊人久久婷婷| 性高湖久久久久久久久| 亚洲天堂av在线免费观看| 欧美成人精品激情在线观看| 国产午夜精品视频免费不卡69堂| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 午夜久久影院| 欧美日韩精品免费看| 在线观看欧美视频| 欧美一区三区三区高中清蜜桃| 亚洲伊人一本大道中文字幕| 欧美美女视频| 亚洲第一区在线观看| 欧美一区久久| 久久av一区二区三区| 国产精品久久久久影院色老大| 亚洲精品日韩激情在线电影| 亚洲七七久久综合桃花剧情介绍| 久久av一区二区三区漫画| 国产精品久久久久影院亚瑟| 亚洲美女视频在线观看| 亚洲精品一区二区三区99| 久久一区中文字幕| 国产亚洲人成a一在线v站| 午夜精品久久久久久99热| 亚洲欧美日韩中文视频| 欧美午夜精品一区二区三区| 日韩午夜精品| 99亚洲一区二区| 欧美精品在线极品| 亚洲欧洲日本在线| 亚洲精品社区| 欧美mv日韩mv国产网站app| 精品不卡一区二区三区| 久久精品免费| 男女激情视频一区| 亚洲高清视频中文字幕| 亚洲欧洲一二三| 欧美大学生性色视频| 亚洲电影免费观看高清完整版在线观看| 欧美在线视频在线播放完整版免费观看 | 欧美久久久久免费| 最新精品在线| 夜夜狂射影院欧美极品| 欧美欧美午夜aⅴ在线观看| 亚洲老板91色精品久久| 亚洲视频在线一区| 国产精品久久久久久久第一福利 | 亚洲欧美日韩区| 国产欧美日本一区二区三区| 午夜精品久久久久久久| 久久久夜夜夜| 亚洲国内欧美| 中日韩视频在线观看| 国产精品毛片在线| 欧美亚洲综合在线| 久久久久久久激情视频| 狠狠色狠狠色综合日日tαg| 最新成人av在线| 欧美日韩国产一区二区三区地区| 一区二区三区四区五区在线| 午夜日韩电影| 国内精品伊人久久久久av一坑| 最新中文字幕亚洲| 欧美色中文字幕| 亚洲欧美在线网| 免费成人高清| 99在线精品视频在线观看| 欧美亚洲三级| 一区二区亚洲精品| 妖精成人www高清在线观看| 国产精品99免费看 | 亚洲香蕉在线观看| 亚洲小说春色综合另类电影| 欧美在线电影| 在线日韩日本国产亚洲| 99视频一区| 国产欧美一区二区三区在线看蜜臀| 亚洲国产精品久久久久秋霞蜜臀| 欧美日韩精品久久| 欧美一区二区三区精品| 欧美黑人多人双交| 亚洲欧美激情四射在线日| 男女激情视频一区| 亚洲先锋成人| 欧美sm极限捆绑bd| 亚洲资源在线观看| 欧美成人免费全部| 亚洲欧美国产不卡| 欧美护士18xxxxhd| 性色av一区二区三区红粉影视| 欧美好骚综合网| 性色一区二区三区| 欧美日韩精品一区二区三区四区| 欧美一二区视频| 欧美日韩伦理在线免费| 欧美在线免费观看视频| 欧美三级在线播放| 亚洲国产精品久久久久秋霞不卡| 国产精品豆花视频| 亚洲精品久久久久久久久久久久| 国产精品一区二区三区观看| 亚洲精品小视频在线观看| 国产亚洲精品aa| 亚洲小说欧美另类婷婷| 永久555www成人免费| 欧美一级淫片播放口| 亚洲精选一区| 久热精品在线视频| 亚洲欧美日韩综合aⅴ视频| 欧美日韩国产精品| 亚洲精品1234| 国产日韩欧美一区二区三区在线观看|