1.任務(wù)相關(guān)函數(shù)
1.1獲取任務(wù)狀態(tài)函數(shù)vTaskGetInfo()
void vTaskGetInfo( TaskHandle_t xTask,TaskStatus_t * pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
函數(shù)功能:獲取指定任務(wù)的狀態(tài),任務(wù)狀態(tài)信息保存在pxTaskStatus中。 任務(wù)信息結(jié)構(gòu)體TaskStatus_t
typedef struct xTASK_STATUS 任務(wù)狀態(tài) eTaskState
typedef enum |
1.2 查詢每個(gè)任務(wù)運(yùn)行時(shí)間vTaskGetRunTimeStats()
void vTaskGetRunTimeStats( char * pcWriteBuffer ) 形參 pcWriteBuffer --- 保存任務(wù)時(shí)間信息的存儲(chǔ)區(qū),存儲(chǔ)區(qū)要足夠大來(lái)保存該信息 函數(shù)功能 查詢每個(gè)任務(wù)的運(yùn)行時(shí)間。使用此函數(shù)需要( configGENERATE_RUN_TIME_STATS == 1 ) && (configUSE_STATS_FORMATTING_FUNCTIONS>0)&&(configSUPPORT_DYNAMIC_ALLOCATION == 1 ) 若 configGENERATE_RUN_TIME_STATS==1 的話還需要設(shè)置下面宏。 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(), 此宏用來(lái)初始化一個(gè)外設(shè)給統(tǒng)計(jì)功能提供時(shí)間基準(zhǔn),一般采用定時(shí)器。這個(gè)時(shí)基的分辯率一定要高于FreeRTOS的系統(tǒng)時(shí)鐘,一般這個(gè)時(shí)基的時(shí)間精度比系統(tǒng)時(shí)鐘高10~20倍就可以了。 portGET_RUN_TIME_COUNTER_VALUE 或portALT_GET_RUN_TIME_COUNTER_VALUE這二者實(shí)現(xiàn)其中一個(gè),這兩個(gè)宏用于提供當(dāng)前時(shí)基的時(shí)間值。 |
1.3 查詢?nèi)蝿?wù)詳細(xì)信息vTaskList()
void vTaskList( char * pcWriteBuffer )
函數(shù)功能:查詢?nèi)蝿?wù)任務(wù)詳細(xì)信息,使用此函數(shù)( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )&&( configSUPPORT_DYNAMIC_ALLOCATION == 1 )。 |
2 示例
2.1 創(chuàng)建任務(wù)
#define START_TASK_PRIO 1 //任務(wù)優(yōu)先級(jí)
#define START_STK_SIZE 128 //任務(wù)堆棧大小
TaskHandle_t StartTask_Handler; //任務(wù)句柄
void start_task(void *pvParameters);//任務(wù)函數(shù)
#define LED0_TASK_PRIO 2 //任務(wù)優(yōu)先級(jí),數(shù)字越大優(yōu)先級(jí)越高
#define LED0_STK_SIZE 128 //任務(wù)堆棧大小
TaskHandle_t LED0Task_Handler; //任務(wù)句柄
void LED0_task(void); //任務(wù)函數(shù)
#define Quer_TASK_PRIO 2 //任務(wù)優(yōu)先級(jí)
#define Quer_STK_SIZE 128 //任務(wù)堆棧大小
TaskHandle_t QuerTask_Handler; //任務(wù)句柄
void Query_task(void); //任務(wù)函數(shù)
int main()
{
Beep_Init();//蜂鳴器初始化
LED_Init();//LED初始化
KEY_Init();
Usart1_Init(115200);//串口1初始化
/*創(chuàng)建任務(wù)*/
xTaskCreate((TaskFunction_t)start_task,//任務(wù)函數(shù)
(const char *)"start_task",//任務(wù)名稱
(uint16_t)START_STK_SIZE,//堆棧大小
NULL, //傳遞給任務(wù)函數(shù)的參數(shù)
(UBaseType_t)START_TASK_PRIO,//任務(wù)優(yōu)先級(jí)
(TaskHandle_t *)&StartTask_Handler//任務(wù)句柄
);
vTaskStartScheduler(); //開(kāi)啟任務(wù)調(diào)度
}
/*開(kāi)始任務(wù)函數(shù)*/
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //進(jìn)入臨界區(qū)
//創(chuàng)建LED0任務(wù)
xTaskCreate( (TaskFunction_t )LED0_task,//任務(wù)函數(shù)
(const char *)"LED0_task",//任務(wù)名稱
(uint16_t)LED0_STK_SIZE,//堆棧大小
NULL, //傳遞給任務(wù)函數(shù)的參數(shù)
(UBaseType_t )LED0_TASK_PRIO,//任務(wù)優(yōu)先級(jí)
(TaskHandle_t *)&LED0Task_Handler);//任務(wù)句柄
xTaskCreate( (TaskFunction_t )Query_task,//任務(wù)函數(shù)
(const char *)"Query_task",//任務(wù)名稱
(uint16_t )Quer_STK_SIZE,//堆棧大小
NULL, //傳遞給任務(wù)函數(shù)的參數(shù)
(UBaseType_t )Quer_TASK_PRIO,//任務(wù)優(yōu)先級(jí)
(TaskHandle_t *)&QuerTask_Handler);//任務(wù)句柄
vTaskDelete(StartTask_Handler); //刪除開(kāi)始任務(wù)
taskEXIT_CRITICAL(); //退出臨界區(qū)
}
2.2 任務(wù)1 程序正常運(yùn)行LED指示燈
void LED0_task(void)
{
while(1)
{
LED1=!LED1;
Delay_Ms(500);
}
}
2.3 任務(wù)2:通過(guò)按鍵查詢?nèi)蝿?wù)狀態(tài)
char RunTimeInfo[400];//保存任務(wù)信息
void Query_task(void)//任務(wù)函數(shù)
{
u8 key;
TaskStatus_t task_info;//保存任務(wù)信息
while(1)
{
key=KEY_GetVal();
if(key==1)//獲取任務(wù)運(yùn)行時(shí)間,任務(wù)運(yùn)行時(shí)間FreeRTOSRunTimeTicks*50us
{
memset(RunTimeInfo,0,400);
vTaskGetRunTimeStats(RunTimeInfo);//獲取每個(gè)任務(wù)運(yùn)行時(shí)間
printf("%s\r\n",RunTimeInfo);
}
if(key==2)//獲取任務(wù)狀態(tài)
{
vTaskGetInfo(NULL,&task_info,pdTRUE,eInvalid);//獲取當(dāng)前任務(wù)狀態(tài)
printf("task name:%s\r\n",task_info.pcTaskName);//任務(wù)名
printf("task num:%ld\r\n",task_info.xTaskNumber);//任務(wù)編號(hào)
printf("task stat:%d\r\n",task_info.eCurrentState);//任務(wù)狀態(tài)
printf("task baseaddr:%p\r\n",task_info.pxStackBase);//任務(wù)堆棧基地址
printf("task priority:%ld\r\n",task_info.uxBasePriority);//任務(wù)基礎(chǔ)優(yōu)先級(jí)
printf("tast now priority:%ld\r\n",task_info.uxCurrentPriority);//任務(wù)當(dāng)前優(yōu)先級(jí)
printf("tast memory size:%d\r\n",task_info.usStackHighWaterMark);//任務(wù)歷史剩余堆棧最小空間
printf("tast time:%d\r\n",task_info.ulRunTimeCounter);//任務(wù)運(yùn)行總時(shí)間
}
if(key==3)//查詢?nèi)蝿?wù)詳細(xì)信息
{
memset(RunTimeInfo,0,400);
vTaskList(RunTimeInfo);//獲取任務(wù)狀態(tài)信息
printf("%s\r\n",RunTimeInfo);
}
Delay_Ms(10);
}
}
2.4 獲取任務(wù)運(yùn)行時(shí)間
(1)獲取任務(wù)運(yùn)行時(shí)間時(shí)需要提供時(shí)間基準(zhǔn),要設(shè)置相應(yīng)的宏,在FreeRTOSconfig.h中
#define configGENERATE_RUN_TIME_STATS 1 //為1時(shí)啟用運(yùn)行時(shí)間統(tǒng)計(jì)功能
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持動(dòng)態(tài)內(nèi)存申請(qǐng)
(2)提供相應(yīng)時(shí)間基準(zhǔn)函數(shù),在timer.h中。
設(shè)置時(shí)間基準(zhǔn)函數(shù)用戶只需要產(chǎn)生時(shí)基單元,設(shè)置好相關(guān)的宏,不需要用戶調(diào)用。在設(shè)置時(shí)間基準(zhǔn)需要保證該時(shí)間基準(zhǔn)的頻率高于FreeRTOS系統(tǒng)頻率,要是系統(tǒng)頻率的10~20倍。
本示例的FreeRTOS系統(tǒng)頻率為configTICK_RATE_HZ ( ( TickType_t ) 1000 ) ,也就是FreeRTOS系統(tǒng)時(shí)間為1ms,所以獲取任務(wù)運(yùn)行時(shí)間的時(shí)間基準(zhǔn)為50us。
/*******用于給FreeRTOS計(jì)算任務(wù)運(yùn)行時(shí)間提供時(shí)間基準(zhǔn)*******/
volatile unsigned long long FreeRTOSRunTimeTicks;
void ConfigureTimeForRunTimeStas(void)//不需要用戶調(diào)用,只需實(shí)現(xiàn)功能即可
{
FreeRTOSRunTimeTicks=0;
Tim1_Init(72,50);//初始化定時(shí)器1,周期50us,cnt+1時(shí)間為1us
}
void TIM1_UP_IRQHandler(void)
{
if(TIM1->SR&1<<0)
{
FreeRTOSRunTimeTicks++;//運(yùn)行時(shí)間統(tǒng)計(jì)基數(shù)計(jì)數(shù)器+1
}
TIM1->SR=0;//清除標(biāo)志
}
(3)通過(guò)#define進(jìn)行宏定義,給獲取任務(wù)時(shí)間函數(shù)vTaskGetRunTimeStats()提供時(shí)間基準(zhǔn)接口。在FreeRTOSconfig.h中。
//用于給獲取任務(wù)函數(shù)提供時(shí)間基準(zhǔn)
#defineportCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimeForRunTimeStas()
//用于提供當(dāng)前時(shí)間基準(zhǔn)變量 unsigned long long類型
#define portGET_RUN_TIME_COUNTER_VALUE() FreeRTOSRunTimeTicks
獲取任務(wù)運(yùn)行時(shí)間
![pYYBAGKXDs6ADoxkAABt65t6uA0899.png](https://file.elecfans.com/web2/M00/46/F6/pYYBAGKXDs6ADoxkAABt65t6uA0899.png)
2.5 獲取指定任務(wù)信息
獲取指定任務(wù)信息需要設(shè)置宏configUSE_TRACE_FACILITY == 1,在FreeRTOSconfig.h中。
#define configUSE_TRACE_FACILITY 1 //為1啟用可視化跟蹤調(diào)試
執(zhí)行結(jié)果:
![pYYBAGKXD0GAasBxAAArvYnoq50322.png](https://file.elecfans.com/web2/M00/46/F6/pYYBAGKXD0GAasBxAAArvYnoq50322.png)
2.6 列表方式獲取任務(wù)詳細(xì)信息
列表方式獲取任務(wù)詳細(xì)信息設(shè)置宏,F(xiàn)reeRTOSconfig.h中。
#define configUSE_TRACE_FACILITY 1 //為1啟用可視化跟蹤調(diào)試
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持動(dòng)態(tài)內(nèi)存申請(qǐng)
執(zhí)行結(jié)果:
![pYYBAGKXD42AH4zYAAAUVxt7oEw075.png](https://file.elecfans.com/web2/M00/46/F6/pYYBAGKXD42AH4zYAAAUVxt7oEw075.png)
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6899瀏覽量
123801 -
STM32
+關(guān)注
關(guān)注
2273文章
10926瀏覽量
357767 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62414
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
FreeRTOS嵌入式實(shí)時(shí)操作系統(tǒng)
![<b class='flag-5'>FreeRTOS</b>嵌入式<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>](https://file1.elecfans.com//web2/M00/A5/B2/wKgZomUMOaiABurJAAH1RuVQWuQ285.jpg)
實(shí)時(shí)操作系統(tǒng)FreeRTOS移植教程
![<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>FreeRTOS</b>移植教程](https://file.elecfans.com//web2/M00/46/ED/pYYBAGKW5TKAEajzAAC3WuySeuE039.png)
【案例分享】FreeRTOS的嵌入式實(shí)時(shí)操作系統(tǒng)的實(shí)現(xiàn)
請(qǐng)問(wèn)freertos是硬實(shí)時(shí)操作系統(tǒng)嗎?
FreeRTOS實(shí)時(shí)操作系統(tǒng)
實(shí)時(shí)多任務(wù)操作系統(tǒng)(RTOS)
為什么要在單片機(jī)中使用實(shí)時(shí)多任務(wù)操作系統(tǒng)
嵌入式實(shí)時(shí)操作系統(tǒng)FreeRTOS基本概述
基于FreeRTOS的嵌入式實(shí)時(shí)操作系統(tǒng)的原理和實(shí)現(xiàn)
什么是操作系統(tǒng)?FreeRTOS中文實(shí)用教程讓你快速入門FreeRTOS
![什么是<b class='flag-5'>操作系統(tǒng)</b>?<b class='flag-5'>FreeRTOS</b>中文實(shí)用教程讓你快速入門<b class='flag-5'>FreeRTOS</b>](https://file.elecfans.com/web1/M00/63/DD/o4YBAFuY1ZKAJrXtAABd58heXBE927.png)
嵌入式實(shí)時(shí)操作系統(tǒng)FreeRTOS在ARM7上移植實(shí)現(xiàn)
![嵌入式<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>FreeRTOS</b>在ARM7上移植實(shí)現(xiàn)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32-初學(xué)FreeRTOS操作系統(tǒng)
![STM32-初學(xué)<b class='flag-5'>FreeRTOS</b><b class='flag-5'>操作系統(tǒng)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
FreeRTOS:一個(gè)迷你的實(shí)時(shí)操作系統(tǒng)內(nèi)核
![<b class='flag-5'>FreeRTOS</b>:一個(gè)迷你的<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>內(nèi)核](https://file1.elecfans.com/web2/M00/8B/B5/wKgZomSdSn6AfapKAAC9H46ZAvo324.jpg)
FreeRTOS實(shí)時(shí)操作系統(tǒng)簡(jiǎn)述
![<b class='flag-5'>FreeRTOS</b><b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>簡(jiǎn)述](https://file1.elecfans.com/web2/M00/A5/21/wKgaomUJJheAd2gfAAA5nzjMqM0522.png)
實(shí)時(shí)操作系統(tǒng)之RT-Thread及FreeRTOS
![<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>之RT-Thread及<b class='flag-5'>FreeRTOS</b>](https://file.elecfans.com/web2/M00/20/B3/pYYBAGGfNNmAK-PZAAJsGM5Cgk0227.jpg)
評(píng)論