緒論
在學習FreeRTOS的時候,就了解到Keil有一個RTX操作系統,聽說其配合Keil 的Event Recorder調試非常好用。它的中斷延遲很低,關鍵還和FreeRTOS一樣,免費的。
在網上找了一些資料之后,大都是直接使用Keil進行添加,於是結合官方資料和網上的資料,嘗試在使用STM32CubeMX生成的工程中添加RXT操作系統。
STM32CubeMX配置部分
STM32CubeMX的配置和平時沒有什么不同,主要有兩個需要注意的地方,一個是Timebase Source的配置,這個是HAL庫的基礎時鍾,默認是SysTick,但是操作系統默認使用這個時鍾,所以需要將HAL庫的基礎時鍾換為TIMER,這里我選擇TIM2.
然后是時鍾樹的配置,注意先選擇外部高速時鍾,設置頻率,然后設置HCLK就會自動配置所有時鍾。
第二點需要注意的就是,點擊NVIC配置,點擊Code generation選擇,將SVC, PendSV和SysTick這三個中斷的Generate IRQ handler選項去掉,因為Keil的RTX系統要用到這三個中斷。
配置完成之后,就可以生成代碼。接下來就是Keil需要配置的部分。
Keil配置部分
生成工程之后,點擊 Manage Run-Time Environment 按鈕,進行RTX和Event Recorder的配置。
- 展開CMSIS,勾選CORE,展開RTOS2,勾選Keil RTX5,后面強烈推薦采用源碼方式,方面后面查看源碼。
勾選之后,可以看到下面有一個警告,這個我們忽略掉它,這個是STM32F4的啟動代碼,STM32CubeMX已經進了了配置,再次勾選就會沖突。 - RTX配置完成后,就配置Event Recorder,這是一個調試組件,配合上RTX簡直是調試的利器。展開Compiler,勾選Event Recorder,我們調試的時候需要用到printf,所以將下面的STDOUT也勾選,然后后面選擇EVR,將printf重定向到Event Recorder。
- 最后需要注意的各個組件的版本,推薦使用最新版本。
完成之后需要對RTX進行一個配置,展開右側的CMSIS,雙擊,RTX_Config.h,點擊下面的Configuration Wizard按鈕,給操作系統分配內存,在這里我一共分配了32*1024 一共32KB的內存。其它的默認即可。
代碼部分
完成以上部分之后,還需要添加一些代碼,來對RTX進行初始化,首先是添加頭文件。
然后就是添加RTX的初始化函數,其中Thread_Init()為創建線程的函數,需要用戶自己編寫。其它函數看名字應該都知道是干嘛的。
#ifdef RTE_Compiler_EventRecorder
EventRecorderInitialize(EventRecordAll, 1);
#endif
SystemCoreClockUpdate();
osKernelInitialize();
Thread_Init();
osKernelStart();
這個文件是我們自己手動編寫,我在此處使用的是CMSIS-RTOS C API v2 。
例程中一共創建了兩個線程,分別是Thread1和Thread2.其中,Thread1的名字為Thread1,優先級為osPriorityLow3(比osPriorityLow4低),給它分配了256*4個Byte的堆棧。Thread2同理。
在兩個線程中,首先添加了printf函數,打印任務運行情況,然后在while中添加了Event Recorder的時間測量函數,HAL庫的延時函數(基於TIM2),這個延時不會被RTOS打斷,以及RTOS的延時函數,會引起調度。
完成之后,編譯,進行Debug,查看運行結果。
工程測試
編譯完成之后就可以進行測試,我使用的是DAP下載器,注意將Trace的時鍾改為168,也就是系統系統內核時鍾。
然后依次打開 Debug (printf)Viewer窗口。
Event Statistics窗口
以及RTX RTOS窗口。
最后點擊RUN開始運行。
測試結果
進入Debug模式后,打開Debug (printf) Viewer 窗口,然后運行程序,可以看到,兩個線程均已運行,而且由於Thread2的優先級高,所以它優先執行。
然后就是Event Recorder調試組件,可以看到,在Event Recorder中,可以看到很多系統信息,包括系統的內存使用情況,每個任務的棧使用情況、優先級、運行狀態、Flag等等,可以說調試起來非常方便。
再看看Event Recorder的時間測量,可以看到Event Recorder在傳輸數據過程中出現了一些錯誤,但是其時間測量還是比較准的。
Thread1的時間測量從開始到停止理論上一共消耗220ms,實測平均值221.58ms。
Thread2的時間測量從開始到停止理論上一共消耗110ms,實測平均值110.81ms。
Thread1的運行時間理論上為20ms,實測平均值23.738ms,阻塞理論上200ms,實測平均值201ms。
Thread2的運行時間理論上為10ms,實測平均值10.735ms,阻塞理論上100ms,實測平均值101.59ms。
可以看到,排除掉一些錯誤的數據,實際測量值符合理論值。
附錄
整個工程
CSDN
自建的gits。
每天早上9點到晚上23點59分開
測試軟件版本
STM32CubeMX版本
測試所用單片機為STM32F407ZGT6,固件包為1.25.0
Keil版本為V5.29.0.0