一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

實時操作系統(tǒng)FreeRTOS應用之任務調(diào)試信息獲取

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-06-08 09:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.任務相關(guān)函數(shù)

1.1獲取任務狀態(tài)函數(shù)vTaskGetInfo()

void vTaskGetInfo( TaskHandle_t xTask,TaskStatus_t * pxTaskStatus,

BaseType_t xGetFreeStackSpace, eTaskState eState );

函數(shù)功能:獲取指定任務的狀態(tài),任務狀態(tài)信息保存在pxTaskStatus中。
使用此函數(shù)需要configUSE_TRACE_FACILITY == 1
形參:
xTask 要獲取的任務句柄
pxTaskStatus 任務信息結(jié)構(gòu)體變量
xGetFreeStackSpace 常設置為pdTRUE,用來檢測堆??臻g歷史剩余最小值。值越小說明越近堆棧溢出。
eState 保存任務運行狀態(tài)。獲取任務運行狀態(tài)時間比較長,為了加快vTaskGetInfo函數(shù)執(zhí)行可直接將 TaskStatus_t中的字段eCurrentState就可以由用戶直接賦值,參數(shù)eState就是要賦的值。若不考 慮時間因素,可以直接將eState設置為eInvalid,這樣任務狀態(tài)信息就由函數(shù)vTaskGetInfo去獲取。
返回值 無。

任務信息結(jié)構(gòu)體TaskStatus_t

typedef struct xTASK_STATUS
{
TaskHandle_t xHandle; //任務句柄
const char *pcTaskName ; //任務名稱
UBaseType_t xTaskNumber; //任務編號
eTaskState eCurrentState; // 當前任務狀態(tài), eTaskState是枚舉類型
UBaseType_t uxCurrentPriority; //當前優(yōu)先級
UBaseType_t uxBasePriority; //任務基礎優(yōu)先級
uint32_t ulRunTimeCounter; //任務運行總時間
StackType_t *pxStackBase; //任務堆?;刂?
configSTACK_DEPTH_TYPE usStackHighWaterMark;//從任務創(chuàng)建以來任務堆棧剩余的最小值,值越小接近 0越有溢出風險
} TaskStatus_t;

任務狀態(tài) eTaskState

typedef enum
{
eRunning = 0, //運行狀態(tài)
eReady, //就緒
eBlocked, //阻塞
eSuspended, //掛起
eDeleted, //刪除
eInvalid //無效
} eTaskState;

1.2 查詢每個任務運行時間vTaskGetRunTimeStats()

void vTaskGetRunTimeStats( char * pcWriteBuffer )
形參
pcWriteBuffer --- 保存任務時間信息的存儲區(qū),存儲區(qū)要足夠大來保存該信息
函數(shù)功能
查詢每個任務的運行時間。使用此函數(shù)需要( 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(), 此宏用來初始化一個外設給統(tǒng)計功能提供時間基準,一般采用定時器。這個時基的分辯率一定要高于FreeRTOS的系統(tǒng)時鐘,一般這個時基的時間精度比系統(tǒng)時鐘高10~20倍就可以了。
portGET_RUN_TIME_COUNTER_VALUE 或portALT_GET_RUN_TIME_COUNTER_VALUE這二者實現(xiàn)其中一個,這兩個宏用于提供當前時基的時間值。

1.3 查詢?nèi)蝿赵敿毿畔TaskList()

void vTaskList( char * pcWriteBuffer )
形參:
char * pcWriteBuffer -- 保存任務狀態(tài)信息。

函數(shù)功能:查詢?nèi)蝿杖蝿赵敿毿畔ⅲ褂么撕瘮?shù)( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )&&( configSUPPORT_DYNAMIC_ALLOCATION == 1 )。
表信息包括任務名稱、任務狀態(tài)、優(yōu)先級、堆棧剩余空間大小、任務編號
任務狀態(tài): 運行狀態(tài)(X)、阻塞(B)、就緒(R)、刪除(D)、掛起(S)
任務編號:這個編碼每個任務都是唯一的,當多個任務使用同一任務名時可以通過此編號來區(qū)分。

2 示例

2.1 創(chuàng)建任務

#define START_TASK_PRIO 1        //任務優(yōu)先級
#define START_STK_SIZE 128       //任務堆棧大小
TaskHandle_t StartTask_Handler;   //任務句柄
void start_task(void *pvParameters);//任務函數(shù)

#define LED0_TASK_PRIO 2     //任務優(yōu)先級,數(shù)字越大優(yōu)先級越高
#define LED0_STK_SIZE 128     //任務堆棧大小
TaskHandle_t LED0Task_Handler; //任務句柄
void LED0_task(void);         //任務函數(shù)

#define Quer_TASK_PRIO 2     //任務優(yōu)先級
#define Quer_STK_SIZE 128      //任務堆棧大小
TaskHandle_t QuerTask_Handler; //任務句柄
void Query_task(void);          //任務函數(shù)
int main()
{
	Beep_Init();//蜂鳴器初始化
	LED_Init();//LED初始化
	KEY_Init();
	Usart1_Init(115200);//串口1初始化
	/*創(chuàng)建任務*/
	xTaskCreate((TaskFunction_t)start_task,//任務函數(shù)
							(const char *)"start_task",//任務名稱	
							(uint16_t)START_STK_SIZE,//堆棧大小
							NULL,           //傳遞給任務函數(shù)的參數(shù)
							(UBaseType_t)START_TASK_PRIO,//任務優(yōu)先級
							(TaskHandle_t *)&StartTask_Handler//任務句柄
							);
	vTaskStartScheduler();     //開啟任務調(diào)度		
}
/*開始任務函數(shù)*/
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();  //進入臨界區(qū)
	//創(chuàng)建LED0任務
	xTaskCreate( (TaskFunction_t  )LED0_task,//任務函數(shù)
				(const char    *)"LED0_task",//任務名稱
				 (uint16_t)LED0_STK_SIZE,//堆棧大小
					NULL,           //傳遞給任務函數(shù)的參數(shù)
				 (UBaseType_t   )LED0_TASK_PRIO,//任務優(yōu)先級
				 (TaskHandle_t *)&LED0Task_Handler);//任務句柄
	xTaskCreate(  (TaskFunction_t )Query_task,//任務函數(shù)
				(const char    *)"Query_task",//任務名稱
				(uint16_t )Quer_STK_SIZE,//堆棧大小
				NULL,           //傳遞給任務函數(shù)的參數(shù)
				(UBaseType_t    )Quer_TASK_PRIO,//任務優(yōu)先級
				(TaskHandle_t  *)&QuerTask_Handler);//任務句柄
	vTaskDelete(StartTask_Handler); //刪除開始任務	
	taskEXIT_CRITICAL();            //退出臨界區(qū)						
}

2.2 任務1 程序正常運行LED指示燈

void LED0_task(void)
{
	while(1)
	{
		LED1=!LED1;
		Delay_Ms(500);
	}
}

2.3 任務2:通過按鍵查詢?nèi)蝿諣顟B(tài)

char RunTimeInfo[400];//保存任務信息
void Query_task(void)//任務函數(shù)
{
	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)//獲取任務狀態(tài)
		{
			vTaskGetInfo(NULL,&task_info,pdTRUE,eInvalid);//獲取當前任務狀態(tài)
			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);//任務狀態(tài)
			printf("task baseaddr:%p\r\n",task_info.pxStackBase);//任務堆?;刂?			printf("task priority:%ld\r\n",task_info.uxBasePriority);//任務基礎優(yōu)先級
			printf("tast now priority:%ld\r\n",task_info.uxCurrentPriority);//任務當前優(yōu)先級
			printf("tast memory size:%d\r\n",task_info.usStackHighWaterMark);//任務歷史剩余堆棧最小空間
			printf("tast time:%d\r\n",task_info.ulRunTimeCounter);//任務運行總時間	
		}
		if(key==3)//查詢?nèi)蝿赵敿毿畔?		{
			memset(RunTimeInfo,0,400);
			vTaskList(RunTimeInfo);//獲取任務狀態(tài)信息
			printf("%s\r\n",RunTimeInfo);
		}
		Delay_Ms(10);
	}
}

2.4 獲取任務運行時間

(1)獲取任務運行時間時需要提供時間基準,要設置相應的宏,在FreeRTOSconfig.h中

#define configGENERATE_RUN_TIME_STATS	   1     //為1時啟用運行時間統(tǒng)計功能 
#define configUSE_STATS_FORMATTING_FUNCTIONS   1
#define configSUPPORT_DYNAMIC_ALLOCATION     1        //支持動態(tài)內(nèi)存申請

(2)提供相應時間基準函數(shù),在timer.h中。
設置時間基準函數(shù)用戶只需要產(chǎn)生時基單元,設置好相關(guān)的宏,不需要用戶調(diào)用。在設置時間基準需要保證該時間基準的頻率高于FreeRTOS系統(tǒng)頻率,要是系統(tǒng)頻率的10~20倍。
本示例的FreeRTOS系統(tǒng)頻率為configTICK_RATE_HZ ( ( TickType_t ) 1000 ) ,也就是FreeRTOS系統(tǒng)時間為1ms,所以獲取任務運行時間的時間基準為50us。

/*******用于給FreeRTOS計算任務運行時間提供時間基準*******/
volatile unsigned long long FreeRTOSRunTimeTicks;
void ConfigureTimeForRunTimeStas(void)//不需要用戶調(diào)用,只需實現(xiàn)功能即可
{
	FreeRTOSRunTimeTicks=0;
	Tim1_Init(72,50);//初始化定時器1,周期50us,cnt+1時間為1us
}
void TIM1_UP_IRQHandler(void)
{
	if(TIM1->SR&1<<0)
	{
		FreeRTOSRunTimeTicks++;//運行時間統(tǒng)計基數(shù)計數(shù)器+1
	}
	TIM1->SR=0;//清除標志	
}

(3)通過#define進行宏定義,給獲取任務時間函數(shù)vTaskGetRunTimeStats()提供時間基準接口。在FreeRTOSconfig.h中。

//用于給獲取任務函數(shù)提供時間基準
#defineportCONFIGURE_TIMER_FOR_RUN_TIME_STATS()  ConfigureTimeForRunTimeStas() 
//用于提供當前時間基準變量 unsigned long long類型
#define portGET_RUN_TIME_COUNTER_VALUE()  FreeRTOSRunTimeTicks 

獲取任務運行時間

pYYBAGKXDs6ADoxkAABt65t6uA0899.png

2.5 獲取指定任務信息

獲取指定任務信息需要設置宏configUSE_TRACE_FACILITY == 1,在FreeRTOSconfig.h中。

#define configUSE_TRACE_FACILITY	1       //為1啟用可視化跟蹤調(diào)試

執(zhí)行結(jié)果:

pYYBAGKXD0GAasBxAAArvYnoq50322.png

2.6 列表方式獲取任務詳細信息

列表方式獲取任務詳細信息設置宏,F(xiàn)reeRTOSconfig.h中。

#define configUSE_TRACE_FACILITY	1       //為1啟用可視化跟蹤調(diào)試
#define configUSE_STATS_FORMATTING_FUNCTIONS	1 
#define configSUPPORT_DYNAMIC_ALLOCATION     1      //支持動態(tài)內(nèi)存申請

執(zhí)行結(jié)果:

pYYBAGKXD42AH4zYAAAUVxt7oEw075.png

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

    關(guān)注

    37

    文章

    7152

    瀏覽量

    125595
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    365008
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    493

    瀏覽量

    64359
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    FreeRTOS嵌入式實時操作系統(tǒng)

      1 FreeRTOS操作系統(tǒng)功能   作為一個輕量級的操作系統(tǒng),FreeRTOS提供的功能包括:任務管理、時間管理、信號量、消息隊列、
    發(fā)表于 07-06 11:07 ?6742次閱讀
    <b class='flag-5'>FreeRTOS</b>嵌入式<b class='flag-5'>實時</b><b class='flag-5'>操作系統(tǒng)</b>

    實時操作系統(tǒng)FreeRTOS移植教程

    Free 即免費的,RTOS 全稱是 Real Time Operating System,中文就是實時操作系統(tǒng)。注意,RTOS 不是指某一個確定的系統(tǒng),而是指一類系統(tǒng)。比如 uC/O
    的頭像 發(fā)表于 06-08 09:23 ?9630次閱讀
    <b class='flag-5'>實時</b><b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>FreeRTOS</b>移植教程

    【案例分享】FreeRTOS的嵌入式實時操作系統(tǒng)的實現(xiàn)

    FreeRTOS是一個源碼公開的免費的嵌入式實時操作系統(tǒng),通過研究其內(nèi)核可以更好地理解嵌入式操作系統(tǒng)的實現(xiàn)原理.本文主要闡述FreeRTOS
    發(fā)表于 07-23 04:30

    請問freertos是硬實時操作系統(tǒng)嗎?

    freertos是硬實時操作系統(tǒng)嗎?都有哪些硬實時操作系統(tǒng)?。?/div>
    發(fā)表于 06-13 09:00

    FreeRTOS實時操作系統(tǒng)

    FreeRTOS實時操作系統(tǒng),Nabto正在努力建立一個強大的FreeRTOS + Nabto組合的解決方案。我們最新推出AppMyProduct應用平臺可幫助您快速開發(fā)遠程控制設備
    發(fā)表于 08-04 07:58

    實時任務操作系統(tǒng)(RTOS)

    任務、進程和線程。實時任務操作系統(tǒng)(RTOS)是嵌入式應用軟件的基礎和開發(fā)平臺,它是根據(jù)操作系統(tǒng)的工作特性
    發(fā)表于 08-24 06:34

    為什么要在單片機中使用實時任務操作系統(tǒng)

    為什么要在單片機中使用實時任務操作系統(tǒng)該視頻在113分10秒之后,講了實時操作系統(tǒng)的使用價值。老師講得非常好,我就不過多贅述了。(這個視頻
    發(fā)表于 08-24 06:02

    嵌入式實時操作系統(tǒng)FreeRTOS基本概述

    嵌入式實時操作系統(tǒng)FreeRTOS基本概述在嵌入式領(lǐng)域當中,實時操作系統(tǒng)的應用越來越廣泛了,目前嵌入式
    發(fā)表于 02-16 07:12

    基于FreeRTOS的嵌入式實時操作系統(tǒng)的原理和實現(xiàn)

    FreeRTOS是一個源碼公開的免費的嵌入式實時操作系統(tǒng),通過研究其內(nèi)核可以更好地理解嵌入式操作系統(tǒng)的實現(xiàn)原理.本文主要闡述FreeRTOS
    發(fā)表于 11-18 03:34 ?7030次閱讀

    什么是操作系統(tǒng)?FreeRTOS中文實用教程讓你快速入門FreeRTOS

    本文檔的主要內(nèi)容詳細介紹的是什么是操作系統(tǒng)?FreeRTOS中文實用教程讓你快速入門FreeRTOS帶你了解了1.認識操作系統(tǒng) 2.輕松上手RTOS 3.
    發(fā)表于 09-12 16:51 ?280次下載
    什么是<b class='flag-5'>操作系統(tǒng)</b>?<b class='flag-5'>FreeRTOS</b>中文實用教程讓你快速入門<b class='flag-5'>FreeRTOS</b>

    嵌入式實時操作系統(tǒng)FreeRTOS在ARM7上移植實現(xiàn)

    嵌入式實時操作系統(tǒng)FreeRTOS在ARM7上移植實現(xiàn)(嵌入式開發(fā)工程師待遇)-嵌入式實時操作系統(tǒng)Fre
    發(fā)表于 07-30 12:05 ?21次下載
    嵌入式<b class='flag-5'>實時</b><b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>FreeRTOS</b>在ARM7上移植實現(xiàn)

    STM32-初學FreeRTOS操作系統(tǒng)

    freeRTOS實時操作系統(tǒng)之一,特點是多線程,采用“輪換”的方式實現(xiàn)“并行”的效果,操作系統(tǒng)內(nèi)可以建立任務,每個
    發(fā)表于 12-08 14:21 ?14次下載
    STM32-初學<b class='flag-5'>FreeRTOS</b><b class='flag-5'>操作系統(tǒng)</b>

    FreeRTOS:一個迷你的實時操作系統(tǒng)內(nèi)核

    ** 1、FreeRTOS** FreeRTOS是一個迷你的實時操作系統(tǒng)內(nèi)核。作為一個輕量級的操作系統(tǒng),功能包括:
    的頭像 發(fā)表于 06-29 17:15 ?1321次閱讀
    <b class='flag-5'>FreeRTOS</b>:一個迷你的<b class='flag-5'>實時</b><b class='flag-5'>操作系統(tǒng)</b>內(nèi)核

    FreeRTOS實時操作系統(tǒng)簡述

    FreeRTOS是一個為嵌入式系統(tǒng)設計的開源實時操作系統(tǒng)。它提供了一個多任務內(nèi)核和一系列組件功能,適合在資源受限的設備上管理
    發(fā)表于 09-19 12:37 ?2365次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>實時</b><b class='flag-5'>操作系統(tǒng)</b>簡述

    實時操作系統(tǒng)之RT-Thread及FreeRTOS

    RT-Thread與其他很多RTOS如FreeRTOS的主要區(qū)別之一是,它不僅僅是一個實時內(nèi)核,還具備豐富的中間層組件,如下圖所示。FreeRTOS和RT-Thread是兩種常見的嵌入式實時
    的頭像 發(fā)表于 05-29 08:10 ?5203次閱讀
    <b class='flag-5'>實時</b><b class='flag-5'>操作系統(tǒng)</b>之RT-Thread及<b class='flag-5'>FreeRTOS</b>