当前位置: 首页 > news >正文

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

文章目录

  • 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++;}}

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

实验结果:

在这里插入图片描述

相关文章:

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

文章目录 09. FreeRTOS时间片调度与任务相关函数1. FreeRTOS时间片调度2. 任务状态查询API函数3. 任务时间统计API函数 09. FreeRTOS时间片调度与任务相关函数 1. FreeRTOS时间片调度 时间片调度简介&#xff1a; 时间片调度实验流程&#xff1a; 核心代码&#xff1a; 开…...

git分支介绍

git branch 查看当前分支情况 可以看见当前只有一个分支叫main&#xff0c;也就是默认分支&#xff0c;可以理解为树的主干&#xff0c;git早期版本中默认分支叫master 命令行创建一个新分支 git branch [分支名]在创建之后&#xff0c;如果需要切换到新分支需要git switc…...

vm虚拟机下安装CentOS7系统

VMware16安装CentOS7 1.启动之前安装的VM 具体VMware安装过程 2.配置Linux&#xff08;centos7&#xff09;的镜像文件 选择安装镜像文件 4.开启虚拟机 开始读秒安装 选择安装过程中使用的语言&#xff0c;这里选择英文、键盘选择美式键盘。点击Continue 首先设置时间…...

python-报数(赛氪OJ)

[题目描述] 有 n 人围成一圈&#xff0c;顺序排号。 从第 1 个人开始报数&#xff08;从 1 到 3 报数&#xff09;&#xff0c;凡是报到 3 的人退出圈子&#xff0c;问最后留下的是原来的第几号的那位。输入格式&#xff1a; 初始人数 n 。输出格式&#xff1a; 最后一人的初始…...

灵办AI:智能插件,办公与编程的得力助手

目录 引言一、灵办AI&#xff1a;智能化的办公伙伴二、编程能力&#xff1a;&#x1f525;代码阅读&#xff0c;学习助手&#x1f525;1、代码解读2、代码续写3、代码优化 三、插件端对话功能&#xff1a;智能交互&#xff0c;流畅体验四、翻译功能&#xff1a;一键翻译&#x…...

食家巷小程序:传统面点与平凉特产的美味盛宴

在美食的世界里&#xff0c;总有一些角落等待着我们去探索&#xff0c;而食家巷小程序就是这样一个为您开启美食宝藏的钥匙。 一、传统面点&#xff0c;传承千年的美味 食家巷小程序为您呈现了种类丰富的传统面点&#xff0c;每一款都蕴含着深厚的历史和文化底蕴。 平凉锅盔&…...

矢量文件坐标转换:2000坐标系转换为wgs84坐标系,具体代码实现

最近在处理矢量样本的时候&#xff0c;遇到一些shp文件的坐标系为2000坐标&#xff0c;需要统一地把非WGS84坐标系的矢量转换为WGS84坐标系。 本文记录一下如何进行2000坐标系转化为wgs84坐标系的过程。 在处理矢量数据转换的过程中&#xff0c;有几个关键步骤确保了数据的有效…...

MySQL-InnoDB引擎

目录 逻辑存储结构 架构 概述 内存结构 Buffer Pool&#xff08;缓冲池&#xff09; Change Buffer&#xff08;更改缓冲区&#xff09; Adaptive Hash Index&#xff08;自适应hash索引&#xff09; Log Buffer&#xff08;日志缓冲区&#xff09; 磁盘结构 System T…...

【Material-UI】复杂按钮 (Complex Button) 自定义详解

文章目录 一、ButtonBase 组件简介二、实例讲解&#xff1a;创建复杂的图片按钮1. 样式定义2. 核心组件构建3. 交互效果 三、高级自定义技巧1. 响应式设计2. 动态内容与动画 四、总结 在现代 Web 应用中&#xff0c;按钮不仅仅是一个点击交互元素&#xff0c;它们也承载着传递信…...

IT服务质量管理攻略(至简)

质量管理、风险管理和信息安全管理是IT服务监督管理的重要内容&#xff0c;三者之间相对独立。IT服务质量管理是通过制订质量方针、质量目标和质量计划&#xff0c;实施质量控制、质量保证和质量改进活动&#xff0c;确保IT服务满足服务级别协议的要求&#xff0c;最终获得用户…...

MySQL事务隔离级别、InnoDB使用MVCC+各种锁实现了RC和RR事务隔离级别、具体案例

事务隔离级别 脏读&#xff1a;一个事务读取到另一个未提交事务的更改。不可重复读&#xff1a;一个事务在两次读取同一数据时&#xff0c;发现数据被另一个已提交事务修改了。幻读&#xff1a;一个事务在读取过程中&#xff0c;因其他事务的插入而导致返回的行数不一致&#…...

你的Java项目还在等待吗?快来学会线程池,解放你的性能!

文章目录 你的Java项目还在等待吗&#xff1f;快来学会线程池&#xff0c;解放你的性能&#xff01;1 什么是线程池&#xff1f;为什么需要它&#xff1f;2 线程池的参数有哪些&#xff1f;3 不同类型的线程池有哪些配置&#xff1f; 你的Java项目还在等待吗&#xff1f;快来学…...

深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告

前言 2024年7月10日&#xff0c;Anthropic Claude 3 Haiku 的微调功能在 Amazon Bedrock 上开放预览。本篇文章将分享 Claude 3 Haiku 的微调使用步骤及微调后模型的评估结果。 LLM 细调的优势 通过细调&#xff0c;LLM可以获得特定领域的知识或新知识。这样&#xff0c;与RA…...

2023年庐阳区青少年信息学科普日真题- 马拉松(marathon)

题目描述 环湖马拉松全程 L 公里&#xff0c;已经安排了 N 个补给点&#xff0c;位置已经确定。由于预算增加&#xff0c;现在可以增设 K 个补给点。如何安排新增的补给点使得相邻补给点间最大距离最小。相邻补给点间距离也包括起点与第一个补给点之间的距离和最后一个补给点与…...

Python笔记:socket.gaierror: [Errno -3] Temporary failure in name resolution

【Python】成功解决socket.gaierror: [Errno -3] Temporary failure in name resolution 在Python开发中&#xff0c;使用网络编程时&#xff0c;特别是处理socket连接时&#xff0c;遇到socket.gaierror: [Errno -3] Temporary failure in name resolution这个错误是一个相对…...

HexView 刷写文件脚本处理工具-基本功能介绍(三)-导出S19/HEX

菜单 导出(Export) 此项目将一系列不同的选项组合在一起,用于将内部数据存储为不同的文件格式。每种导出都可以包含一些选项,以调整输出信息。 导出为S-Record格式(Export as S-Record) Motorola S-Record格式导出数据。 记录类型将根据最高地址信息的长度自动选择。…...

代码随想录算法训练营第四天(二)|面试题 02.07. 链表相交 142.环形链表II

面试题 02.07. 链表相交 题目&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环…...

学习记录第二十一天

目录操作是指在计算机文件系统中对目录&#xff08;也称为文件夹&#xff09;进行的各种管理操作。目录是组织和存储文件的一种逻辑结构&#xff0c;它帮助用户和系统管理大量文件&#xff0c;使得文件查找和组织更加高效有序。目录操作主要包括以下几种&#xff1a; 1.创建目…...

江协科技51单片机学习- p31 LCD1602液晶屏驱动

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

Android SurfaceFlinger——渲染完成帧显示(四十八)

帧渲染完成后下一步就是将帧缓冲区(framebuffer)的内容发送到显示设备进行显示,也是 SurfaceFlinger 处理渲染合成的最后一步。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...