如何使用STM32CubeMX創建工程並加入Keil RTX操作系統


緒論

在學習FreeRTOS的時候,就了解到Keil有一個RTX操作系統,聽說其配合Keil 的Event Recorder調試非常好用。它的中斷延遲很低,關鍵還和FreeRTOS一樣,免費的。
在網上找了一些資料之后,大都是直接使用Keil進行添加,於是結合官方資料和網上的資料,嘗試在使用STM32CubeMX生成的工程中添加RXT操作系統。

STM32CubeMX配置部分

STM32CubeMX的配置和平時沒有什么不同,主要有兩個需要注意的地方,一個是Timebase Source的配置,這個是HAL庫的基礎時鍾,默認是SysTick,但是操作系統默認使用這個時鍾,所以需要將HAL庫的基礎時鍾換為TIMER,這里我選擇TIM2.
HAL庫的時鍾配置
然后是時鍾樹的配置,注意先選擇外部高速時鍾,設置頻率,然后設置HCLK就會自動配置所有時鍾。
時鍾樹配置
第二點需要注意的就是,點擊NVIC配置,點擊Code generation選擇,將SVC, PendSV和SysTick這三個中斷的Generate IRQ handler選項去掉,因為Keil的RTX系統要用到這三個中斷。在這里插入圖片描述
配置完成之后,就可以生成代碼。接下來就是Keil需要配置的部分。

Keil配置部分

生成工程之后,點擊 Manage Run-Time Environment 按鈕,進行RTX和Event Recorder的配置。
加入RTX

  1. 展開CMSIS,勾選CORE,展開RTOS2,勾選Keil RTX5,后面強烈推薦采用源碼方式,方面后面查看源碼。
    勾選之后,可以看到下面有一個警告,這個我們忽略掉它,這個是STM32F4的啟動代碼,STM32CubeMX已經進了了配置,再次勾選就會沖突。
  2. RTX配置完成后,就配置Event Recorder,這是一個調試組件,配合上RTX簡直是調試的利器。展開Compiler,勾選Event Recorder,我們調試的時候需要用到printf,所以將下面的STDOUT也勾選,然后后面選擇EVR,將printf重定向到Event Recorder。
  3. 最后需要注意的各個組件的版本,推薦使用最新版本。

RTX和Event Recorder配置
完成之后需要對RTX進行一個配置,展開右側的CMSIS,雙擊,RTX_Config.h,點擊下面的Configuration Wizard按鈕,給操作系統分配內存,在這里我一共分配了32*1024 一共32KB的內存。其它的默認即可。
RTX配置文件

代碼部分

完成以上部分之后,還需要添加一些代碼,來對RTX進行初始化,首先是添加頭文件。
main函數配置
然后就是添加RTX的初始化函數,其中Thread_Init()為創建線程的函數,需要用戶自己編寫。其它函數看名字應該都知道是干嘛的。

  #ifdef RTE_Compiler_EventRecorder
    EventRecorderInitialize(EventRecordAll, 1);
  #endif    
  SystemCoreClockUpdate();
  osKernelInitialize();                
  Thread_Init();
	
  osKernelStart();  

main函數配置
這個文件是我們自己手動編寫,我在此處使用的是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的優先級高,所以它優先執行。
printf信息
然后就是Event Recorder調試組件,可以看到,在Event Recorder中,可以看到很多系統信息,包括系統的內存使用情況,每個任務的棧使用情況、優先級、運行狀態、Flag等等,可以說調試起來非常方便。
RTX系統信息
再看看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版本
STM32CubeMX版本
測試所用單片機為STM32F407ZGT6,固件包為1.25.0
STM32型號固件版本號
Keil版本為V5.29.0.0
Keil版本信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM