当前位置: 首页 > 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.准备帧数据以进行显示(异步方式)…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...