09.FreeRTOS时间片调度与任务相关函数

news2025/1/23 11:58:10

文章目录

  • 09. FreeRTOS时间片调度与任务相关函数
    • 1. FreeRTOS时间片调度
    • 2. 任务状态查询API函数
    • 3. 任务时间统计API函数

09. FreeRTOS时间片调度与任务相关函数

1. FreeRTOS时间片调度

时间片调度简介:

在这里插入图片描述

时间片调度实验流程:
在这里插入图片描述

核心代码:

开始任务函数:

void start_task(void* pvParamter)
{
	taskENTER_CRITICAL();   // 进入临界区 
	
	xTaskCreate((TaskFunction_t        )   task1,                 //指向任务函数的指针
				(char *                )   "task1",               //任务名称
				(configSTACK_DEPTH_TYPE)   TASK1_TASK_STACK_SIZE, //任务堆栈大小,字节为单位
				(void *                )   NULL,                  //传递给任务函数的参数
				(UBaseType_t           )   TASK1_TASK_PRIO,       //任务优先级
				(TaskHandle_t *        )   &task1_task_handler    //任务句柄:任务控制块
	);
				
	xTaskCreate((TaskFunction_t        )   task2,                 //指向任务函数的指针
				(char *                )   "task2",               //任务名称
				(configSTACK_DEPTH_TYPE)   TASK2_TASK_STACK_SIZE, //任务堆栈大小,字节为单位
				(void *                )   NULL,                  //传递给任务函数的参数
				(UBaseType_t           )   TASK2_TASK_PRIO,       //任务优先级
				(TaskHandle_t *        )   &task2_task_handler    //任务句柄:任务控制块
	);	

	vTaskDelete(NULL);
				
	taskEXIT_CRITICAL();    // 退出临界区 
}

任务1函数:

void task1(void* pvParamter)
{
	uint32_t task1_num = 0;
	
	while(1)
	{
		taskENTER_CRITICAL();
		printf("task1正在运行!!!%d\r\n",++task1_num);
		taskEXIT_CRITICAL(); 
		delay_ms(10);		
	}
}

任务2函数:

void task2(void* pvParamter)
{
	uint32_t task2_num = 0;
	
	while(1)
	{
		taskENTER_CRITICAL();
		printf("task2正在运行!!!%d\r\n",++task2_num);
		taskEXIT_CRITICAL(); 
		delay_ms(10);		
	}
}

实验结果:
在这里插入图片描述

2. 任务状态查询API函数

函数描述
uxTaskPriorityGet()获取任务优先级
vTaskPrioritySet()设置任务优先级
uxTaskGetNumberOfTasks()获取系统中任务的数量
uxTaskGetSystemState()获取所有任务状态信息
vTaskGetInfo()获取指定单个的任务信息
xTaskGetCurrentTaskHandle()获取当前任务的任务句柄
xTaskGetHandle()根据任务名获取该任务的任务句柄
uxTaskGetStackHighWaterMark()获取任务的任务栈历史剩余最小值
eTaskGetState()获取任务状态
vTaskList()以“表格”形式获取所有任务的信息
vTaskGetRunTimeStats()获取任务的运行时间
  • uxTaskPriorityGet()函数

    函数解释:

    在这里插入图片描述

    代码实现:

    //1.查询任务的优先级
    UBaseType_t priority_num = 0;
    priority_num = uxTaskPriorityGet(task1_task_handler);
    printf("1.任务1的任务优先级为:%ld\r\n\n", priority_num);
    

    实验结果:

    在这里插入图片描述

  • vTaskPrioritySet()函数

    函数解释:

    在这里插入图片描述

    代码实现:

    //2.设置任务的优先级
    vTaskPrioritySet(task2_task_handler,30);
    priority_num = uxTaskPriorityGet(task2_task_handler);
    printf("2.任务2的任务优先级为:%ld\r\n\n", priority_num);
    

    实验结果:

    在这里插入图片描述

  • uxTaskGetNumberOfTasks() 函数

    函数解释:

    在这里插入图片描述

    代码实现:

    //3.获取任务的数量
    UBaseType_t task_num = 0;
    task_num = uxTaskGetNumberOfTasks();
    printf("3.当前的任务数量为:%ld\r\n\n", task_num);
    

    实验结果:

    在这里插入图片描述

  • uxTaskGetSystemState()函数

    函数解释:

    在这里插入图片描述

    在这里插入图片描述

    代码实现:

    //4.获取所有任务的状态信息
    UBaseType_t task_num2 = 0;
    TaskStatus_t * status_array = 0; 
    uint8_t i = 0;
    status_array = mymalloc(SRAMIN,sizeof(TaskStatus_t *) * task_num);
    task_num2 = uxTaskGetSystemState( status_array,task_num, NULL);
    
    for(i = 0;i < task_num2; i++)
    {
        printf("4.%d 任务名:%s \r\n", i+1, status_array[i].pcTaskName);
        printf("4.%d 当前任务优先级:%ld \r\n", i+1, status_array[i].uxCurrentPriority);
        printf("4.%d 任务编号:%ld \r\n", i+1, status_array[i].xTaskNumber);
    }
    printf("\n");
    

    实验结果:

    在这里插入图片描述

  • vTaskGetInfo()函数

    函数解释:

    在这里插入图片描述

    代码实现:

    //5.获取单个任务的状态信息
    TaskStatus_t * status_array2 = 0; 
    status_array2 = mymalloc(SRAMIN,sizeof(TaskStatus_t *));
    vTaskGetInfo(task2_task_handler, status_array2, pdTRUE, eInvalid);
    printf("5.任务名:%s\r\n", status_array2->pcTaskName);
    printf("5.当前任务优先级:%ld\r\n", status_array2->uxCurrentPriority);
    printf("5.任务编号:%ld\r\n", status_array2->xTaskNumber);
    printf("5.任务状态:%d\r\n\n",  status_array2->eCurrentState);
    

    实验结果:

    在这里插入图片描述

  • xTaskGetCurrentTaskHandle()函数

    函数解释:

    在这里插入图片描述

    代码实现:

    实验结果:

  • xTaskGetHandle()函数

    函数解释:

    在这里插入图片描述

    代码实现:

    //6.获取任务句柄
    TaskHandle_t task_handle = 0;
    task_handle = xTaskGetHandle("task1");
    printf("6.任务句柄:%#x\r\n",  (int)task_handle);
    printf("6.task的任务句柄:%#x\r\n\n",  (int)task1_task_handler);
    

    实验结果:

    在这里插入图片描述

  • uxTaskGetStackHighWaterMark()函数

    函数解释:

    在这里插入图片描述

    代码实现:

    //7.获取指定任务的任务栈历史最小剩余堆栈
    UBaseType_t task_stack_min  = 0;
    task_stack_min = uxTaskGetStackHighWaterMark(task2_task_handler);
    printf("7.task2历史剩余最小堆栈为:%ld\r\n\n", task_stack_min);
    

    实验结果:

    在这里插入图片描述

  • eTaskGetState()函数

    函数解释:

    在这里插入图片描述

    代码实现:

    //8.查询任务的运行状态
    eTaskState task_status = 0;
    task_status = eTaskGetState(task2_task_handler);
    printf("8.当前task2的运行状态为:%d\r\n\n", task_status);
    

    实验结果:

    在这里插入图片描述

  • vTaskList()函数

    函数解释:

    在这里插入图片描述

    代码实现:

    //9.以表格形式获取系统中任务的信息
    char task_buff[300];
    vTaskList(task_buff);
    printf("9.\r\n");
    printf("%s\r\n\n", task_buff);
    

    实验结果:

    在这里插入图片描述

3. 任务时间统计API函数

  • vTaskGetRunTimeStats()函数

函数解释:

在这里插入图片描述

在这里插入图片描述

代码实现:

任务中实现:

while(1)
{
    key = key_scan(0);
    if(key == KEY0)
    {
        vTaskGetRunTimeStats(task_buff);
        printf("%s\r\n", task_buff);
    }
    vTaskDelay(10);		
}

FreeRTOSConfig.h文件:

/* 运行时间和任务状态统计相关定义 */
#define configGENERATE_RUN_TIME_STATS                   1                       // 1: 使能任务运行时间统计功能, 默认: 0 
#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
#define configUSE_TRACE_FACILITY                        1                       // 1: 使能可视化跟踪调试, 默认: 0 
#define configUSE_STATS_FORMATTING_FUNCTIONS            1                       // 1: configUSE_TRACE_FACILITY为1时,会编译vTaskList()和vTaskGetRunTimeStats()函数, 默认: 0 

在这里插入图片描述

btim.c文件:

//定义变量FreeRTOSRunTimeTicks
uint32_t FreeRTOSRunTimeTicks;

/*时基定时器初始化*/
void ConfigureTimeForRunTimeStats()
{
	btim_tim6_int_init(10-1, 720-1);   //10us中断一次
	FreeRTOSRunTimeTicks = 0;
}

/*定时器6中断初始化*/
void btim_tim6_int_init(uint16_t psc, uint16_t per)
{
    g_tim6_handle.Instance = TIM6;
    g_tim6_handle.Init.Prescaler = psc;
    g_tim6_handle.Init.Period = per;
    
    HAL_TIM_Base_Init(&g_tim6_handle);
    
    //使能更新中断,并启动计数器
    HAL_TIM_Base_Start_IT(&g_tim6_handle);
}

/*定时器6中断服务函数*/
void TIM6_IRQHandler()
{
    //处理基本定时器中断事件
    HAL_TIM_IRQHandler(&g_tim6_handle);
}

/*定时器溢出中断回调函数*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (htim->Instance == TIM6)
    {
        FreeRTOSRunTimeTicks++;
    }
    
}

定时器程序运行流程:
在这里插入图片描述

实验结果:

在这里插入图片描述

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

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

相关文章

盲盒卡牌风靡市场,抽卡机小程序成为新的机遇

如今&#xff0c;在商场中都可以看到卡牌的身影&#xff0c;拆卡成为了当下年轻人休闲娱乐的新宠&#xff0c;卡牌市场逐渐升温。抽卡机小程序作为一个能够快速拆卡的新模式&#xff0c;已经逐渐成为了用户拆卡的重要渠道&#xff0c;也为卡牌市场的发展提供了重要方式。本文将…

数字化转型如何通过数据改变企业的运营流程?

不仅仅是技术层面的革新&#xff0c;更是企业运营理念、组织架构、文化氛围及市场策略的全面升级。数字化转型通过深度融合云计算、大数据、人工智能、物联网等前沿技术&#xff0c;优化企业运营流程&#xff0c;提升效率&#xff0c;增强竞争力&#xff0c;从而在快速变化的市…

RTOS(8)信号量和互斥量

1.信号量 信号量分为二值信号量和计数信号量 与队列相比&#xff1a;他不能传输数据&#xff0c;但同时他不需要传输数据&#xff0c;占用的空间也更小&#xff0c;运行更快&#xff1b; 2.互斥量 与二值信号量类似&#xff0c;是特殊的信号量&#xff0c;本身是想实现谁上锁…

【Harmony Next】在鸿蒙项目中一键添加卡片

【Harmony Next】在鸿蒙项目中一键添加卡片 1.下载鸿蒙编译器DevEco Studio的插件DevEco CodeGenie【下载链接】 在华为的编译器现在官网下面可以下载DevEco CodeGenie的压缩包&#xff0c;安装后可以使用DevEco CodeGenie进行智能问答、生成卡片、知识查询等操作 2.安装DevE…

MapStruct实体映射工具

一丶MapStruct是什么 MapStruct 是一个代码生成器,它基于配置方法的约定,极大地简化了 Java Bean 类型之间映射的实现,生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。 官方网站 MapStruct – Java bean mappings, the easy way! 二丶为什么需要MapStru…

桌管系统能否查微信聊天记录?这篇文章告诉你答案

桌面管理系统&#xff08;简称“桌管系统”&#xff09;确实可以用来监控和查看员工的微信聊天记录。以“安企神”这款桌管系统为例&#xff0c;它提供了全面的功能来帮助企业管理和监控员工的上网行为及通信记录。以下是关于安企神系统如何查看微信聊天记录的一些具体信息&…

什么是行为监控?企业透明化管理新纪元!揭秘四款顶尖行为监控软件!

行为监控&#xff0c;是指通过技术手段对员工在工作场所内的行为、活动以及数据使用情况进行全面、实时的监测与分析。它不仅帮助管理者洞悉员工工作状态&#xff0c;提升团队效率&#xff0c;还能有效防止数据泄露和不当行为&#xff0c;为企业构建更加安全、有序的工作环境。…

RAG前沿技术/解决方案梳理

RAG前沿技术/解决方案梳理 BenchmarkRetrievalAdaptive-RAGDR-RAGRichRAGGenRT Critique/ReasoningSelf-RAGCorrective RAGSpeculative RAGPlanRAGSelf-ReasoningReSP MemorySelfmemHippoRAG Query RewriteRaFe SummaryRefiner 个人理解 对当前RAG的学术研究&#xff08;或者好…

加密的PDF文件怎么能够转换为word文档

Word是一种常见的文档格式&#xff0c;被广泛应用于办公室、教育等领域&#xff0c;目前它拥有较为丰富的文档编辑和格式化功能。然而&#xff0c;因为当前很多场景下&#xff0c;大多数资料文件都是以PDF格式存在&#xff0c;因为其具备比较强的稳定性&#xff0c;所以想要去修…

LearnOpenGL-光照章节学习笔记

LearnOpenGL-光照章节学习笔记 颜色创建一个光照场景 基础光照一、环境光照二、漫反射光照三、镜面反射 材质光照贴图一、漫反射贴图二、镜面光贴图三、放射光贴图 投光物一、平行光二、点光源衰减实现 三、聚光灯平滑边缘 多光源一、平行光&#xff08;定向光&#xff09;二、…

知识分享 | 详解整车区域控制器(ZCU)

随着智能网联汽车技术的迅猛发展&#xff0c;整车区域控制器ZCU&#xff08;Zone Control Unit&#xff09;作为汽车电子电气架构中的核心组件&#xff0c;其重要性日益凸显。ZCU不仅作为区域数据中心、IO中心及配电中心&#xff0c;在车辆动力、传感器管理、信息娱乐等方面发挥…

线性DP+摆渡车

线性DP&#xff1a; 具有线性“阶段”划分的动态规划算法称为线性DP。 线性DP无论状态表示是一维还是多维&#xff0c;DP算法在线性DP问题上都体现出了“作用在线性空间上的阶段划分和状态转移” &#xff0c;DP的阶段沿着各个维度线性增长。从一个或多个“初始状态”开始有方…

uni-app下Worker的使用

1、在static目录下创建一个目录用于存放worker文件 为啥要在static目录下创建worker目录呢&#xff1f;那是因为worker.js没办法在别的js中被引用&#xff0c;uni-app项目编译成微信小程序代码时会进行Tree-shaking&#xff08;摇树优化&#xff09;&#xff0c;把那些没被引用…

全方位教程:接入视频美颜SDK与直播美颜插件的完整步骤

今天&#xff0c;小编将为您详细介绍如何接入视频美颜SDK与直播美颜插件的完整步骤。 一、准备工作 开发环境的搭建 在开始集成之前&#xff0c;确保您的开发环境已配置完毕。无论是使用iOS、Android&#xff0c;还是Web开发&#xff0c;您都需要准备好对应的开发工具链&…

人工智能深度学习系列—深入探索KL散度:度量概率分布差异的关键工具

人工智能深度学习系列—深度解析&#xff1a;交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;在分类问题中的应用 人工智能深度学习系列—深入解析&#xff1a;均方误差损失&#xff08;MSE Loss&#xff09;在深度学习中的应用与实践 人工智能深度学习系列—深入探索KL…

你的报表工具选对了吗?中国式报表的正确制作方法

1. 中国式报表的困境 在许多企业中&#xff0c;“中国式报表”是一个让人头疼的存在。中国式报表通常格式复杂&#xff0c;包含大量数据和多层次的数据结构。它不仅需要展示大量的统计数据&#xff0c;还要通过交叉计算等方式呈现数据之间的关系。这种报表对数据处理能力、展示…

关于hive与hadoop初了解

hdfs分布式存数据&#xff0c;MapReduce处理数据。yarn资源管理和任务调度。 hive就是方便处理hadoop数据的 。 hive本事不处理数据&#xff0c;在hive on yarn上是 将sql转换为mapreduce程序&#xff08;不太理解&#xff0c;后续了解吧&#xff09;

数据编制全攻略:从杂乱原始数据到AI就绪数据集的转化之旅

目录 什么是数据编制?数据编制的重要性数据编制的基本流程1. 数据收集2. 数据清洗3. 数据转换4. 数据结构化5. 数据集成6. 数据验证 数据编制的最佳实践1. 制定数据标准2. 自动化流程3. 版本控制4. 数据质量监控5. 文档化6. 安全性和隐私保护 数据编制中的常见挑战及解决策略1…

日志系统——异步缓冲区

生产者——消费者模型&#xff1a; 多线程场景中最常见的模型之一&#xff0c;异步写日志时负责产生日志消息的业务线程充当生产者&#xff0c;负责写日志的线程充当消费者&#xff0c;两种角色进行数据交互需要依靠一块缓冲区。 单缓冲区的缺点 传统的单缓冲区PC模型一般是基…

【工具推荐】强大的图形化“社工密码生成器”

下载地址&#xff1a; 关注WX“光剑安全”公众号&#xff0c;发送“20240807社工”即可获得工具包&#xff01; 工具一&#xff1a;安全牛&#xff0c;java运行的一款社工密码生成器。 1、工具页面如下&#xff0c;可以根据对方信息、对方配偶信息、特殊符号进行排列组合生成…