document.write('
')

澳门新莆京在线登录

创作

完善资料让更多小伙伴认识你,还能领取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, //运行状态
eRey, //就绪
eBlocked, //阻塞
eSuspended, //挂起
eDeleted, //删除
eInvalid //无效
} eTaskState;

1.2 查询每个任务运行时间vTaskGetRunTimeStats()

void vTaskGetRunTimeStats( char * pcWriteBuffer )
形参
pcWriteBuffer --- 保存任务时间信息的存储区,存储区要足够大来保存该信息
函数功能
查询每个任务的运行时间。使用此函数需要( configGENERATE_RUN_TIME_STATS == 1 ) && (configUSE_STATS_FORMATTING_FUNCTIONS>0)&&(configSUPPORT_DYNAC_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 0_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();
		(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

收藏 人收藏

    评论

    相关推荐

    Vinix V编写的操作系统

    ./oschina_soft/vinix.zip
    发表于 06-13 09:15 5次 阅读
    Vinix V编写的操作系统

    请问CH561可以跑freeRTOS和MQTT么?      ...
    发表于 06-13 06:05 11次 阅读

    中科创达和中国联通打造全球首例5G端到端多切片方案

    近日召开的中国联通“聚策汇力,启航未来”泛终端技术生态创新论坛上,中科创达软件股份有限公司物联网事业....
    的头像 科技绿洲 发表于 06-12 11:37 403次 阅读

    使用rtthread移植qboot工程的学习笔记

    学习rtthread,在配置qboot时的过程;记录一下自己使用rtthread studio配置q....
    的头像 tian的个人专栏 发表于 06-12 09:55 520次 阅读

    Linux内核社区正式合并LoongArch架构支持代码

    经过龙芯中科与内核社区一年多的紧密合作,北京时间2022年6月4日清晨,Linux内核社区正式合并L....
    的头像 科技绿洲 发表于 06-12 09:18 217次 阅读

    MH32F103ARPT6软硬件兼容STM32F103RCT

    MH2103A(C)xxxx系列使用高性能的32位内核,最高工作频率216 MHz。 内置的存储器包....
    发表于 06-11 15:52 16次 阅读

    板子型号为野火F103指南者,本人在根据课本做点灯实验,将控制RBG小灯的三个引脚定义成了宏,然后写代码将其混合展现出不同的...
    发表于 06-11 00:12 497次 阅读

    1、AUTOSAR的四种功能安全机制虽然AUTOSAR不是一个完整的安全解决方案,但它提供了一些安全机制用于支持安全关键系...
    发表于 06-10 17:33 2241次 阅读

    PWM脉冲宽度调制的基本原理及实现方法

    PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散....
    的头像 凡亿PCB 发表于 06-10 17:06 379次 阅读

    本期是我们新推出的技术问答系列。该系列是针对演示某款产品的功能以及该款产品的一些常见应用问题解答。      ...
    发表于 06-10 17:00 872次 阅读

    W800开发套件鸿蒙系统教程

    要是想听操作系统的多,我会抽1个小时详细讲解下,我2005年2009年做了差不多5年linux内核,....
    发表于 06-10 15:35 48次 阅读

    KUBERNETES的工作原理是什么

    Kubernetes 提供了一个框架,用于部署、管理、扩展和切换分布式容器,这些容器是随依赖项和配置....
    的头像 科技绿洲 发表于 06-10 13:19 157次 阅读

    浪潮信息正式加入Arm SystemReady™ 计划

    日前,作为全球第二的服务器厂商,浪潮信息宣布加入Arm SystemReady™ 计划,并通过了Ar....
    的头像 科技绿洲 发表于 06-10 12:01 202次 阅读

    龙芯自主指令系统架构产学合作协同育人项目正式发布

    近期,龙芯中科2022年产学合作协同育人项目正式通过教育部高教司审核,面向全国本科院校正式发布,相关....
    的头像 科技绿洲 发表于 06-10 11:14 259次 阅读

    简介 RT-THREAD很多应用都是基于文件系统的,像micropython等等,提到文件系统,大家都想到的是SDCARD或者SP...
    发表于 06-10 10:31 244次 阅读

    我现在在使用安富莱的V7开发板,想在这块板子上添加PIN设备驱动。 不过这个板卡上的一部分IO是使用74HC574扩展的。 74...
    发表于 06-10 09:17 374次 阅读

    研华ARK边缘计算系统多款产品与统信操作系统完成产品互认证

    近日,研华ARK边缘计算系统产品通过了统信操作系统的兼容性认证测试。测试表明,ARK-2250、AR....
    发表于 06-09 17:06 542次 阅读

    QX32F103C8T6,内置ARM Cortex-M3为内核的32bit微控制器,最高频率可达72MHz, 内置PLL、内置FLASH、SRA...
    发表于 06-09 17:02 656次 阅读

    RT-Thread专业版实现对于龙芯全系列处理器支持

    近日,在龙芯中科与睿赛德科技的共同努力下,RT-Thread专业版已实现了对LoongArch32和....
    的头像 科技绿洲 发表于 06-09 16:45 501次 阅读

    1、Nuvoton M487USCI之UUART串口接收 前两次做了USCI的UUART打印和UI2C总线设备的读写,本例程测试UU...
    发表于 06-09 14:39 680次 阅读

    普华基础软件入选国家鼓励重点软件企业

    近日,普华基础软件通过2021年度“国家鼓励的重点软件企业”认定,入选企业将享受政府税收优惠等各项扶....
    的头像 科技绿洲 发表于 06-09 10:57 192次 阅读

    软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。 在开始使...
    发表于 06-09 10:40 412次 阅读

    如何提升C编程能力

    GNU C:GNU的C函数库,其实就是glibc,它是Linux上最重要的函数库,它定义了 ANSI....
    的头像 FPGA之家 发表于 06-09 10:24 139次 阅读

    触摸按键原理

    电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快....
    的头像 FPGA之家 发表于 06-09 10:19 157次 阅读

    基于STM32水温控制

    基于STM32水温控制
    发表于 06-08 14:26 123次 阅读

    中科驭数和社区成员推进OpenCloudOS社区生态体系完善

    近日,中科驭数作为初始成员,宣布加入OpenCloudOS操作系统开源社区。
    的头像 科技绿洲 发表于 06-08 11:16 484次 阅读

    LwIP应用开发实战指南-基于野火STM32全系列(M4/7)开发板

    TCP/IP 是一个庞大的协议族,它是众多网络协议的集合,包括:ARP、IP、ICMP、 UDP、....
    发表于 06-08 09:50 9次 阅读

    基于ARM内核的32位高级MCU STM32F4xx中文手册

    本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/....
    发表于 06-08 09:32 33次 阅读

    实时操作系统FreeRTOS信号量应用

    二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常相似,但还是有细微差别,互斥信号量拥有优....
    的头像 嵌入式技术 发表于 06-08 09:24 805次 阅读

    实时操作系统FreeRTOS移植教程

    Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是....
    的头像 嵌入式技术 发表于 06-08 09:23 555次 阅读

    STM32CubeIDE入门教程 STM32CubeIDE安装使用教程

    STM32CubeIDE是一个高级C / C ++开发平台,具有用于STM32微控制器和微处理器的外....
    的头像 嵌入式技术 发表于 06-08 09:19 581次 阅读

    STM32F10x低功耗之待机模式详解

    STM32F10x待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节....
    的头像 嵌入式技术 发表于 06-08 09:16 620次 阅读

    工具                      &nb...
    发表于 06-08 07:55 237次 阅读

    统信软件发起UOS主动安全防护计划

    作为国内自主操作系统领头羊,统信软件在生态建设和应用落地上始终走在行业前列,为我国数字经济发展和行业....
    的头像 科技绿洲 发表于 06-07 17:07 284次 阅读

    AWS无服务器平台部署云解决方案

      无服务器服务使应用程序更容易扩展和更快地开发,而无需管理典型的基于服务器的基础设施。开发人员可以....
    的头像 星星科技指导员 发表于 06-07 17:04 255次 阅读

    《FreeRTOS 内核实现与应用开发实战—基于STM32》

    完整的RTOS开发教程
    发表于 06-07 15:29 9次 阅读

    watchOS 9通过各项全新功能乐享生活

    watchOS 9是最先进的可穿戴操作系统,通过各项全新功能进一步保持紧密联系乐享健康生活。
    发表于 06-07 14:54 153次 阅读

    环旭电子与客户共同开发云端通信网关产品

    近期,环旭电子与客户共同开发出一款云端通信网关产品,可将火灾报警系统的讯息透过有线网络(POTS,P....
    的头像 科技绿洲 发表于 06-07 11:39 160次 阅读

    渊亭科技DataExa系列通过统信服务器操作系统兼容性认证测试

    近日,渊亭科技自主研发的智能防务体系产品及DataExa系列人工智能产品的8款产品,通过了统信服务器....
    的头像 科技绿洲 发表于 06-07 11:24 160次 阅读

    5分钟看完苹果WWDC2022大会

    6月7日凌晨1点,苹果WWDC22澳门新莆京在线登录大会正式召开,本次发布会上iOS 16、M2芯片、MacBo....
    发表于 06-07 09:31 455次 阅读

    九联科技Unionpi Tiger开发板顺利通过OpenAtom OpenHarmony兼容性测评

    Unionpi Tiger(A311D)开发板,支持 OpenHarmony 标准系统,支持 4K ....
    的头像 OpenAtom OpenHarmony 发表于 06-07 09:25 123次 阅读

    嵌入式系统如何实现功能安全和信息安全

    嵌入式系统是基于计算机科学与技术,并以应用为核心,其软硬件能够进行裁减,适用于要求比较严格的专用计算....
    的头像 ETAS易特驰 发表于 06-07 09:15 128次 阅读

    STM32简易多级菜单(数组查表法)显示方法

    本篇介绍了一种简易的多级菜单的显示方法,本质是通过数组查表,实现各级菜单的各个页面(状态)的切换(跳....
    的头像 码农爱学习 发表于 06-07 09:11 2552次 阅读

    STM32外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序

    本篇介绍了如何在STM32上外接温湿度DHT11实现温湿度数据的读取,并通过OLED进行数据显示。
    的头像 码农爱学习 发表于 06-07 09:09 2947次 阅读

    哪些开发板可以运行linux stm32可以吗

    FS-MP1A开发板是华清远见最新自主研发的一款高品质、高性价比的linux+单片机二合一开发板。搭....
    的头像 嵌入式应用开发 发表于 06-07 09:06 170次 阅读

    STM32移植U8g2图形库的方法 实现OLED图形显示

    本篇介绍了如何将U8g2图形库移植到STM32中。
    的头像 码农爱学习 发表于 06-07 08:29 2563次 阅读

    国产深度学习框架的挑战和机会

    电子发烧友网报道(文/李弯弯)深度学习框架是一种底层开发工具,是集深度学习核心训练和推理框架、基础模....
    的头像 Carol Li 发表于 06-07 00:01 998次 阅读

    STM32开发板介绍及使用

    32
    发表于 06-06 17:00 14次 阅读

    CAST-32方法为多核处理器打开了大门

      除了识别干扰信道之外,CAST-32A 论文还需要对每个核心的资源使用情况进行分析。例如,申请人....
    的头像 星星科技指导员 发表于 06-06 16:10 254次 阅读

    上海积梦智能正式加入欧拉开源社区

    近日,上海积梦智能科技有限公司宣布签署 CLA(Contributor License Agreem....
    的头像 科技绿洲 发表于 06-06 15:12 384次 阅读

    中文RT-Thread物联网操作系统介绍

      RT-Thread 主要用 C 语言编写,易于理解,易于移植。它将面向对象的编程方法应用于实时系....
    的头像 星星科技指导员 发表于 06-06 11:52 173次 阅读

    Demo_OLED_STM32F103ZET6软件

    Demo_OLED_STM32F103ZET6软件
    发表于 06-06 11:20 16次 阅读

    关于STM32存储的堆栈地址

    系统会给每个程序分配一部分栈空间让他们能够运行起来,问题就是栈空间必然存在不够用的问题,而堆不属于程....
    的头像 要长高 发表于 06-05 16:37 486次 阅读

    I-Pi SMARC套件可加速工业应用的原型开发

      当您准备从原型过渡到生产时,I-Pi Carrier的开源规范可以作为希望创建自己的载体的开发人....
    的头像 星星科技指导员 发表于 06-02 16:39 888次 阅读

    抢占式内核和非抢占式内核的内容

    非抢占式内核的优点之一是中断延迟更低,在任务级别,非抢占内核也可以使用不可重入函数。每个任务都可以使....
    的头像 strongerHuang 发表于 06-02 14:35 120次 阅读

    简单实用的IO输入输出框架

    如果说硬件可以一次成型,那么随便一份代码都可以完成IO的配置工作,但研发阶段的产品,硬件各种修改是难....
    的头像 硬件攻城狮 发表于 06-02 14:12 152次 阅读

    FreeRtos入门手册中文版

    全中文FreeRtos详解,学习入门精通。
    发表于 06-02 11:13 49次 阅读

    嵌入式技术

    文章:51 被阅读:80280

    关注 7人关注
    必威体育官网下载 365bet下载地址苹果版 永利app下载 必威体育注册 必威体育betway登录手机 365bet客户端下载 金沙彩票app 必威苹果客户端下载 必威体育app手机版 金沙彩票手机版下载 新澳门葡京网站多少 必威体育betway登录手机 必威体育app官方版下载 必威体育app官方版下载 必威betway中文版 澳门新莆京在线登录 必威体育betway登录手机 必威体育官网下载 澳门威尼斯人网上娱乐 必威登录网页版登录注册 必威体育app手机版 必威体育appios下载 金沙彩票app下载安装 365bet官方下载苹果版 365bet下载地址苹果版 澳门新莆京在线登录 Betway必威中文官网 365betapp苹果版下载 Betway必威中文官网 必威体育app官方版下载