freeRTOS总结(八)任务相关API函数

1, FreeRTOS任务相关API函数介绍(熟悉)

UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) 获取任务优先级函数

此函数用于获取指定任务的任务优先级,使用该函数需将宏 INCLUDE_uxTaskPriorityGet 置 1
在这里插入图片描述
在这里插入图片描述

void vTaskPrioritySet( TaskHandle_t xTask , UBaseType_t uxNewPriority ) 改变某个任务的任务优先级

此函数用于改变某个任务的任务优先级,使用该函数需将宏 INCLUDE_vTaskPrioritySet 为 1
在这里插入图片描述

UBaseType_t uxTaskGetNumberOfTasks( void ) 用于获取系统中任务的任务数量

在这里插入图片描述

UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,const UBaseType_t uxArraySize,configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) 获取系统中所有任务的任务状态信息

此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1
在这里插入图片描述
在这里插入图片描述

typedef struct xTASK_STATUS
{TaskHandle_t 			xHandle;                       		/* 任务句柄 */ const char *		 		pcTaskName;                     	/* 任务名 */ UBaseType_t			xTaskNumber;                     	/* 任务编号 */ eTaskState e				CurrentState;                    	/* 任务状态 */ UBaseType_t 			uxCurrentPriority;               	/* 任务优先级 */ UBaseType_t 			uxBasePriority;                 	/* 任务原始优先级*/ configRUN_TIME_COUNTER_TYPE 	ulRunTimeCounter; 		/* 任务运行时间*/StackType_t * 			pxStackBase;                    	/* 任务栈基地址 */ configSTACK_DEPTH_TYPE 	usStackHighWaterMark;  	/* 任务栈历史剩余最小值 */ 
} TaskStatus_t;

void vTaskGetInfo( TaskHandle_t xTask,TaskStatus_t * pxTaskStatus,BaseType_t xGetFreeStackSpace, eTaskState eState ) 获取指定的单个任务的状态信息

此函数用于获取指定的单个任务的状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1
在这里插入图片描述

typedef enum
{   eRunning = 0,	/* 运行态 */ eReady		/* 就绪态 */ eBlocked, 		/* 阻塞态 */ eSuspended, 	/* 挂起态 */ eDeleted, 		/* 任务被删除 */ eInvalid		/* 无效 */ 
} eTaskState;

TaskHandle_t xTaskGetCurrentTaskHandle( void ) 获取当前任务的任务句柄

此函数用于获取当前任务的任务句柄, 使用该函数需将宏 INCLUDE_xTaskGetCurrentTaskHandle 置 1
在这里插入图片描述

TaskHandle_t xTaskGetHandle(const char * pcNameToQuery);

此函数用于通过任务名获取任务句柄 , 使用该函数需将宏 INCLUDE_xTaskGetHandle 置 1
在这里插入图片描述
在这里插入图片描述

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) 获取指定任务的任务栈历史最小剩余堆栈;

此函数用于获取指定任务的任务栈历史最小剩余堆栈;使用该函数需将宏INCLUDE_uxTaskGetStackHighWaterMark 置 1
此函数用于获取指定任务的任务栈历史最小剩余堆栈;
使用该函数需将宏 INCLUDE_uxTaskGetStackHighWaterMark 置 1

eTaskState eTaskGetState(TaskHandle_t xTask) 查询某个任务的运行状态

此函数用于查询某个任务的运行状态,使用此函数需将宏 INCLUDE_eTaskGetState 置1
在这里插入图片描述
在这里插入图片描述

typedef enum
{   eRunning = 0,	/* 运行态 */ eReady		/* 就绪态 */ eBlocked, 		/* 阻塞态 */ eSuspended, 	/* 挂起态 */ eDeleted, 		/* 任务被删除 */ eInvalid		/* 无效 */ 
} eTaskState;

void vTaskList(char * pcWriteBuffer) 以“表格”的形式获取系统中任务的信息

此函数用于以“表格”的形式获取系统中任务的信息 ;
使用此函数需将宏 configUSE_TRACE_FACILITY 和configUSE_STATS_FORMATTING_FUNCTIONS 置1
在这里插入图片描述
Name : 创建任务的时候给任务分配的名字。
State : 任务的壮态信息, B 是阻塞态, R 是就绪态, S 是挂起态, D 是删除态
Priority :任务优先级。
Stack : 任务堆栈的“高水位线”,就是堆栈历史最小剩余大小。
Num : 任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区分。

时间统计API函数使用流程
1、将宏 configGENERATE_RUN_TIME_STATS 置1
2、将宏 configUSE_STATS_FORMATTING_FUNCTIONS 置1
3、当将此宏 configGENERATE_RUN_TIME_STAT 置1之后,还需要实现2个宏定义:
① portCONFIGURE_TIMER_FOR_RUNTIME_STATE() :用于初始化用于配置任务运行时间统计的时基定时器;
注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍!
② portGET_RUN_TIME_COUNTER_VALUE():用于获取该功能时基硬件定时器计数的计数值 。

2,任务状态查询API函数实验(掌握)

1、实验目的:学习 FreeRTOS 任务状态与信息的查询API函数
2、实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
start_task:用来创建task1和task2任务
task1:LED0每500ms闪烁一次,提示程序正在运行
task2:用于展示任务状态信息查询相关API函数的使用

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t   task1_handler;
void task1( void * pvParameters );#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t   task2_handler;
void task2( void * pvParameters );/******************************************************************************************************//*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/
void freertos_demo(void)
{    xTaskCreate((TaskFunction_t) start_task,(char *)	"start_task",(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,(void *) NULL,(UBaseType_t) START_TASK_PRIO,(TaskHandle_t *)&start_task_handler);//开启任务调度vTaskStartScheduler();}
void start_task( void * pvParameters )
{taskENTER_CRITICAL();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/xTaskCreate((TaskFunction_t) task1,(char *)	"task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *)&task1_handler	);xTaskCreate((TaskFunction_t) task2,(char *)	"task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK2_PRIO,(TaskHandle_t *)&task2_handler	);vTaskDelete(NULL);//删除当前任务也就是开始任务taskEXIT_CRITICAL();}void task1( void * pvParameters )
{while(1){LED0_TOGGLE();vTaskDelay(500);}
}
char task_buff[500];
void task2( void * pvParameters )
{UBaseType_t priority_num=0;UBaseType_t task_num=0;UBaseType_t task_num2 =0;TaskStatus_t * status_array;TaskStatus_t * status_array2;uint8_t i;TaskHandle_t  task_handle;eTaskState task_state;
/******************************************************************************************************/	/*设置任务优先级*//*任务创建时优先级为3现在设置为5*/vTaskPrioritySet((TaskHandle_t)task2_handler,(UBaseType_t)4 );
/******************************************************************************************************//*获取任务优先级并将他打印*/priority_num =   uxTaskPriorityGet( (TaskHandle_t) task1_handler );printf("task1任务优先级为%ld\r\n",priority_num);priority_num =   uxTaskPriorityGet( NULL );printf("task2任务优先级为%ld\r\n",priority_num);
/******************************************************************************************************//*获取任务数量 task1+task2+IDEL(空闲)+Tmr Svc(软件定时)+start_task*/task_num = uxTaskGetNumberOfTasks();printf("当前系统任务数量为%ld\r\n",task_num);
/******************************************************************************************************//*
获取系统任务信息数量为5
任务名		任务优先级	任务编号
task2		4	5
task1		2	4
IDLE		0	2
start_task		1	1
Tmr Svc		31	3*/status_array= mymalloc(SRAMIN,(sizeof(TaskStatus_t) * task_num));/*获取当前任务*/task_num2=uxTaskGetSystemState( (TaskStatus_t * ) status_array,( UBaseType_t )task_num,NULL );printf("获取系统任务信息数量为%ld\r\n",task_num2);printf("任务名\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 = mymalloc(SRAMIN,(sizeof(TaskStatus_t) ));vTaskGetInfo( (TaskHandle_t) task2_handler,(TaskStatus_t *) status_array2,(BaseType_t) pdTRUE,(eTaskState )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( "task1" );printf("任务句柄:%#x\r\n",(int)task_handle);/*%#x 是格式化输出控制符,表示以十六进制形式输出整数,并在前面加上 0x 前缀*/printf("task1的任务句柄:%#x\r\n",(int)task1_handler);/*******************查询某个任务的运行状态***************************************************************************/		task_state = eTaskGetState(task2_handler);printf("task2当前任务状态:%d\r\n",task_state);/*******************以“表格”的形式获取系统中任务的信息**************************************************************************/		vTaskList( task_buff );printf("%s\r\n",task_buff); while(1){vTaskDelay(1000);}}

3,任务时间统计API函数实验(掌握)

Void vTaskGetRunTimeStats( char * pcWriteBuffer )
此函数用于统计任务的运行时间信息,使用此函数需将宏 configGENERATE_RUN_TIME_STAT 、configUSE_STATS_FORMATTING_FUNCTIONS 置1
在这里插入图片描述
Task :任务名称
Abs Time ::任务实际运行的总时间(绝对时间)
% Time :占总处理时间的百分比
时间统计API函数使用流程
1、将宏 configGENERATE_RUN_TIME_STATS 置1
2、将宏 configUSE_STATS_FORMATTING_FUNCTIONS 置1 、
3、当将此宏 configGENERATE_RUN_TIME_STATS 置1之后,还需要实现2个宏定义:
① portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() :用于初始化用于配置任务运行时间统计的时基定时器;
注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍!
② portGET_RUN_TIME_COUNTER_VALUE():用于获取该功能时基硬件定时器计数的计数值 。

#if configGENERATE_RUN_TIME_STATS
#include "./BSP/TIMER/btim.h"
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()        ConfigureTimeForRunTimeStats()
extern uint32_t FreeRTOSRunTimeTicks;
#define portGET_RUN_TIME_COUNTER_VALUE()                FreeRTOSRunTimeTicks
#endif

宏的实现在bitm.c中实现

/* 时基定时器的初始化 */
/*定时器6的时钟频率是42M*/
void ConfigureTimeForRunTimeStats(void)
{btim_timx_int_init(10-1, 42-1);  /* 100倍的系统时钟节拍 */FreeRTOSRunTimeTicks = 0;
}

定时器溢出中断时FreeRTOSRunTimeTicks ++

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{ //无论哪个定时器处理计数溢出中断都会调用这个回调函数if (htim->Instance == BTIM_TIMX_INT){FreeRTOSRunTimeTicks ++;}
}
void task2( void * pvParameters )
{uint8_t key;while(1){key=key_scan(0);if(key==KEY0_PRES){vTaskGetRunTimeStats( task_buff);printf("%s\r\n",task_buff);}vTaskDelay(1000);}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用于垃圾回收的运行时配置选项

反馈 本文内容 指定配置的方法垃圾回收的风格管理资源使用情况大型页面 显示另外 4 个 此页面包含有关 .NET 运行时垃圾回收器 (GC) 设置的信息。 如果你要尝试让正在运行的应用达到最佳性能&#xff0c;请考虑使用这些设置。 然而&#xff0c;在特定情况下&#xff0c;默认…

【动态规划】C++ 算法458:可怜的小猪

作者推荐 视频算法专题 涉及知识点 动态规划 数学 力扣458:可怜的小猪 有 buckets 桶液体&#xff0c;其中 正好有一桶 含有毒药&#xff0c;其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药&#xff0c;你可以喂一些猪喝&#xff0c;通过观察猪是否…

精通 Spring REST API:最佳实践

概述 随着数字时代的推进&#xff0c;基于Web的程序已经成为构建交互式应用的关键。客户端与服务器之间的沟通频繁依赖于通过 APIs 获取的网络服务。 使用开源框架Spring&#xff0c;开发者可以有效率地搭建Web服务。本篇文章旨在展示如何利用Spring来构筑一个REST风格的Web服…

基于Java+SpringBoot+vue+element疫情物资捐赠分配系统设计和实现

基于JavaSpringBootvueelement疫情物资捐赠分配系统设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种…

【字符串】【C++算法】828.统计子串中的唯一字符

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 子数组&#xff08;串&#xff09; 字符串 LeetCoce828.统计子串中的唯一字符 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符&#xff0c;并返回唯一字符的个数。 例…

【pyqt6】用pyqt做一个点菜小程序

用pyqt做一个点菜小程序 前言1.pyqt62. 功能介绍3.程序实现 前言 在本文中&#xff0c;我们将使用 PyQt6&#xff08;Python的GUI库&#xff09;创建一个简单的点菜小程序。该程序允许用户从菜单中选择菜品&#xff0c;将其添加到订单中&#xff0c;并通过点击“下单”按钮查看…

3.postman动态参数、文件上传及断言

一、postman内置动态参数以及自定义的动态参数 postman内置动态参数&#xff1a; {{$timestamp}} 生成当前时间的时间戳 {{$randomint}} 生成0-1000之间的随机数 {{$guid}} 生成随机guid字符串 自定义动态参数&#xff1a; 在请求中pre-req页面下 //手动的获得时间戳 var…

关于鸿蒙系统开源和技术细节的一些探讨

1月18日在深圳举办了“鸿蒙生态千帆启航仪式”&#xff0c;这也是华为鸿蒙开启生态进阶的信号。在政策的叠加下&#xff0c;鸿蒙未来必定是势不可挡的。我们这些程序员也得与时俱进&#xff0c;熟悉鸿蒙的技术和细节&#xff0c;别在经济寒冬里被淘汰了。 官方称 Harmony OS N…

1.24号c++

C绪论 c是c语言的扩充&#xff0c;C包含了C的所有属性&#xff0c;换一句话说&#xff0c;C语言在C中都合法。 C语言编程思想&#xff1a;面向过程 c编程思想&#xff1a;面向对象 可以说在C中一切皆对象。 c的三大属性&#xff1a;封装&#xff0c;继承&#xff0c;多态。…

VMWare扩展Ubuntu LVM卷

当我们在安装程序提示磁盘空间满了时&#xff0c;我们可以通过以下步骤进行空间扩展。 首先是调整虚拟机磁盘大小&#xff0c;注意这里关机后才可编辑 然后是使用df -hl命令&#xff0c;看磁盘占用情况&#xff0c;找到满载的分区 再是使用lsblk查看分区设备名&#xff0c;确定…

安达发|APS排产系统和SCM供应链管理之间的关系

APS排产系统和SCM供应链管理是现代企业管理中非常重要的两个环节&#xff0c;它们之间存在着密切的关系。本文将从以下几个方面来探讨APS排产系统和SCM供应链管理之间的关系。 1. 定义与功能 APS排产系统&#xff08;Advanced Planning and Scheduling System&#xff09;是一种…

加速应用开发:低代码云SaaS和源码交付模式如何选

随着数字化转型的加速&#xff0c;企业对于快速开发和交付高质量应用的需求也越来越迫切。为了满足这一需求&#xff0c;开发者们开始探索采用低代码平台进行软件开发工作&#xff0c;以加速应用开发过程。 目前&#xff0c;市场上的低代码产品众多&#xff0c;但基本可分为简单…

外包干了2个多月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

代理设计模式JDK动态代理CGLIB动态代理原理

代理设计模式 代理模式&#xff08;Proxy&#xff09;&#xff0c;为其它对象提供一种代理以控制对这个对象的访问。如下图 从上面的类图可以看出&#xff0c;通过代理模式&#xff0c;客户端访问接口时的实例实际上是Proxy对象&#xff0c;Proxy对象持有RealSubject的引用&am…

【2024】新建mysql数据库,如何选择字符集和排序规则

如何使用 Navicat 新建 MySQL 数据库&#xff0c;并选择字符集与排序规则 如何使用 Navicat 新建 MySQL 数据库并选择字符集与排序规则1. 开始之前2. 新建数据库步骤 1: 打开 Navicat步骤 2: 创建新数据库步骤 3: 填写数据库名称 常见的字符集和排序规则及其选择场景1. 字符集&…

有了NFC和蓝牙,为何还要UWB?什么时候UWB才是首推选择呢?

UWB UWB&#xff08;超宽带&#xff0c;Ultra-Wideband&#xff09;是一种短距离无线通信技术&#xff0c;它提供比当前使用的其他定位技术更精确的读数&#xff0c;使用飞行时间&#xff08;ToF&#xff09;和到达角&#xff08;AoA&#xff09;计算&#xff0c;UWB可以实时地…

jmeter分布式压测详解,建议收藏

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 一、什么是压力测试&#xff1f; 压力测试&#xff0…

SQL 注入总结(详细)

一、前言 这篇文章是最近学习 SQL 注入后的笔记&#xff0c;里面整理了 SQL 常见的注入方式&#xff0c;供大家学习了解 SQL 注入的原理及方法&#xff0c;也方便后续自己回顾&#xff0c;如有什么错误的地方欢迎指出&#xff01; 二、判断注入类型 按照注入点类型分类 数字型…

QT 实现自动生成小学两位数加减法算式

小学生加减法训练 QT实现–自动生成两位数加减法算式&#xff0c;并输出txt文件 可以copy到word文件&#xff0c;设置适当字体大小和行间距&#xff0c;带回家给娃做做题 void MainWindow::test(int answerMax, int count) {// 创建一个随机数生成器QRandomGenerator *gener…

AIGC:让生成式AI成为自己的外脑(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 什么是AIGC?二. AIGC如何运作&#xff1f;2.1 步骤一&#xff1a;收集数据2.…