1. 程式人生 > >SYSBIOS系統中的定時模組

SYSBIOS系統中的定時模組

基於TMS320C6678的sysbios系統時鐘模組
基於6678做工程,在配置sysbios時用到了XDCtools配置技術,因此現在簡單介紹一下在6678平臺上做sysbios系統時,關於系統時鐘的一個介紹
sysbios以及xdctools中關於計時和時鐘的相關服務包括三個方面:

  1. ti.sysbios.knl.Clock模組,Clock模組負責與使用者API函式打交道,他可以呼叫.hal.Timer來獲得一個基於硬體計時器的時鐘。另外Clock模組還可以配置成由應用提供時鐘。

  2. ti.sysbios.hal.Timer模組,該模組主要負責與底層硬體打交道,可以被Clock模組呼叫,主要負責對片上計時器硬體的配置。

  3. xdc.runtime.Timestamp時間戳模組,該模組給基準測試程式碼提供時間戳服務,同時可以新增時間戳到日誌。

具體
Clock模組負責管理核心用來記錄時間的週期性系統時鐘,他預設的使用ti.sysbios.hal.Timer來模擬建立一個計時器來生產系統時鐘,這個過程是通過呼叫Clock_tick()函式來實現的。

可以通過配置Clock模組中的 ti.sysbios.knl.tickSorce引數來確定系統是時鐘的來源,分別可以設定為:
Clock.tickSource_TIMER 系統使用.hal.Timer來建立系統時鐘(預設)
Clock.tickSource_USER 系統使用使用者應用程式來提供時鐘,那麼使用者應用程式需要通過中斷來呼叫Clock_tick()函式,並且中斷的頻率應該基本上等於系統時鐘的頻率。
Clock.tickSource_NULL,sysbios系統不能呼叫任何和時鐘有關的APIs
對於前兩種時鐘,可以通過Clock_tickPeriod來設定時鐘週期。

Clock_getTicks函式獲得從系統啟動開始所產生的時鐘週期數目,當該值達到32位後就會返回0值。
Clock模組還可以呼叫以下三個函式調整停止重新配置時鐘:
Clock_tickStop函式通過呼叫Timer_stop來停止用於產生系統時鐘的計數器,從而停止系統時鐘。
Clock_tickReconfig函式呼叫Timer_setperiodMicrosecongds函式來重新配置計數器,改變計時週期;
Clock_tickStart函式通過呼叫Timer_start來重新啟動配置好的計數器,從而重新啟動系統時鐘。

Clock模組可以建立時鐘例項,當建立時鐘例項時系統自動建立一個SWI,時鐘函式都在該軟體中斷中執行,建立時其中斷優先順序由系統分配,但是也可以自己配置,通過設定Clock.swi.Priority來改變。

在建立時鐘例項時需要呼叫Clock_create 函式來動態建立(當然也可以靜態配置建立),時鐘例項可以是單次的也可以是連續的,這個通過clock_params來設定,可以在建立成功後設置立即啟動也可以通過後續呼叫Clock_start來啟動,也是通過clockparams來設定,Clock_create 函式只能在main函式或者Task中被呼叫。

Clock_Params  clockParams;
Clock_Handle myClock;
clockParams.period = 5;
clockParams.startFlag = TRUE;
myClock = Clock_create(myHandler,Timeout,&clockParams,&eb);

這段程式碼顯示的是建立了一個時鐘例項,其中Clock_Handle myClock;是設定了一個時鐘例項的控制代碼變數,Clock_Params = clockParams;是設定了一個時鐘例項的引數配置變數,其中clockParams.period = 5;表示這是一個連續的時鐘例項,他在被第一次喚醒之後每隔5個週期會被再換醒一次,5是除第一次喚醒時的喚醒週期,如果clockParams.period = 0或者沒有設定的話那麼他即使一個單次的時鐘例項,第一次被喚醒之後就再也不會被喚醒了。與他對應的一個引數是Timeout這個引數,這個引數要求是非零的,這個引數表示的是這個時鐘例項從啟動開始到第一次被喚醒所需要的時鐘週期數,他與clockParams.period = 5;這個引數是不同的,他只負責從啟動到第一次被喚醒這個時間。引數clockParams.startFlag = TRUE;表示建立好這個時鐘例項之後立即啟動,如果沒有設定那麼這個時鐘例項不會立即開始啟動(注意區分啟動與喚醒)需要他啟動時呼叫Clock_start函式即可。myHandler這個是個喚醒時鐘服務函式,類似於中斷服務函式,當這個時鐘例項到時間被喚醒之後他就轉向去執行這個函式名為myHandler的函式。
下面是單次例項與連續例項的對比:
在這裡插入圖片描述
時鐘例項都可以呼叫Clock_stop()和Clock_start()來停止和重啟,要注意的是,Clock_tickStop的作用是停止產生時鐘週期的計數器,而Clock_stop()的作用是隻停止一個時鐘物件的一個例項(因為可能一個計數器同時對應多個時鐘例項),當呼叫Clock_start()時那個超時值被重置。時鐘例項的這兩個函式可以在任何程式中被呼叫。時鐘模組還提供了Clock_setPeriod, Clock_setTimeout, Clock_setFunc()等函式供使用者修改被停止的時鐘例項,這三個函式與前面的Clock_tickStop,Clock_tickReconfig,Clock_tickStart是不同的前面三個是修改時鐘例項,並且要先停止這個時鐘例項,他們是不會改變計數器的配置的,然而後面三個是可以呼叫.hal.Timer模組的相應函式的,他們改變的是計數器的配置

//使用APIs來降低時鐘模組的頻率,降低計數器頻率
BIOS_getCpuFreq(&cpuFreq);
cpuFreq.lo = cpuFreq.lo/2;
BIOS_setCpuFreq(&cpuFreq);
key = Hwi_disable();//門
Clock_tickStop();
Clock_tickReconfig();
Clock_tickStart();
Hwi_restore(key);

ti.sysbios.hal.Timer是硬體抽象層pack的一部分。