1.任務相關函數
1.1獲取任務狀態函數vTaskGetInfo()
void vTaskGetInfo( TaskHandle_t xTask,TaskStatus_t * pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
函數功能:獲取指定任務的狀態,任務狀態信息保存在pxTaskStatus中。 任務信息結構體TaskStatus_t
typedef struct xTASK_STATUS 任務狀態 eTaskState
typedef enum |
1.2 查詢每個任務運行時間vTaskGetRunTimeStats()
void vTaskGetRunTimeStats( char * pcWriteBuffer ) 形參 pcWriteBuffer --- 保存任務時間信息的存儲區,存儲區要足夠大來保存該信息 函數功能 查詢每個任務的運行時間。使用此函數需要( configGENERATE_RUN_TIME_STATS == 1 ) && (configUSE_STATS_FORMATTING_FUNCTIONS>0)&&(configSUPPORT_DYNAMIC_ALLOCATION == 1 ) 若 configGENERATE_RUN_TIME_STATS==1 的話還需要設置下面宏。 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(), 此宏用來初始化一個外設給統計功能提供時間基準,一般采用定時器。這個時基的分辯率一定要高于FreeRTOS的系統時鐘,一般這個時基的時間精度比系統時鐘高10~20倍就可以了。 portGET_RUN_TIME_COUNTER_VALUE 或portALT_GET_RUN_TIME_COUNTER_VALUE這二者實現其中一個,這兩個宏用于提供當前時基的時間值。 |
1.3 查詢任務詳細信息vTaskList()
void vTaskList( char * pcWriteBuffer )
函數功能:查詢任務任務詳細信息,使用此函數( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )&&( configSUPPORT_DYNAMIC_ALLOCATION == 1 )。 |
2 示例
2.1 創建任務
#define START_TASK_PRIO 1 //任務優先級
#define START_STK_SIZE 128 //任務堆棧大小
TaskHandle_t StartTask_Handler; //任務句柄
void start_task(void *pvParameters);//任務函數
#define LED0_TASK_PRIO 2 //任務優先級,數字越大優先級越高
#define LED0_STK_SIZE 128 //任務堆棧大小
TaskHandle_t LED0Task_Handler; //任務句柄
void LED0_task(void); //任務函數
#define Quer_TASK_PRIO 2 //任務優先級
#define Quer_STK_SIZE 128 //任務堆棧大小
TaskHandle_t QuerTask_Handler; //任務句柄
void Query_task(void); //任務函數
int main()
{
Beep_Init();//蜂鳴器初始化
LED_Init();//LED初始化
KEY_Init();
Usart1_Init(115200);//串口1初始化
/*創建任務*/
xTaskCreate((TaskFunction_t)start_task,//任務函數
(const char *)"start_task",//任務名稱
(uint16_t)START_STK_SIZE,//堆棧大小
NULL, //傳遞給任務函數的參數
(UBaseType_t)START_TASK_PRIO,//任務優先級
(TaskHandle_t *)&StartTask_Handler//任務句柄
);
vTaskStartScheduler(); //開啟任務調度
}
/*開始任務函數*/
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //進入臨界區
//創建LED0任務
xTaskCreate( (TaskFunction_t )LED0_task,//任務函數
(const char *)"LED0_task",//任務名稱
(uint16_t)LED0_STK_SIZE,//堆棧大小
NULL, //傳遞給任務函數的參數
(UBaseType_t )LED0_TASK_PRIO,//任務優先級
(TaskHandle_t *)&LED0Task_Handler);//任務句柄
xTaskCreate( (TaskFunction_t )Query_task,//任務函數
(const char *)"Query_task",//任務名稱
(uint16_t )Quer_STK_SIZE,//堆棧大小
NULL, //傳遞給任務函數的參數
(UBaseType_t )Quer_TASK_PRIO,//任務優先級
(TaskHandle_t *)&QuerTask_Handler);//任務句柄
vTaskDelete(StartTask_Handler); //刪除開始任務
taskEXIT_CRITICAL(); //退出臨界區
}
2.2 任務1 程序正常運行LED指示燈
void LED0_task(void)
{
while(1)
{
LED1=!LED1;
Delay_Ms(500);
}
}
2.3 任務2:通過按鍵查詢任務狀態
char RunTimeInfo[400];//保存任務信息
void Query_task(void)//任務函數
{
u8 key;
TaskStatus_t task_info;//保存任務信息
while(1)
{
key=KEY_GetVal();
if(key==1)//獲取任務運行時間,任務運行時間FreeRTOSRunTimeTicks*50us
{
memset(RunTimeInfo,0,400);
vTaskGetRunTimeStats(RunTimeInfo);//獲取每個任務運行時間
printf("%s\r\n",RunTimeInfo);
}
if(key==2)//獲取任務狀態
{
vTaskGetInfo(NULL,&task_info,pdTRUE,eInvalid);//獲取當前任務狀態
printf("task name:%s\r\n",task_info.pcTaskName);//任務名
printf("task num:%ld\r\n",task_info.xTaskNumber);//任務編號
printf("task stat:%d\r\n",task_info.eCurrentState);//任務狀態
printf("task baseaddr:%p\r\n",task_info.pxStackBase);//任務堆棧基地址
printf("task priority:%ld\r\n",task_info.uxBasePriority);//任務基礎優先級
printf("tast now priority:%ld\r\n",task_info.uxCurrentPriority);//任務當前優先級
printf("tast memory size:%d\r\n",task_info.usStackHighWaterMark);//任務歷史剩余堆棧最小空間
printf("tast time:%d\r\n",task_info.ulRunTimeCounter);//任務運行總時間
}
if(key==3)//查詢任務詳細信息
{
memset(RunTimeInfo,0,400);
vTaskList(RunTimeInfo);//獲取任務狀態信息
printf("%s\r\n",RunTimeInfo);
}
Delay_Ms(10);
}
}
2.4 獲取任務運行時間
(1)獲取任務運行時間時需要提供時間基準,要設置相應的宏,在FreeRTOSconfig.h中
#define configGENERATE_RUN_TIME_STATS 1 //為1時啟用運行時間統計功能
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持動態內存申請
(2)提供相應時間基準函數,在timer.h中。
設置時間基準函數用戶只需要產生時基單元,設置好相關的宏,不需要用戶調用。在設置時間基準需要保證該時間基準的頻率高于FreeRTOS系統頻率,要是系統頻率的10~20倍。
本示例的FreeRTOS系統頻率為configTICK_RATE_HZ ( ( TickType_t ) 1000 ) ,也就是FreeRTOS系統時間為1ms,所以獲取任務運行時間的時間基準為50us。
/*******用于給FreeRTOS計算任務運行時間提供時間基準*******/
volatile unsigned long long FreeRTOSRunTimeTicks;
void ConfigureTimeForRunTimeStas(void)//不需要用戶調用,只需實現功能即可
{
FreeRTOSRunTimeTicks=0;
Tim1_Init(72,50);//初始化定時器1,周期50us,cnt+1時間為1us
}
void TIM1_UP_IRQHandler(void)
{
if(TIM1->SR&1<<0)
{
FreeRTOSRunTimeTicks++;//運行時間統計基數計數器+1
}
TIM1->SR=0;//清除標志
}
(3)通過#define進行宏定義,給獲取任務時間函數vTaskGetRunTimeStats()提供時間基準接口。在FreeRTOSconfig.h中。
//用于給獲取任務函數提供時間基準
#defineportCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimeForRunTimeStas()
//用于提供當前時間基準變量 unsigned long long類型
#define portGET_RUN_TIME_COUNTER_VALUE() FreeRTOSRunTimeTicks
獲取任務運行時間

2.5 獲取指定任務信息
獲取指定任務信息需要設置宏configUSE_TRACE_FACILITY == 1,在FreeRTOSconfig.h中。
#define configUSE_TRACE_FACILITY 1 //為1啟用可視化跟蹤調試
執行結果:

2.6 列表方式獲取任務詳細信息
列表方式獲取任務詳細信息設置宏,FreeRTOSconfig.h中。
#define configUSE_TRACE_FACILITY 1 //為1啟用可視化跟蹤調試
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持動態內存申請
執行結果:

-
操作系統
+關注
關注
37文章
7097瀏覽量
124974 -
STM32
+關注
關注
2290文章
11017瀏覽量
362469 -
FreeRTOS
+關注
關注
12文章
490瀏覽量
63782
發布評論請先 登錄
FreeRTOS嵌入式實時操作系統

實時操作系統FreeRTOS移植教程

【案例分享】FreeRTOS的嵌入式實時操作系統的實現
FreeRTOS實時操作系統
為什么要在單片機中使用實時多任務操作系統
基于FreeRTOS的嵌入式實時操作系統的原理和實現
什么是操作系統?FreeRTOS中文實用教程讓你快速入門FreeRTOS

嵌入式實時操作系統FreeRTOS在ARM7上移植實現

STM32-初學FreeRTOS操作系統

FreeRTOS實時操作系統簡述

實時操作系統之RT-Thread及FreeRTOS

評論