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
//用于给获取任务函数提供时间基准#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 //支持动态内存申请 执行结果:
海信激光显示公司获评“碳中和先锋企业”,一年三获绿色低碳大奖
指纹识别成为手机标配的原因
心动!华为首款运动手环开卖只要298元:50米防水不惧海水
使用安全设备时还会产生风险吗
电力电子系统的组成_电力电子技术的应用
实时操作系统FreeRTOS应用之任务调试信息获取
端侧大模型到通用智能体——智能手机AI进化的下一场革命(一)
对象存储提供的五个主要优点
顺丰的优势是什么,充分了解产品才能更好解决问题
新款MacBook Pro外观向Air看齐?外壳键盘接口逐个看
钽电容器广泛应用于音频电路中
VR眼镜转接器方案,支持同时给电脑手机设备及VR供电!
长城汽车重庆智慧工厂真正实现了数字化和自动化高效结合的智能制造
怎么判断主板电池没电_主板电池会自动充电吗
奋达流金岁月R9评测 生活充满了回忆
大牛整理Java深入学习路线图
数据科学工程师需要具有哪些知识
如何降低网络安全漏洞被利用的风险
Elyland推出一款结合了区块链技术的AR游戏
Mavic无人机以高档的动力马达为用户提供了最长达30分钟的飞行时间