AT91RM9200平臺(tái)的輔助時(shí)鐘研究
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在VxWorlks中,定時(shí)器機(jī)制的實(shí)現(xiàn)是建立在時(shí)鐘基礎(chǔ)之上的??筛鶕?jù)不同的要求選用不同的定時(shí)機(jī)制,如taskDelay()、WatchDog、輔助時(shí)鐘。前兩種定時(shí)都是基于系統(tǒng)時(shí)鐘的。
taskDelay()是最簡(jiǎn)單的延時(shí)方法。它的單位是tick,所以其延時(shí)精度并不高,但對(duì)于延時(shí)10 ms以上的系統(tǒng)足夠了。利用taskDelay(),可以將調(diào)用的任務(wù)從就緒態(tài)轉(zhuǎn)到睡眠態(tài),但是不能用于中斷服務(wù)程序中。另外,可以通過調(diào)用taskDelay(0),將CPU交給系統(tǒng)中其他相同優(yōu)先級(jí)的任務(wù)。
看門狗定時(shí)器作為系統(tǒng)時(shí)鐘中斷服務(wù)程序的一部分來維護(hù)。因此,與看門狗定時(shí)器相聯(lián)系的函數(shù)運(yùn)行在系統(tǒng)時(shí)鐘中斷級(jí),延時(shí)單位為tick。如果應(yīng)用程序需要多個(gè)看門狗函數(shù),則可使用wdCreate()為每個(gè)需求產(chǎn)生獨(dú)立的看門狗ID,因?yàn)閷?duì)于給定的看門狗ID,只有最近的wdStart()有效。利用看門狗定時(shí)器,調(diào)用的任務(wù)不會(huì)被阻塞,因?yàn)閣dStart()調(diào)用是立即返回的。但它也一般只適用于延時(shí)10ms以上的系統(tǒng)。
如果在實(shí)際時(shí)需要更高精度的定時(shí)(如1 ms),那么采用輔助時(shí)鐘就是非??扇〉囊环N方法。一般在VxWorks系統(tǒng)的BSP中,都沒有配置輔助時(shí)鐘,本文詳細(xì)介紹輔助時(shí)鐘的配置及使用方法,以便在實(shí)際中靈活運(yùn)用。
1 AT91RM9200工業(yè)平臺(tái)的時(shí)鐘和定時(shí)器
本文的研究是基于AT91RM9200工業(yè)平臺(tái)的,因此首先需要對(duì)此平臺(tái)下的時(shí)鐘及定時(shí)器進(jìn)行介紹。
AT91RM9200提供了2個(gè)3通道16位定時(shí)器/計(jì)數(shù)器(TC)。3個(gè)通道雖然獨(dú)立,但操作相同,每個(gè)通道均為用戶可配置,包括3個(gè)外部時(shí)鐘輸入(XC0、XCl或XC2),5個(gè)內(nèi)部時(shí)鐘輸入(TIMER_CLOCKl、TIMER_CLOCK2、TIMER CLOCK3、TIMER_CL0CK4、TIMER_CLOCK5),以及2個(gè)可由用戶配置的多功能輸入/輸出信號(hào)。另外,每個(gè)通道可工作在兩種不同模式下,即捕獲模式和波形模式。其中,捕獲模式提供信號(hào)測(cè)量,波形模式用來產(chǎn)生波形,可由TC通道模式寄存器的WAVE位編程設(shè)定。定時(shí)器/計(jì)數(shù)器框圖如圖1所示。
其中,如果選擇通道信號(hào)時(shí),XCO、XCl、XC2表示3個(gè)外部時(shí)鐘輸入;TIOA、TIOB表示作用于每個(gè)通道的2個(gè)多功能輸入/輸出信號(hào);INT表示中斷信號(hào)輸出;SYNC表示同步輸入信號(hào)。如果選擇塊信號(hào)時(shí),TCLKO、TCLKl、TCLK2表示3個(gè)外部時(shí)鐘輸入;TIOAO~TIOA2,表示通道0~2的TIOA信號(hào),TIOB0~TIOB2表示通道0~2的TI0B信號(hào)。
其中,5個(gè)內(nèi)部時(shí)鐘輸入與主時(shí)鐘(MCK)、慢速時(shí)鐘(SLCK)及主時(shí)鐘分頻后時(shí)鐘相關(guān),如表1所列。
2 在VxWorks中輔助時(shí)鐘的配置
在VxWorks操作系統(tǒng)中如果要使用輔助時(shí)鐘,必須經(jīng)過一定的配置才能使用。首先,需要在Vxworks組件或config.h中進(jìn)行定義:
#define INCLUDE_AUX_CLK
如果不定義,那么輔助時(shí)鐘是無法使用的。另外,在sysLib.C的sysHwlnit2函數(shù)中需要進(jìn)行輔助時(shí)鐘的初始化,即中斷連接配置:
(void)intConnect(AUX_TIMER_INT_VEC,sysAuxClkInt,O)
輔助時(shí)鐘和系統(tǒng)時(shí)鐘的區(qū)別是:輔助時(shí)鐘必須由用戶提供ISR,但不允許在ISR中調(diào)用tickAnnounce(),否則會(huì)擾亂系統(tǒng)時(shí)鐘的機(jī)制。
輔助時(shí)鐘的配置可以按照installDir/target/drv/tim—er/templateTimer.C中的函數(shù)模板來進(jìn)行修改,在本文中使用的驅(qū)動(dòng)程序是At91Rm9200timer.c,頭文件為At91Rm9200timer.h。在此文件中進(jìn)行的修改需要根據(jù)所依賴的具體芯片來進(jìn)行,即需要參考AT91RM9200芯片數(shù)據(jù)手冊(cè)。
與輔助時(shí)鐘相關(guān)的函數(shù)有:sysAuxClkInt()、sysAux—ClkConnect()、sysAuxClkDisable()、sysAuxClkEnable()、sysAuxClkRateGet()和sysAuxClkRateSet()。其中,sysAuxClkRateGet()可以和sysAuxClkRateSet()視為一組。sysAuxClkRateGet()是通過sysAuxClkRateSet()函數(shù)設(shè)定的時(shí)鐘頻率進(jìn)行讀取的,而sysAuxClkRateSet()函數(shù)中時(shí)鐘頻率的設(shè)定則受AUX_CLK_RATE_MIN和AUX_CLK_RATE_MAX的限制。這個(gè)最大值和最小值需要進(jìn)行定義,定義的位置可能不同,有的放在eonfig.h中,有的放在bsp.h中,本文的最大值和最小值放在Inte—grator.h中定義。接下來需要重點(diǎn)討論的是sysAux-ClkInt()和sysAuxClkEnabel()這兩個(gè)函數(shù)。
sysAuxClkInt()函數(shù)調(diào)用用戶定義的中斷處理函數(shù),而用戶調(diào)用的中斷處理函數(shù)是由sysAuxClkConnect()函數(shù)來連接的。在調(diào)用中斷處理函數(shù)之前,一定要先進(jìn)行清除中斷操作,如:
AMBA_TIMER_READ(AMBA_TIMER_T2SR(AMBA_TIMER_BASE),temp);
不然,CPU將一直陷入中斷,不能做別的事情了。
其他大量的工作都是放在sysAuxClkEnble()函數(shù)中進(jìn)行的。根據(jù)AT91RM9200的具體情況,選擇5個(gè)內(nèi)部時(shí)鐘的其中之一,在此選擇TIMER_CLOCK2;根據(jù)前面所提到的通道概念,選取第2個(gè)通道。必須和系統(tǒng)時(shí)鐘區(qū)分開,不能同時(shí)選擇一個(gè)內(nèi)部時(shí)鐘和同一個(gè)通道。
首先,需要判斷電源管理對(duì)輔助時(shí)鐘是否進(jìn)行了配置,可以查看相關(guān)文件。如果沒有進(jìn)行配置,則需要如進(jìn)行如下配置:
AT9l_SYS→PMC_PCER=l<<AT9lC_ID_TCl;
其次,必須先對(duì)AIC編程,再配置TC。
然后,需要對(duì)具體的寄存器進(jìn)行控制操作,首先需要選擇內(nèi)部時(shí)鐘,如圖2所示。
對(duì)通道模式寄存器進(jìn)行控制:
AMBA_TIMER_WRITE(AMBA_TIMER_T2MR(AMBA_TIMER_BASE),TIMER_CLOCK2| TC_CPCTRG);
通過TCCLKS位選擇第2個(gè)內(nèi)部時(shí)鐘,并根據(jù)寫入RC寄存器的定時(shí)器值進(jìn)行RC比較觸發(fā)使能。同時(shí),需要對(duì)TC通道控制寄存器進(jìn)行控制,寫入計(jì)數(shù)器時(shí)鐘使能命令和軟件觸發(fā)命令,如:
AMBA_TIMER_WRITE(AMBA_TIMER_T2CR(AMBA_TIMER_BASE),TC_CLKEN);
AMBA_TIMER_WRITE(AMBA_TIMER_T2CR(AMBA_TIMER_BASE),TC_SWTRG);
另外,由于采用RC寄存器觸發(fā)使能,因此還需要對(duì)TC中斷使能寄存器進(jìn)行控制,寫入RC比較中斷使能信號(hào),如:
AMBA_TIMER_WRITE(AMBA_TIMER_T2IER(AMBA_TIMER_BASE),TC_CPCS);
最后,需要執(zhí)行中斷使能操作,如:
AMBA_TIMER_INT_ENABLE(AUX_TIMER_INT_LVL);
一切配置好后,重新編譯bootroFll和VxWorks鏡像,啟動(dòng)VxWorks鏡像;然后編寫測(cè)試程序進(jìn)行測(cè)試,驗(yàn)證輔助時(shí)鐘是否配置成功。另外,可以通過邏輯分析儀查看輔助時(shí)鐘的中斷情況。輔助時(shí)鐘驅(qū)動(dòng)后,在應(yīng)用程序中可以用sysAuxClkRateSet()函數(shù)動(dòng)態(tài)設(shè)置系統(tǒng)輔助時(shí)鐘每秒的中斷數(shù);sysAuxClkConnect()函數(shù)為系統(tǒng)輔助時(shí)鐘中斷指定ISR,并且由sysAuxClkEnable()函數(shù)使能時(shí)鐘中斷,去調(diào)用指定的ISR。
結(jié) 語
VxWorks提供系統(tǒng)輔助時(shí)鐘機(jī)制的主要目的,是使用戶在系統(tǒng)時(shí)鐘之外多一種定時(shí)資源選擇,并提供了管理手段。另外,VxWorks的某些輔助調(diào)試工具也可能要求使用系統(tǒng)輔助時(shí)鐘。
輔助時(shí)鐘的使用是通過提高節(jié)拍率來實(shí)現(xiàn)的,而提高節(jié)拍率意味著時(shí)鐘中斷產(chǎn)生得更加頻繁,所以中斷處理程序也會(huì)更頻繁地執(zhí)行。如此一來會(huì)給整個(gè)系統(tǒng)帶來如下好處:
①更高的時(shí)鐘中斷解析度(resolution)可提高時(shí)間驅(qū)動(dòng)事件的解析度;
②提高了時(shí)間驅(qū)動(dòng)事件的準(zhǔn)確度(accuracy)。