FreeRTOS学习笔记-基于stm32(7)任务状态查询与任务时间统计API函数

news2025/1/21 15:22:18

1、FreeRTOS任务相关API函数

函数描述
uxTaskPriorityGet()查询某个任务的优先级
vTaskPrioritySet()改变某个任务的任务优先级
uxTaskGetSystemState()获取系统中任务状态
vTaskGetInfo()获取某个任务信息
xTaskGetApplicationTaskTag()获取某个任务的标签(Tag)值
xTaskGetCurrentTaskHandle()获取当前正在运行的任务的任务句柄
xTaskGetHandle()根据任务名字查找某个任务的句柄
xTaskGetIdleTaskHandle()获取空闲任务的任务句柄
uxTaskGetStackHighWaterMark()获取任务的堆栈的历史剩余最小值,FreeRTOS 中叫做“高 水位线”
eTaskGetState()获取某个任务的壮态,这个壮态是 eTaskState 类型
pcTaskGetName()获取某个任务的任务名字
xTaskGetTickCount()获取系统时间计数器值
xTaskGetTickCountFromISR()在中断服务函数中获取时间计数器值
xTaskGetSchedulerState()获取任务调度器的壮态,开启或未开启
uxTaskGetNumberOfTasks()获取当前系统中存在的任务数量
vTaskList()以一种表格的形式输出当前系统中所有任务的详细信 息
vTaskGetRunTimeStats()获取每个任务的运行时间
vTaskSetApplicationTaskTag()设置任务标签(Tag)值。
SetThreadLocalStoragePointer()设置线程本地存储指针
GetThreadLocalStoragePointer()获取线程本地存储指针

2、任务相关API函数的使用

        使用每个API函数的时候,都右键转到定义位置,如下图:

        然后查看函数的使用条件,比如这个函数要使用的话必须将宏 INCLUDE_uxTaskPriorityGet 置1;

        然后以同样的操作转到这个宏的位置将其置1。然后再开始调用API函数

        如下为几个常用API函数的使用:

	uint8_t i=0;
	UBaseType_t priority_num=0;
	UBaseType_t task_num=0;
	UBaseType_t task_num2=0;
	TaskStatus_t * status_array=0;
	TaskStatus_t * status_array2=0;
	TaskHandle_t task_handle=0;
	UBaseType_t task_stack_min=0;
	eTaskState task_state=0;
	char pcWriteBuffer[300];
	
	//获取任务优先级
	priority_num = uxTaskPriorityGet( task2_handler );
	printf("task2的任务优先级=%ld\r\n",priority_num);
	
	//设置任务优先级
	vTaskPrioritySet( task2_handler,6 );
	priority_num = uxTaskPriorityGet( task2_handler );
	printf("task2的任务优先级=%ld\r\n",priority_num);
	
	//获取系统任务数量
	task_num = uxTaskGetNumberOfTasks();
	printf("系统任务数量=%ld\r\n",task_num);
	
	//获取系统所有任务的任务状态信息
	status_array=pvPortMalloc(sizeof(TaskStatus_t)*task_num);
	task_num2 = uxTaskGetSystemState(status_array,task_num,NULL);
	printf("任务名\t\t任务优先级\t\t任务编号\r\n");
	for(i=0;i<task_num2;i++){
		printf("%s\t\t%ld\t%ld\r\n",status_array[i].pcTaskName,
									status_array[i].uxCurrentPriority,
									status_array[i].xTaskNumber);
	}
	
	//获取指定任务的任务状态
	status_array2=pvPortMalloc(sizeof(TaskStatus_t));
	vTaskGetInfo(task2_handler,status_array2,pdTRUE,eInvalid);
	printf("任务名:%s\r\n",status_array2->pcTaskName);
	printf("任务优先级:%ld\r\n",status_array2->uxCurrentPriority);
	printf("任务编号:%ld\r\n",status_array2->xTaskNumber);
	printf("任务状态:%d\r\n",status_array2->eCurrentState);
	
	//根据任务名获取任务句柄
	task_handle = xTaskGetHandle("task2");
	printf("任务句柄为:%#x\r\n",(int)task_handle);
	printf("任务句柄为:%#x\r\n",(int)task2_handler);
	
	//查询某个任务的运行状态
	task_state = eTaskGetState(task2_handler);
	printf("task2的任务状态为%d\r\n",task_state);
	
	//获取系统中任务信息
	vTaskList(pcWriteBuffer);
	printf("%s\r\n",pcWriteBuffer);

3、任务时间统计API函数 vTaskGetRunTimeStats()

void vTaskGetRunTimeStats( char *pcWriteBuffer )

        该函数与获取系统任务信息类似,参数是一个数组用来存放任务信息。如下代码是统计系统任务的运行时间并打印出来。

void task2( void * pvParameters )
{
	u8 key=0;
	while(1)
	{
		key=KEY_Scan(0);
		if(key==KEY1_PRES){
			vTaskGetRunTimeStats(pcWriteBuffer);
			printf("任务名\t\t\t运行时间\t运行所占百分比\r\n");
			printf("%s\r\n",pcWriteBuffer);
		}
		vTaskDelay(100);
	}
}

        使用该函数需要注意的点:

        1、需要将宏 configGENERATE_RUN_TIME_STATS 置1;

        2、需要将宏 configUSE_STATS_FORMATTING_FUNCTIONS 置1;

        3、在将1完成后需要实现 portCONFIGURE_TIMER_FOdR_RUN_TIME_STATS() 宏和 portGET_RUN_TIME_COUNTER_VALUE() 宏;

        portCONFIGURE_TIMER_FOdR_RUN_TIME_STATS() 用来初始化用于配置任务运行时间统计的时基定时器,时基定时器的精度必须高于系统时钟节拍精度的10到100倍。系统时钟节拍如果是1ms,时基定时器节拍就得在10us到100us之间。

        portGET_RUN_TIME_COUNTER_VALUE() 用于获取定时器计数的计数值。

         定时器使用stm32的内部定时器3,在 ConfigureTimeForRunTimeStats() 中初始化定时器并配置为每10us中断一次,然后在中断服务函数中将 FreeRTOSRunTimeTicks++,从而达到计时的目的。宏的实现如下代码:

timer.c:

#include "timer.h"
#include "led.h"
#include "led.h"
#include "usart.h"

volatile unsigned long long FreeRTOSRunTimeTicks;

//初始化TIM3使其为FreeRTOS的时间统计提供时基
void ConfigureTimeForRunTimeStats(void)
{
	//定时器3初始化,定时器时钟为72M,分频系数为72-1,所以定时器3的频率
	//为72M/72=1M,自动重装载为10-1,那么定时器周期就是10us
	FreeRTOSRunTimeTicks=0;
	TIM3_Int_Init(10-1,72-1);	//初始化TIM3
}

//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;  //先占优先级4级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
	{
		FreeRTOSRunTimeTicks++;
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}

timer.h:

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h" 

void ConfigureTimeForRunTimeStats(void);
extern volatile unsigned long long FreeRTOSRunTimeTicks;
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM5_Int_Init(u16 arr,u16 psc);
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1789811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ktor库的高级用法:代理服务器与JSON处理

在现代网络编程中&#xff0c;Ktor是一个高性能且易于使用的框架&#xff0c;它提供了对异步编程、WebSockets、HTTP客户端和服务器等特性的原生支持。Ktor是使用Kotlin语言编写的&#xff0c;充分利用了Kotlin的协程特性来简化异步编程。本文将深入探讨Ktor库的高级用法&#…

数据误删?别怕!COS防误删和误删恢复攻略请查收

在云存储领域&#xff0c;数据的安全性始终是悬在头顶的达摩克利斯之剑。长期以来&#xff0c;腾讯云对象存储服务&#xff08;COS&#xff09;一直致力于数据安全的探索和实践&#xff0c;以保障数据的安全性和完整性。对象存储COS准备了一份“防误删”和“误删恢复”攻略给大…

Base64前端图片乱码转换

title: Base64码乱转换 date: 2024-06-01 20:30:28 tags: vue3 后端图片前端显示乱码 现象 后端传来一个图片&#xff0c;前端能够接收&#xff0c;但是console.log()后发现图片变成了乱码&#xff0c;但是检查后台又发现能够正常的收到了这张图片。 处理方法 笔者有尝试将…

SQL注入之updatexml报错注入(函数解释)

先解释一下updatexml参数的用法 updatexml():更新xml文档的函数 语法&#xff1a;updatexml(目标xml文档&#xff0c;xml路径&#xff0c;更新的内容) 第二个参数 xml路径 是可操作的地方&#xff0c;xml文档中路径是用 /xxx/xxx/xxx/…这种格式&#xff0c;如果我们写入其他…

OceanBase 内存研究(OceanBase 3.2.4.5)

内存结构 从官网的结构图可以看出&#xff0c;一台observer可使用的总内存(memory_limit)包括 系统内存(system_memory) 和 租户内存(sys租户与普通租户) 系统内存 系统内存system_memory 属于 observer 的内部内存&#xff0c;允许其它租户共享使用该内存资源 (root10.0.0.…

Java集合简略记录

一、集合体系结构 单列集合&#xff1a;Collection 双列集合&#xff1a;Map 二、单列集合 List系列集合&#xff1a;添加的元素是有序、可重复、有索引 有序指的是存和取的顺序是一致的&#xff0c;和之前排序的从小到大是没有任何关系的 Set系列集合&#xff1a;添加的元素是…

RandLA-Net 训练自定义数据集

https://arxiv.org/abs/1911.11236 搭建训练环境 git clone https://github.com/QingyongHu/RandLA-Net.git搭建 python 环境 , 这里我用的 3.9conda create -n randlanet python3.9 source activate randlanet pip install tensorflow2.15.0 -i https://pypi.tuna.tsinghua.e…

从CSV到数据库(简易)

需求&#xff1a;客户上传CSV文档&#xff0c;要求CSV文档内容查重/插入/更新相关数据。 框架&#xff1a;jdbcTemplate、commons-io、 DB&#xff1a;oracle 相关依赖&#xff1a; 这里本来打算用的2.11.0&#xff0c;无奈正式项目那边用老版本1.3.1&#xff0c;新版本对类型…

eNSP学习——RIP路由协议基础配置

目录 主要命令 原理概述 实验内容 实验目的 实验拓扑 实验编址 实验步骤 1、基本配置 2、使用RIPv1搭建网络 开启 RIP调试功能 3、使用RIPv2搭建网络 RIPv1和RIPv2的不同 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PD…

使用Python库Matplotlib绘制常用图表类型

使用Python库Matplotlib绘图 一、Matplotlib绘图参数设置1.1 设置分辨率和画布大小1.2 保存图片并设置边缘留白为紧凑型1.3 设置坐标轴标签1.4 画直线设置线宽和颜色1.5 画子图1.5.1 通过figure的add_subplot()画子图1.5.2 通过plt的subplots画子图 二、使用Matplotlib中scatte…

经验分享,超声波车位引导系统和视频车位引导系统有哪些区别

随着城市化进程的加速和汽车保有量的持续增长&#xff0c;停车难已成为城市交通管理的一大挑战。车位引导系统作为解决这一问题的有效工具&#xff0c;其重要性日益凸显。它不仅能够提升停车场的运营效率&#xff0c;还能显著改善驾驶者的停车体验。目前市场上主要有两种车位引…

【Centos7】CentOS 7下的PyTorch安装策略:高效实践指南

【Centos7】CentOS 7下的PyTorch安装策略&#xff1a;高效实践指南 大家好 我是寸铁&#x1f44a; 总结了一篇【Centos7】CentOS 7下的PyTorch安装策略&#xff1a;高效实践指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 由于需要跑深度学习&#xff0c;要用到pytorch&a…

全域外卖项目能不能做?可行性分析来了!

作为新的网络热词&#xff0c;全域外卖的传播范围随着时间的推移而不断扩大&#xff0c;从最初的行业内部逐步扩散到多个创业者社区&#xff0c;让许多创业者都有了做全域外卖项目的想法。但是&#xff0c;由于全域外卖赛道刚兴起不久&#xff0c;因此&#xff0c;目前大多数人…

实时监控与报警:人员跌倒检测算法的实践

在全球范围内&#xff0c;跌倒事件对老年人和儿童的健康与安全构成了重大威胁。据统计&#xff0c;跌倒是老年人意外伤害和死亡的主要原因之一。开发人员跌倒检测算法的目的是通过技术手段及时发现和响应跌倒事件&#xff0c;减少因延迟救助而造成的严重后果。这不仅对老年人群…

Mysql(一)查询Sql是如何执行的

Hello&#xff0c;大家好我是极客涛&#x1f60e;&#xff0c;我最近在整理Mysql相关的知识点&#xff0c;所以准备开启一个Mysql的主线任务&#xff0c;大概耗时3周左右&#xff0c;整个节奏还是由浅入深&#xff0c;主要包括Mysql的架构、事务实现、索引组织形式、SQL优化、日…

[C][数据结构][时间空间复杂度]详细讲解

目录 0.铺垫1.时间复杂度 -- 衡量算法的运行快慢1.是什么&#xff1f;2.大O的渐进表示法 2.空间复杂度 - 衡量算法所需要的额外空间3.常见复杂度对比 0.铺垫 时间是累计的空间是不累计的&#xff0c;可以重复利用 1.时间复杂度 – 衡量算法的运行快慢 1.是什么&#xff1f; …

SQL Server数据库UNC路径注入攻击

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 UNC路径注入 如果我们能强制SQL服务器连接到我们控制的SMB共享&#xff0c;连接将会包含认证数据。更具体的来说&#xff0c;将会发起一个NTLM认证&#xff0c;我们将能…

词法分析器的设计与实现--编译原理操作步骤,1、你的算法工作流程图; 2、你的函数流程图;3,具体代码

实验原理&#xff1a; 词法分析是编译程序进行编译时第一个要进行的任务&#xff0c;主要是对源程序进行编译预处理之后&#xff0c;对整个源程序进行分解&#xff0c;分解成一个个单词&#xff0c;这些单词有且只有五类&#xff0c;分别时标识符、关键字&#xff08;保留字&a…

【实物+仿真设计】智能安全门控制系统设计

《智能安全门控制系统设计 实物仿真》 整体功能&#xff1a; 本课题首先确定整个智能安全门控制系统进行总体方案设计。主要包括按键模块、 电磁锁模块、语音提示模块、人员检测模块。按键提供给用户人工交互的功能&#xff0c;用户可 以选择输入按键的方式控制安全门。单片机…

民国漫画杂志《时代漫画》第39期.PDF

时代漫画39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!