系統滴答定時器(SYSTICK)
阿新 • • 發佈:2020-10-12
一、SysTick定時器
SysTick定時器被捆綁在NVIC中,用於產生SYSTICK異常。他的作用是為各個不同任務許以不同數目的時間片,確保沒有一個任務能霸佔系統;或者把每個定時器週期 的某個時間範圍賜予特定的任務等,還有作業系統提供的各種定時功能,都與這個滴答定時 器有關。因此,需要一個定時器來產生週期性的中斷,而且最好還讓使用者程式不能隨意訪問 它的暫存器,以維持作業系統“心跳”的節律。
SysTick系統定時器中有4個暫存器,分別是:
CTRL——SysTick控制及狀態暫存器
LOAD——SysTick重灌載數值暫存器
VAL——SysTick當前數值暫存器
CALIB——SysTick校準數值暫存器
二、SVC和PendSV
SVC(系統服務呼叫,亦簡稱系統呼叫)和 PendSV(可懸起系統呼叫),它們多用於在 作業系統之上的軟體開發中。SVC 用於產生系統函式的呼叫請求。例如,作業系統不讓使用者 程式直接訪問硬體,而是通過提供一些系統服務函式,使用者程式使用 SVC 發出對系統服務函 數的呼叫請求,以這種方法呼叫它們來間接訪問硬體。因此,當用戶程式想要控制特定的硬 件時,它就會產生一個 SVC 異常,然後作業系統提供的 SVC 異常服務例程得到執行,它再 呼叫相關的作業系統函式,後者完成使用者程式請求的服務。
但是,如果在產生SysTick異常時正在響應一箇中斷,則SysTick異常會搶佔其中斷服務響應。在這時,系統會執行SysTick異常的上下文切換,而且在本次切換期間不能執行中斷,只能等待下一次SysTick異常,因此中斷請求就會被延遲,如下圖所示:
為解決上述問題,引入了PendSV來解決這個問題,PendSV異常會自動延遲上下文切換的請求,直到其它的 ISR 都完成了處理後才放行。為實現這個機制,需要把 PendSV 程式設計為最低優先順序的異常。如果 OS 檢測到某 IRQ 正在活動並且被 SysTick 搶佔,它將懸起一個 PendSV 異常, 以便緩期執行上下文切換。如下圖所示:
箇中事件的流水賬記錄如下:
- 任務 A 呼叫 SVC 來請求任務切換(例如,等待某些工作完成)
- OS 接收到請求,做好上下文切換的準備,並且 pend 一個 PendSV 異常。
- 當 CPU 退出 SVC 後,它立即進入 PendSV,從而執行上下文切換。
- 當 PendSV 執行完畢後,將返回到任務 B,同時進入執行緒模式。
- 發生了一箇中斷,並且中斷服務程式開始執行
- 在 ISR 執行過程中,發生 SysTick 異常,並且搶佔了該 ISR。
- OS 執行必要的操作,然後 pend 起 PendSV 異常以作好上下文切換的準備。
- 當 SysTick 退出後,回到先前被搶佔的 ISR 中,ISR 繼續執行
- ISR 執行完畢並退出後,PendSV 服務例程開始執行,並且在裡面執行上下文切換
- 當 PendSV 執行完畢後,回到任務 A,同時系統再次進入執行緒模式。
三、使用SysTick
1、要使用systick定時器,只需呼叫SysTick_Config(uint32_t ticks)函式即可,
函式自動完成:重灌載值的裝載,時鐘源選擇,計數暫存器復位,中斷優先順序的設定(最低),開中斷,開始計數的工作。
2、要修改時鐘源呼叫SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),也可按照SysTick_Config()中預設設定FCLK不變。
3、要修改中斷優先順序呼叫
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
應用說明:
1、因systick是一個24位的定時器,故重灌值最大值為2的24次方=16 777 215,要注意不要超出這個值。
2、systick是cortex_m3的標配,不是外設。故不需要在RCC暫存器組開啟他的時鐘。
3、每次systick溢位後會置位計數標誌位和中斷標誌位,計數標誌位在計數器重灌載後被清除,而中斷標誌位也會隨著中斷服務程式的響應被清除,所以這兩個標誌位都不需要手動清除。
4、採用使用庫函式的方法,只能採用中斷的方法響應定時器計時時間到,如要採用查詢的方法,那隻能採用設定systick的暫存器的方法,具體操作以後再做分析。