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时间片调度 时间片调度简介: 时间片调度实验流程: 核心代码: 开…...
git分支介绍
git branch 查看当前分支情况 可以看见当前只有一个分支叫main,也就是默认分支,可以理解为树的主干,git早期版本中默认分支叫master 命令行创建一个新分支 git branch [分支名]在创建之后,如果需要切换到新分支需要git switc…...
vm虚拟机下安装CentOS7系统
VMware16安装CentOS7 1.启动之前安装的VM 具体VMware安装过程 2.配置Linux(centos7)的镜像文件 选择安装镜像文件 4.开启虚拟机 开始读秒安装 选择安装过程中使用的语言,这里选择英文、键盘选择美式键盘。点击Continue 首先设置时间…...
python-报数(赛氪OJ)
[题目描述] 有 n 人围成一圈,顺序排号。 从第 1 个人开始报数(从 1 到 3 报数),凡是报到 3 的人退出圈子,问最后留下的是原来的第几号的那位。输入格式: 初始人数 n 。输出格式: 最后一人的初始…...
灵办AI:智能插件,办公与编程的得力助手
目录 引言一、灵办AI:智能化的办公伙伴二、编程能力:🔥代码阅读,学习助手🔥1、代码解读2、代码续写3、代码优化 三、插件端对话功能:智能交互,流畅体验四、翻译功能:一键翻译&#x…...
食家巷小程序:传统面点与平凉特产的美味盛宴
在美食的世界里,总有一些角落等待着我们去探索,而食家巷小程序就是这样一个为您开启美食宝藏的钥匙。 一、传统面点,传承千年的美味 食家巷小程序为您呈现了种类丰富的传统面点,每一款都蕴含着深厚的历史和文化底蕴。 平凉锅盔&…...
矢量文件坐标转换:2000坐标系转换为wgs84坐标系,具体代码实现
最近在处理矢量样本的时候,遇到一些shp文件的坐标系为2000坐标,需要统一地把非WGS84坐标系的矢量转换为WGS84坐标系。 本文记录一下如何进行2000坐标系转化为wgs84坐标系的过程。 在处理矢量数据转换的过程中,有几个关键步骤确保了数据的有效…...
MySQL-InnoDB引擎
目录 逻辑存储结构 架构 概述 内存结构 Buffer Pool(缓冲池) Change Buffer(更改缓冲区) Adaptive Hash Index(自适应hash索引) Log Buffer(日志缓冲区) 磁盘结构 System T…...
【Material-UI】复杂按钮 (Complex Button) 自定义详解
文章目录 一、ButtonBase 组件简介二、实例讲解:创建复杂的图片按钮1. 样式定义2. 核心组件构建3. 交互效果 三、高级自定义技巧1. 响应式设计2. 动态内容与动画 四、总结 在现代 Web 应用中,按钮不仅仅是一个点击交互元素,它们也承载着传递信…...
IT服务质量管理攻略(至简)
质量管理、风险管理和信息安全管理是IT服务监督管理的重要内容,三者之间相对独立。IT服务质量管理是通过制订质量方针、质量目标和质量计划,实施质量控制、质量保证和质量改进活动,确保IT服务满足服务级别协议的要求,最终获得用户…...
MySQL事务隔离级别、InnoDB使用MVCC+各种锁实现了RC和RR事务隔离级别、具体案例
事务隔离级别 脏读:一个事务读取到另一个未提交事务的更改。不可重复读:一个事务在两次读取同一数据时,发现数据被另一个已提交事务修改了。幻读:一个事务在读取过程中,因其他事务的插入而导致返回的行数不一致&#…...
你的Java项目还在等待吗?快来学会线程池,解放你的性能!
文章目录 你的Java项目还在等待吗?快来学会线程池,解放你的性能!1 什么是线程池?为什么需要它?2 线程池的参数有哪些?3 不同类型的线程池有哪些配置? 你的Java项目还在等待吗?快来学…...
深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告
前言 2024年7月10日,Anthropic Claude 3 Haiku 的微调功能在 Amazon Bedrock 上开放预览。本篇文章将分享 Claude 3 Haiku 的微调使用步骤及微调后模型的评估结果。 LLM 细调的优势 通过细调,LLM可以获得特定领域的知识或新知识。这样,与RA…...
2023年庐阳区青少年信息学科普日真题- 马拉松(marathon)
题目描述 环湖马拉松全程 L 公里,已经安排了 N 个补给点,位置已经确定。由于预算增加,现在可以增设 K 个补给点。如何安排新增的补给点使得相邻补给点间最大距离最小。相邻补给点间距离也包括起点与第一个补给点之间的距离和最后一个补给点与…...
Python笔记:socket.gaierror: [Errno -3] Temporary failure in name resolution
【Python】成功解决socket.gaierror: [Errno -3] Temporary failure in name resolution 在Python开发中,使用网络编程时,特别是处理socket连接时,遇到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. 链表相交 题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环…...
学习记录第二十一天
目录操作是指在计算机文件系统中对目录(也称为文件夹)进行的各种管理操作。目录是组织和存储文件的一种逻辑结构,它帮助用户和系统管理大量文件,使得文件查找和组织更加高效有序。目录操作主要包括以下几种: 1.创建目…...
江协科技51单片机学习- p31 LCD1602液晶屏驱动
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
Android SurfaceFlinger——渲染完成帧显示(四十八)
帧渲染完成后下一步就是将帧缓冲区(framebuffer)的内容发送到显示设备进行显示,也是 SurfaceFlinger 处理渲染合成的最后一步。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
