一、實(shí)現(xiàn)目標(biāo)
STM32F103 基于Hal庫(kù)跑FreeRTOS,統(tǒng)計(jì)CPU占比 找出有問題的任務(wù),類似實(shí)現(xiàn)一個(gè)windows 系統(tǒng)的任務(wù)查看界面。
代碼運(yùn)行結(jié)果如下
二、思路
記錄任務(wù)的時(shí)間點(diǎn),相減獲得任務(wù)所占用的時(shí)間,所得時(shí)間/總時(shí)間,得到該CPU占比。?
三、實(shí)現(xiàn)函數(shù)
只需要調(diào)用一個(gè)vTaskGetRunTimeStats:獲得任務(wù)的運(yùn)行信息,形式為可讀的字符串。
void vTaskGetRunTimeStats( signed char *pcWriteBuffer );
四、操作步驟
1、連接串口后,在freertos.c里面定義一個(gè)全局變量,存在所有任務(wù)的棧的信息,注意,pcWriteBuffer必須足夠大。
static signed char pcWriteBuffer[200];
2、保證如下條件成立
#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
一般條件1和條件3是默認(rèn)成立的,如果條件2的宏定義是0(#define configUSE_STATS_FORMATTING_FUNCTIONS? ? ?0),需要配置STM32CubeMX,將其使能,如下圖所示。?
3、使能鉤子函數(shù),USE_IDLE_HOOK
在配置STM32CubeMX將其使能,如下圖所示。
4、使能 configGENERATE_RUN_TIME_STATS
在配置STM32CubeMX將其使能,如下圖所示。?
5、重新生成代碼
配置成功后,configGENERATE_RUN_TIME_STATS 會(huì)定義為1。
#define configGENERATE_RUN_TIME_STATS ? ? ? ? ? ?1
6、定時(shí)器的驅(qū)動(dòng)文件driver_timer.c 添加如下2個(gè)函數(shù)。uint64_t system_get_ns(void),實(shí)現(xiàn)弱函數(shù)unsigned long getRunTimeCounterValue(void)。
/**********************************************************************
* 函數(shù)名稱: system_get_ns
* 功能描述: 獲得系統(tǒng)時(shí)間(單位ns)
* 輸入?yún)?shù): 無(wú)
* 輸出參數(shù): 無(wú)
* 返 回 值: 系統(tǒng)時(shí)間(單位ns)
* 修改日期 版本號(hào) 修改人 修改內(nèi)容
**********************************************************************/
uint64_t system_get_ns(void)
{
extern TIM_HandleTypeDef htim4;
TIM_HandleTypeDef *hHalTim = &htim4;
uint64_t ns = HAL_GetTick();
uint64_t cnt;
uint64_t reload;
cnt = __HAL_TIM_GET_COUNTER(hHalTim);
reload = __HAL_TIM_GET_AUTORELOAD(hHalTim);
ns *= 1000000;
ns += cnt * 1000000 / reload;
return ns;
}
/* 返回系統(tǒng)啟動(dòng)后過了多少時(shí)間(單位us) */
unsigned long getRunTimeCounterValue(void)
{
return system_get_ns() / 1000;
}
7、在鉤子函數(shù)void vApplicationIdleHook( void )改成如下代碼,獲得任務(wù)的運(yùn)行信息及打印結(jié)果。?
void vApplicationIdleHook( void )
{
int i;
//vTaskList(pcWriteBuffer);
vTaskGetRunTimeStats(pcWriteBuffer);
for (i = 0; i < 16; i++)
printf("-");
printf("\n\r");
printf("%s\n\r", pcWriteBuffer);
}
8、運(yùn)行結(jié)果,可統(tǒng)計(jì)CPU占比,從占比大中,找出有問題的任務(wù)。
9、備注-源碼和環(huán)境
源碼鏈接https://download.csdn.net/download/m0_37371085/88768311
單片機(jī):STM32F103c8tx
keil版本:5.32文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-820813.html
STM32CubeMX版本:6.8.1文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-820813.html
到了這里,關(guān)于STM32 Hal庫(kù)FreeRTOS統(tǒng)計(jì)CPU占比 找出有問題的任務(wù) 僅需一個(gè)函數(shù)搞定 超簡(jiǎn)單的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!