12_FreeRTOS任务相关API函数

news2024/11/25 4:31:30

目录

FreeRTOS任务相关API函数介绍

获取任务优先级函数

设置任务优先级函数

获取任务数量函数

获取所有任务状态信息

获取指定的单个任务的状态信息

获取当前任务句柄

通过任务名获取任务句柄

获取任务栈历史最小剩余推栈

以表格的形式获取系统中任务信息

实验源码


FreeRTOS任务相关API函数介绍

获取任务优先级函数

UBaseType_t uxTaskPriorityGet( 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, uint32_t * const pulTotalRunTime )

此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏

configUSE_TRACE_FACILITY置1

typedef struct xTASK_STATUS
{
TaskHandle_ txHandle;     				/* 任务句柄*/
const char* pcTaskName; 					/* 任务名*/
UBaseType  txTaskNumber;					/* 任务编号*/
eTaskState  eCurrentState;					/* 任务状态*/
UBaseType  tuxCurrentPriority;				/* 任务优先级*/
UBaseType  tuxBasePriority;					/* 任务原始优先级*/
uint32_t  ulRunTimeCounter, /* 任务运行时间*/
StackType_t* pxStackBase;					/* 任务栈基地址*/
Uint16_t  usStackHighWaterMark; /* 任务栈历史剩余最小值*/

}TaskStatus_t;

取指定的单个任务的状态信息

void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t

xGetFreeStackSpace, eTaskState eState )

此函数用于获取指定的单个任务的状态信息,使用该函数需将宏

configUSE_TRACE_FACILITY 置 1

获取当前任务句柄

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

以表格的形式获取系统中任务信息

void vTaskList(char*pcWriteBuffer)

此函数用于以“表格”的形式获取系统中任务的信息;使用此函数需将宏

configUSE_TRACE_FACILITY 和configUSE_STATS_FORMATTING_FUNCTIONS 置1

Name:创建任务的时候给任务分配的名字。

State:任务的壮态信息,B是阻塞态,R是就绪态,S是挂起态,D 是删除态,X是运行态

Priority:任务优先级。Stack任务堆栈的“高水位线”,就是堆栈历史最小剩余大小。

Num :任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区分

实验源码

/**
  ******************************************************************************
  * @file           : user_mian.h
  * @brief          : V1.00
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "FreeRTOS.h"
#include "task.h"

/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/ 
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO			8
//任务堆栈大小	
#define TASK1_STK_SIZE 		50  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);


//任务优先级
#define TASK2_PRIO			3
//任务堆栈大小	
#define TASK2_STK_SIZE 		500  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);


char task_buff[300];

 int main(void)
 {	

	/*配置系统中断分组为4位抢占*/
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	 /*延时函数初始化*/
	 delay_init();
	/*RCC配置*/
	 Rcc_config();
	/*GPIO初始化*/ 
	 Gpio_Init();
	/*USART1初始化*/
	 Uart1_Init(9600);
	/*创建开始任务*/
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
		

}
 

/*!
	\brief		开始任务函数
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建任务1
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler);   
    //创建任务2
    xTaskCreate((TaskFunction_t )task2,     
                (const char*    )"task2",   
                (uint16_t       )TASK2_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )TASK2_PRIO,
                (TaskHandle_t*  )&Task2_Handler);         
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}


/*!
	\brief		task1实现LED每500ms翻转一次任务函数
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
void task1(void *pvParameters)
{
    while(1)
    {
         
		//引脚拉低,GPIOE LED亮
		GPIO_ResetBits(GPIOE,GPIO_Pin_5);
        vTaskDelay(500);
		//引脚拉高,GPIOE LED灭		
		GPIO_SetBits(GPIOE,GPIO_Pin_5);
		vTaskDelay(500);
    }
} 


/*!
	\brief		task2实现任务状态查询API函数使用任务函数
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
void task2(void *pvParameters)
{
	UBaseType_t num =0;
	TaskStatus_t Status[10];
	TaskStatus_t Status1;
	uint8_t i;
    while(1)
    {

		/*设置任务2优先级为1*/
		vTaskPrioritySet(Task2_Handler,4);

		/*获取任务1优先级*/
		num = uxTaskPriorityGet(Task1_Handler);
		taskENTER_CRITICAL();           //进入临界区
		printf("任务1优先级为:%ld\r\n",num);
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区
		
		
		/*获取当前任务优先级*/
		num = uxTaskPriorityGet(NULL);
		taskENTER_CRITICAL();           //进入临界区		
		printf("获取当前任务优先级:%ld\r\n",num);
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区		

		
		/*设置任务2优先级为3*/
		vTaskPrioritySet(Task2_Handler,3);
		
		/*获取当前任务优先级*/
		num = uxTaskPriorityGet(NULL);
		taskENTER_CRITICAL();           //进入临界区	
		printf("修改后当前任务优先级:%ld\r\n",num);
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区
		
		
		/*获取当前任务数量*/
		num = uxTaskGetNumberOfTasks();
		
		taskENTER_CRITICAL();           //进入临界区
		printf("获取当前任务数量:%ld\r\n",num);
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区
		
		

		/*获取系统中所有任务的任务状态信息*/
		uxTaskGetSystemState(&Status[0],num,NULL);	
		
		taskENTER_CRITICAL();           //进入临界区						
		printf("任务名\t任务优先级\t任务编号");
		delay_xms(5);
		printf("\t历史剩余最小值\r\n");	
		taskEXIT_CRITICAL();            //退出临界区	
		for(i=0; i<num; i++)
		{
			
			taskENTER_CRITICAL();           //进入临界区
			printf("%s\t%ld\t\t%ld\t\t%d\t\t\r\n",Status[i].pcTaskName,
					Status[i].uxCurrentPriority,Status[i].xTaskNumber,
					Status[i].usStackHighWaterMark);			
			taskEXIT_CRITICAL();            //退出临界区
			
		}
		
		
		/*获取单个任务的状态信息*/
		vTaskGetInfo(Task2_Handler,&Status1,pdTRUE,eInvalid);		
		taskENTER_CRITICAL();           //进入临界区
		printf("单个任务获取状态信息\r\n");
		delay_xms(5);
		printf("任务名\t任务优先级\t任务编号");
		delay_xms(5);
		printf("\t历史剩余最小值\t任务状态\r\n");	
		delay_xms(5);
		printf("%s\t%ld\t\t%ld\t\t%d\t\t%d\t\t\r\n\r\n",Status1.pcTaskName,
					Status1.uxCurrentPriority,Status1.xTaskNumber,
					Status1.usStackHighWaterMark,Status1.eCurrentState);	
		taskEXIT_CRITICAL();            //退出临界区
		
		/*列表形式获取系统任务信息*/	
		vTaskList(task_buff);
		
		taskENTER_CRITICAL();           //进入临界区
		printf("%s\r\n",task_buff);
		delay_xms(5);
		printf("\r\n\r\n");
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区
		

		
		vTaskDelay(1000);	 
		
    }
}

 /************************************************************** END OF FILE ****/

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

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

相关文章

【虹科】防止PCB组装过程出现质量错误的5种方法

质量问题和错误时有发生&#xff0c;尤其是在涉及PCB和电子产品制造的复杂人为操作任务中。通常情况下&#xff0c;企业可能会配备自动光学检测&#xff08;AOI&#xff09;等系统&#xff0c;这些系统通常用于制造过程中“中间”阶段的检测。尽管AOI系统为质量控制创造价值&am…

Jmeter in Linux - 如何在Linux系统使用Jmeter压测?

Jmeter in Linux - 如何在Linux系统使用Jmeter压测&#xff1f;Jmeter in Linux系列目录&#xff1a;1. 在windows创建好一个测试计划&#xff1a;2. 保存后&#xff0c;将jmx后缀的文件上传至Linux服务器3. 执行jmeter命令4. 根据执行日志分析压测报告5. 解析压测报告Jmeter i…

有效的括号-力扣20-java

一、题目描述给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类…

【huggingface系列学习】Using Transformers

文章目录前言Using Transformers使用tokenizer预处理Tokenizer详解Loading and saving加载保存EncodingDecodingModel创建一个Transformer不同的加载方法模型保存使用模型进行推理前言 因实验中遇到很多 huggingface-transformers 模型和操作&#xff0c;因此打算随着 course …

剖析字节案例,火山引擎 A/B 测试 DataTester 如何“嵌入”技术研发流程

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 日前&#xff0c;在 WOT 全球创新技术大会上&#xff0c;火山引擎 DataTester 技术负责人韩云飞做了关于字节跳动 A/B 测试平台的分享。DataTester 是字节跳动内部应…

Roboguide与TIA V16通讯

软件需求:1. roboguide;2. TIA V16;3. KEPServer; 在之前的文章中介绍过KEPServer与TIA V16的通讯,此处不再介绍。接下来,介绍roboguide与KEPServer的仿真通讯。 创建一个roboguide项目。选择【外部设备】➡【添加外部设备】 选择【OPC Server】➡【OK】 OPC服务器名称命…

linux安装并配置nginx

菜鸟教程 一 . Nginx安装和部署 1.输入指令&#xff0c;下载相关的依赖包 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-develYUM(Yellow dog Updater, Modified)为多个Linux发行版的前端软件包管理器 -y 是参数&#xff0c;默认不要确认&#xff0c; rp…

对话 ChatGPT:现象级 AI 应用,将如何阐释「研发效能管理」?

ChatGPT 已然是 2023 开年至今&#xff0c;互联网上最热的话题没有之一。从去年的 AI 图片生成&#xff0c;到 ChatGPT&#xff0c;再到现在各种基于大模型的应用如雨后春笋般出现……在人们探讨技术无限可能的同时&#xff0c;另一个更深刻的命题也不可回避地浮现出来&#xf…

汽摩仪表快检盒

不怕失业 ​ ​最近大火的ChatGPT说要取代程序员&#xff0c;老婆子惊慌失措&#xff0c;跟着糟老头憋屈&#xff0c;咸鱼想靠软件翻身&#xff0c;这下白瞎了。 ​温州寄来了汽车燃油预热控制板&#xff0c;绍兴又寄来了发动机仪表&#xff0c;昆山的尾门在路上&#xff0c;都…

如何成为java架构师?2023版Java架构师学习路线总结完成,真实系统有效,一切尽在其中

导读 从初级Java工程师成长为Java架构师&#xff0c;你需要走很长的路&#xff0c;很多有计划的人在学习之初就在做准备。你知道Java架构师学习路线该怎么走吗?成为一个优秀的Java架构师究竟需要学什么?接下来就跟小编一起揭晓答案。 架构师是一个充满挑战的职业&#xff0…

Python自定义模块

到目前为止&#xff0c;读者已经掌握了导入 Python 标准库并使用其成员&#xff08;主要是函数&#xff09;的方法&#xff0c;接下来要解决的问题是&#xff0c;怎样自定义一个模块呢&#xff1f;Python 模块就是 Python 程序&#xff0c;换句话说&#xff0c;只要是 Python 程…

Swagger自动生成api文档

Swagger自动生成api文档Swagger是什么Swagger底层原理使用方式1修改pom文件2启动类中加入注解EnableSwagger23加入SpringFoxConfig.java4加入WebMvcConfig.java文件5 给Web 服务的接口加注解访问可视化页面Swagger是什么 Swagger 是一个规范和完整的框架&#xff0c;用于生成、…

C经典小游戏之扫雷

编译环境&#xff1a;VS022 目录 1.算法思路 2.代码模块 2.1 game.h 2.2 game.cpp 2.3 test.cpp 3.重点分析 4.金句省身 1.算法思路 主要采用二维数组进行实现&#xff0c;设置两个二维数组&#xff0c;一个打印结果&#xff0c;即为游戏界面显示的效果&#xff0c;一个用…

值类型和引用类型

一、值类型和引用类型示例&#xff1a; 值类型&#xff1a;基本数据类型系列&#xff0c;如&#xff1a;int&#xff0c;float&#xff0c;bool&#xff0c;string&#xff0c;数组和结构体等。 引用类型&#xff1a;如&#xff1a;指针&#xff0c;slice切片&#xff0c;map&a…

windows wireshark抓到未加入组的组播消息

现象 在Windows上开启wireshark&#xff0c;抓到了大量地址为239.255.255.251的组播包。 同时&#xff0c;根据组播相关命令&#xff0c;调用netsh interface ipv4 show joins&#xff0c;显示当前并没加入 239.255.255.251 组播组。 解决 根据IGMP Snooping&#xff0c;I…

《机器学习》学习笔记

第 2 章 模型评估与选择 2.1 经验误差与过拟合 精度&#xff1a;精度1-错误率。如果在 mmm 个样本中有 aaa 个样本分类错误&#xff0c;则错误率 Ea/mEa/mEa/m&#xff0c;精度 1−a/m1-a/m1−a/m。误差&#xff1a;一般我们把学习器的实际预测输出与样本的真实输出之间的差…

MySQL---单表查询、多表查询

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 v…

STM32驱动RC522

STM32驱动RC522开发环境&#xff1a;STM32CUBEMXKeil5使用平台&#xff1a;STM32F401CCU6该内容由网上内容改编,若不合适&#xff0c;请联系删除。一、使用STM32CUBEMX配置SPI二、驱动部分三、主函数调用四、移值攻略开发环境&#xff1a;STM32CUBEMXKeil5 使用平台&#xff1…

力扣:珠玑妙算(详解)

前言&#xff1a;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 珠玑妙算游戏&#xff08;the game of master mind&#xff09;的玩法如下。 计算机有4个槽&#xff0c;每个槽放一个球&#xff0c;颜色可…

电力系统网架规划MATLAB程序分享

网架数据展示&#xff1a;完整程序&#xff1a;close all;clear all;clc;warning off; % 去除警告 tic; % tic用来保存当前时间&#xff0c;而后使用toc来记录程序完成时间%% 基本参数T12; % 典型日 8-19h % 8-19h 负荷各时段负荷总量total_P_LOAD[828,1001,1105,1105,994,1105…