STM32開發(fā)的初始階段,由于沒有操作系統(tǒng)的支持,因而不能方便的對多任務(wù)進行調(diào)度和管理。而有的任務(wù)不緊急,不需要過多的時間去循環(huán)執(zhí)行,因此需要一個簡單的任務(wù)調(diào)度來解決這個問題。STM32F103ZE的AHB時鐘為72MHz,通過HSE的8M倍頻到72M,然后APB1預(yù)分頻系數(shù)為2,所以TIM2-7時鐘為2*36M。由于定時器是16位,PSC寄存器最大為65536,不支持71999,所以只能以0.1ms計數(shù)。
整個系統(tǒng)在獲取時間的累增時,定義64位變量,即可運行很久的時間,不用擔(dān)心溢出或者死機。定義64位變量有2個方法,一就是用long long 直接定義,通過sizeof測試為8個字節(jié);二就是利用”stdint.h”,typedef uint64_t u64。一般情況下,定時器計時結(jié)果算法公式為:Tout = (ARR+1)(PSC+1)/Tclk。Tclk即為時鐘頻率。
STM32的任務(wù)調(diào)度可以有兩種方式:1.通過systick_handler定時器調(diào)度;2.執(zhí)行一個系統(tǒng)調(diào)用。
cortexM3的寄存器只有16個,cortexM4除了這16個還有很多浮點運算和MPU單元,如果不用這些單元它和M4沒有區(qū)別,我是用的cortexM4內(nèi)核的STM32F407,因為沒有用浮點運算和MPU保護單元因此OS也和M3內(nèi)核兼容。因此在任務(wù)調(diào)度的過程中,也是不斷的保存現(xiàn)在任務(wù)的這16個寄存器,彈出下一個任務(wù)的16個寄存器。
任務(wù)調(diào)度的步驟總結(jié)為如下:
1.保存程序的上下文即當(dāng)前任務(wù)的寄存器,保存存儲寄存器的任務(wù)堆棧的地址。
2.根據(jù)下一個任務(wù)的任務(wù)堆棧地址依次彈出下一個任務(wù)的16個寄存器。
本文整合自 CSDN、簡書
責(zé)任編輯:fqj
-
STM32
+關(guān)注
關(guān)注
2270文章
10918瀏覽量
356803 -
任務(wù)調(diào)度
+關(guān)注
關(guān)注
0文章
27瀏覽量
9901
發(fā)布評論請先 登錄
相關(guān)推薦
評論