0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32F407的FreeRTOS學(xué)習(xí)筆記(4)

CHANBAEK ? 來(lái)源:實(shí)在太懶于是不想取名 ? 作者: 電路小白 ? 2023-11-07 11:43 ? 次閱讀

CPU工作的時(shí)候,各個(gè)任務(wù)運(yùn)行會(huì)占用CPU的資源,在Windows系統(tǒng)中我們可以通過(guò)任務(wù)管理器來(lái)看各任務(wù)(進(jìn)程)占用系統(tǒng)資源的情況。

圖片

那么,FreeRTOS怎么實(shí)現(xiàn)這個(gè)功能呢?

我們翻閱FreeRTOS官網(wǎng),查詢(xún)API文檔,在內(nèi)核控制函數(shù)部分找到了相關(guān)的函數(shù)。

圖片

文檔指出實(shí)現(xiàn)運(yùn)行時(shí)間功能需要配置外設(shè)定時(shí)器,即32板載定時(shí)器,計(jì)時(shí)器頻率應(yīng)為滴答計(jì)時(shí)器(1ms)的至少10倍。

傳入參數(shù)為pcWriteBUffer,其實(shí)是一個(gè)char類(lèi)型的數(shù)組用以存儲(chǔ)相關(guān)信息

我們現(xiàn)在工程上調(diào)用這個(gè)函數(shù)。

char informationbuff[400];
void Get_info(void * pvParameters)
{

  //vTaskGetRunTimeStats(informationbuff);
  while(1)
  {
    if(KEY_Scan(0)==1)//按下按鍵1
    {
      memset(informationbuff,0,400);//清空數(shù)組內(nèi)容
      vTaskGetRunTimeStats(informationbuff);//獲得運(yùn)行時(shí)間
      printf("%s\r\n",informationbuff);//打印運(yùn)行時(shí)間
    }
    vTaskDelay(10);
  }
}

上述任務(wù)的作用為檢測(cè)按鍵,如果按鍵按下即嘗試獲得運(yùn)行狀態(tài),并打印運(yùn)行狀態(tài)。

出現(xiàn)了如下錯(cuò)誤,顯示我們未定義該函數(shù),我們利用Ctrl+F全局尋找這個(gè)函數(shù)定義在哪里。

FreeRTOS\FreeRTOS.axf: Error: L6218E: Undefined symbol vTaskGetRunTimeStats (referred from main.o).
F:\Code\STM32Code\STM32F407_FreeRtos\FreeRTOS\FreeRTOS\Source\tasks.c(4539) :     void vTaskGetRunTimeStats( char * pcWriteBuffer )
F:\Code\STM32Code\STM32F407_FreeRtos\FreeRTOS\FreeRTOS\Source\tasks.c(4552) :          * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part
F:\Code\STM32Code\STM32F407_FreeRtos\FreeRTOS\FreeRTOS\Source\tasks.c(4557) :          * vTaskGetRunTimeStats() has a dependency on the sprintf() C library
F:\Code\STM32Code\STM32F407_FreeRtos\FreeRTOS\FreeRTOS\Source\tasks.c(4567) :          * through a call to vTaskGetRunTimeStats().

第一行內(nèi)容,即為函數(shù)定義的位置,我們跳轉(zhuǎn)過(guò)去查看其情況。

#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configUSE_TRACE_FACILITY == 1 ) )


    void vTaskGetRunTimeStats( char * pcWriteBuffer )
{
        TaskStatus_t * pxTaskStatusArray;
        UBaseType_t uxArraySize, x;
        configRUN_TIME_COUNTER_TYPE ulTotalTime, ulStatsAsPercentage;


省略后續(xù)內(nèi)容(防止說(shuō)水字?jǐn)?shù))

我們看到了函數(shù)模型以及相關(guān)注釋?zhuān)瑥念^中我們可以看出需要相關(guān)的宏定義,分別是configGENERATE_RUN_TIME_STATS、configUSE_STATS_FORMATTING_FUNCTIONS、configUSE_TRACE_FACILITY。

我們?cè)贔reeRTOSconfig.h文件(頭文件都行,方便管理)中添加使能這三個(gè)宏。

圖片

再次運(yùn)行,依舊報(bào)錯(cuò),從報(bào)錯(cuò)內(nèi)容來(lái)看,提醒我們?nèi)绻麑onfigGENERATE_RUN_TIME_STATS使能的話(huà),我們也必須定義portCONFIGURE_TIMER_FOR_RUN_TIME_STATS這個(gè)啟動(dòng)函數(shù),以及后面的一條報(bào)錯(cuò),我們必須定義portGET_RUN_TIME_COUNTER_VALUE時(shí)間的返回值。

圖片

#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS
  (import)    #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined.  portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base.
    #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */


    #ifndef portGET_RUN_TIME_COUNTER_VALUE
        #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE
    (import)    #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined.  See the examples provided and the FreeRTOS web site for more information.
        #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */
    #endif /* portGET_RUN_TIME_COUNTER_VALUE *

啟動(dòng)函數(shù)即為外部定時(shí)器啟動(dòng)函數(shù),返回值則是一個(gè)數(shù)用以計(jì)算時(shí)間。

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()  configTIM_START()//定時(shí)器1提供時(shí)間統(tǒng)計(jì)的時(shí)基,頻率為10K,即周期為100us           
#define portGET_RUN_TIME_COUNTER_VALUE()   FreeRTOSRunTime//時(shí)基
extern volatile unsigned long long FreeRTOSRunTime;

我們定義這兩個(gè)宏,本來(lái)這個(gè)括號(hào)是沒(méi)加上去的,后來(lái)發(fā)現(xiàn)其調(diào)用的時(shí)候是代括號(hào)的,所以定義宏的時(shí)候不帶括號(hào)就會(huì)出錯(cuò)

圖片

此外我們定義了long long 類(lèi)型的變量用以存儲(chǔ)我們的時(shí)間,加上extern表示這個(gè)變量的實(shí)際定義并不在頭文件中,之所以加上volatile是因?yàn)槲覀兊淖兞繒?huì)在不同的文件以及中斷中被修改(這種修改屬于意外修改),加上volatile標(biāo)志給系統(tǒng)提前吱會(huì)一聲。

之后,我們?nèi)UBEMX啟動(dòng)我們的定時(shí)器。

圖片

定時(shí)器我們選擇定時(shí)器1,時(shí)鐘源選擇內(nèi)部時(shí)鐘,分頻系數(shù)由于我們的單片機(jī)主頻是168MHZ,因此我們選擇168分頻,這樣子定時(shí)器頻率即為1MHZ,溢出值我們選擇為50,通過(guò)這樣的設(shè)置我們定時(shí)器的頻率就是20KHZ,是滴答定時(shí)器時(shí)鐘的20倍。

FreeRTOSRunTime也可以定義在這里。

圖片

之后我們將剛才宏定義的啟動(dòng)函數(shù)進(jìn)行定義,內(nèi)容則是重置計(jì)數(shù)器并啟動(dòng)定時(shí)器。

完成這步之后,我們還需要在主函數(shù)中啟用定時(shí)器1 的中斷并且編寫(xiě)相應(yīng)的中斷服務(wù)函數(shù),其內(nèi)容為FreeRTOSRunTime遞增。

圖片

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == htim1.Instance)
  {
    FreeRTOSRunTime++;
  }
}
/* USER CODE END 4 */

之后我們運(yùn)行程序觀(guān)察串口的輸出。

圖片

這樣子我們就可以打印出各個(gè)程序運(yùn)行時(shí)間以及占用系統(tǒng)資源的占比了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10769

    瀏覽量

    210425
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3509

    瀏覽量

    88201
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3226

    瀏覽量

    114144
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61849
  • STM32F407
    +關(guān)注

    關(guān)注

    15

    文章

    187

    瀏覽量

    29288
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于STM32F407FreeRTOS學(xué)習(xí)筆記(9)

    在嵌入式編程中,定時(shí)器是一個(gè)非常重要且強(qiáng)大的功能,用來(lái)幫我們定時(shí)性的調(diào)用中斷服務(wù)函數(shù)來(lái)幫助我們處理程序。定時(shí)器通常是用硬件來(lái)實(shí)現(xiàn)的,例如STM32F407就有8個(gè)硬件定時(shí)器。
    的頭像 發(fā)表于 11-08 11:08 ?841次閱讀
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>(9)

    STM32F407模板

    STM32F407模板,感興趣可以看看。
    發(fā)表于 07-25 18:52 ?130次下載

    STM32F407 UCOS III實(shí)驗(yàn)

    STM32F407 UCOS III實(shí)驗(yàn),介紹基于STM32F407的UCOSIII實(shí)例,參考下
    發(fā)表于 09-22 14:08 ?81次下載

    STM32F407 DCMI攝像頭源碼

    STM32F407 DCMI攝像頭源碼(電源技術(shù)存在的問(wèn)題總結(jié))-【資源描述】:STM32F407 DCMI攝像頭源碼【編程語(yǔ)言】:C語(yǔ)言
    發(fā)表于 09-16 16:15 ?123次下載
    <b class='flag-5'>STM32F407</b> DCMI攝像頭源碼

    基于 STM32F407 使用 4*4 矩陣鍵盤(pán)(附完整程序)

    STM32F407使用4*4矩陣鍵盤(pán)
    發(fā)表于 11-20 12:21 ?94次下載
    基于 <b class='flag-5'>STM32F407</b> 使用 <b class='flag-5'>4</b>*<b class='flag-5'>4</b> 矩陣鍵盤(pán)(附完整程序)

    STM32F407標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)筆記-AFIO未完

    STM32F407標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)筆記-AFIO- 頭文件 gpio.h#define GPIO_PinSource0 ((uint8_t)0x00)#define
    發(fā)表于 11-29 15:36 ?2次下載
    <b class='flag-5'>STM32F407</b>標(biāo)準(zhǔn)庫(kù)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>-AFIO未完

    STM32F407標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)筆記-RCC

    STM32F407標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)筆記-RCC- rcc.htypedef struct{ uint32_t SYSCLK_Frequency; /*!< SYSCLK clock
    發(fā)表于 11-29 15:51 ?13次下載
    <b class='flag-5'>STM32F407</b>標(biāo)準(zhǔn)庫(kù)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>-RCC

    STM32F407標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)筆記-GPIO

    STM32F407標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)筆記-GPIO頭文件 gpio.h枚舉-列舉同一寄存器的不同選項(xiàng)typedef enum{ GPIO_Low_Speed = 0x00, /*!<
    發(fā)表于 11-29 15:51 ?46次下載
    <b class='flag-5'>STM32F407</b>標(biāo)準(zhǔn)庫(kù)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>-GPIO

    STM32F407的串口UART 基礎(chǔ)配置STM32CubeMX

    STM32F407的串口UART 基礎(chǔ)配置STM32CubeMX
    發(fā)表于 11-29 16:06 ?54次下載
    <b class='flag-5'>STM32F407</b>的串口UART 基礎(chǔ)配置<b class='flag-5'>STM32</b>CubeMX

    [STM32]STM32F407系列教程之四,pwm產(chǎn)生原理

    [STM32]STM32F407系列教程之四,pwm產(chǎn)生原理
    發(fā)表于 11-29 17:51 ?51次下載
    [<b class='flag-5'>STM32</b>]<b class='flag-5'>STM32F407</b>系列教程之四,pwm產(chǎn)生原理

    STM32F407芯片介紹

    1. 文檔準(zhǔn)備做嵌入式開(kāi)發(fā)的第一步就是了解主芯片,了解STM32F407主要要關(guān)注幾個(gè)文檔:1. stm32F407芯片手冊(cè)2. stm32F407參考手冊(cè)3. Arm Cortex-M4
    發(fā)表于 12-04 13:21 ?109次下載
    <b class='flag-5'>STM32F407</b>芯片介紹

    STM32F407原理圖下載

    STM32F407原理圖下載
    發(fā)表于 01-17 13:44 ?417次下載

    stm32f407原理圖

    stm32f407原理圖
    發(fā)表于 07-14 16:07 ?202次下載

    STM32F407最小系統(tǒng)

    STM32F407最小系統(tǒng)免費(fèi)下載。
    發(fā)表于 07-31 11:01 ?168次下載

    STM32F407 FreeRTOS開(kāi)發(fā)手冊(cè) V1.1

    STM32F407 FreeRTOS開(kāi)發(fā)手冊(cè)_V1.1PDF文件下載。
    發(fā)表于 07-31 11:16 ?52次下載