女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

實時操作系統FreeRTOS應用之任務調試信息獲取

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-06-08 09:12 ? 次閱讀

1.任務相關函數

1.1獲取任務狀態函數vTaskGetInfo()

void vTaskGetInfo( TaskHandle_t xTask,TaskStatus_t * pxTaskStatus,

BaseType_t xGetFreeStackSpace, eTaskState eState );

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

任務信息結構體TaskStatus_t

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

任務狀態 eTaskState

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

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 )
形參:
char * pcWriteBuffer -- 保存任務狀態信息。

函數功能:查詢任務任務詳細信息,使用此函數( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )&&( configSUPPORT_DYNAMIC_ALLOCATION == 1 )。
表信息包括任務名稱、任務狀態、優先級、堆棧剩余空間大小、任務編號
任務狀態: 運行狀態(X)、阻塞(B)、就緒(R)、刪除(D)、掛起(S)
任務編號:這個編碼每個任務都是唯一的,當多個任務使用同一任務名時可以通過此編號來區分。

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 

獲取任務運行時間

pYYBAGKXDs6ADoxkAABt65t6uA0899.png

2.5 獲取指定任務信息

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

#define configUSE_TRACE_FACILITY	1       //為1啟用可視化跟蹤調試

執行結果:

pYYBAGKXD0GAasBxAAArvYnoq50322.png

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

列表方式獲取任務詳細信息設置宏,FreeRTOSconfig.h中。

#define configUSE_TRACE_FACILITY	1       //為1啟用可視化跟蹤調試
#define configUSE_STATS_FORMATTING_FUNCTIONS	1 
#define configSUPPORT_DYNAMIC_ALLOCATION     1      //支持動態內存申請

執行結果:

pYYBAGKXD42AH4zYAAAUVxt7oEw075.png

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

    關注

    37

    文章

    7097

    瀏覽量

    124974
  • STM32
    +關注

    關注

    2290

    文章

    11017

    瀏覽量

    362469
  • FreeRTOS
    +關注

    關注

    12

    文章

    490

    瀏覽量

    63782
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    FreeRTOS嵌入式實時操作系統

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

    實時操作系統FreeRTOS移植教程

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

    【案例分享】FreeRTOS的嵌入式實時操作系統的實現

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

    請問freertos是硬實時操作系統嗎?

    freertos是硬實時操作系統嗎?都有哪些硬實時操作系統啊?
    發表于 06-13 09:00

    FreeRTOS實時操作系統

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

    實時任務操作系統(RTOS)

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

    為什么要在單片機中使用實時任務操作系統

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

    嵌入式實時操作系統FreeRTOS基本概述

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

    基于FreeRTOS的嵌入式實時操作系統的原理和實現

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

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

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

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

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

    STM32-初學FreeRTOS操作系統

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

    FreeRTOS:一個迷你的實時操作系統內核

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

    FreeRTOS實時操作系統簡述

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

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

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