---------------------------------------------------------------------------------------------------------------------------
cubemx版本:version_4.20
stm32型號:stm32f103rct6
---------------------------------------------------------------------------------------------------------------------------
關鍵點:
在FreeRTOSConfig.h文件中使能如下宏:
(1)* #define configUSE_TRACE_FACILITY 1
(2)* #define configGENERATE_RUN_TIME_STATS 1
(3)* #define configUSE_STATS_FORMATTING_FUNCTIONS 1
(4)* #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (ulHighFrequencyTimerTicks = 0ul)
(5)* #define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks
(6) 然后開啟一個定時器5,作為計算任務信息的時鍾。
--------------------------------------------------------------------------------------------------------------------------
關鍵點中:
這五個宏定義,第一個是自動生成的,第二個在cube里勾選某個選項后也是自動生成的。
第三個是自己手動添加的。
第四個和第五個,配置GENERATE_RUN_TIME_STATS后會自動生成。生成的是這樣的:
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue
而后邊的其實是對應着各自的__weak前飾的函數。在函數體里加入了對應的語句:
__weak void configureTimerForRunTimeStats(void) { ulHighFrequencyTimerTicks = 0ul; } __weak unsigned long getRunTimeCounterValue(void) { return ulHighFrequencyTimerTicks; // return 0; }
除此之外,又用TIM5作為基本定時器,定時值位10us,開啟定時器5,在其回調函數里:
void TIM5_IRQHandler(void) { /* USER CODE BEGIN TIM5_IRQn 0 */ /* USER CODE END TIM5_IRQn 0 */ HAL_TIM_IRQHandler(&htim5); /* USER CODE BEGIN TIM5_IRQn 1 */ ulHighFrequencyTimerTicks++; /* USER CODE END TIM5_IRQn 1 */ }
---------------------------------------------------------------------------------------------------------------------
執行效果如下:
---------------------------------------------------------------------------------------------------------------------
需要注意的地方:
(1)cubemx 4.20這個版本的有個bug:
在stm32cubemx生成的main文件里面的void SystemClock_Config(void)函數里面的這部分代碼
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
出現了這個bug,會生成下面這樣的代碼,,會導致程序執行不下去。
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
用前者,替代掉后者即可。
(2)另外,執行打印任務列表和運行狀態的任務的堆棧需要大於256bype,否者可能會造成程序分配空間失敗,
導致程序卡死。
(3)記得在主循環里面開啟定時器TIM5
HAL_TIM_Base_Start_IT(&htim5);
---------------------------------------------------------------------------------------------------------------------------
源碼已上傳到github:源碼地址
---------------------------------------------------------------------------------------------------------------------------
參考blog:
http://www.ing10bbs.com/forum.php?mod=viewthread&tid=498