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

基于MATLAB与机器学习(SVM)的裂缝检测识别系统,附GUI界面、特征参数计算与Excel...

基于MATLAB和机器学习&#xff08;向量机&#xff09;的裂缝检测&#xff08;识别&#xff09;系统程序&#xff0c;带GUI界面&#xff0c;对裂缝主要参数&#xff08;长度&#xff0c;宽度&#xff0c;面积&#xff09;进行计算&#xff0c;已经训练好分类器&#xff0c;包含裂…...

Aitoon arnold渲染器 卡通材质

Edge边&#xff0c;silhouette剪影只有两个跟普通材质不同&#xff0c;其他都跟普通材质一样Stylized highlight风格化高光&#xff1b;specular高光&#xff1b;rim lighting轮廓光transmission透射sheen光泽emission自发光【实例 卡通材质渲染边】打开edge requires contour …...

2024终极突破:如何用Bypass Paywalls Clean免费解锁付费墙内容?[特殊字符]

2024终极突破&#xff1a;如何用Bypass Paywalls Clean免费解锁付费墙内容&#xff1f;&#x1f680; 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 你是否经常在搜索学术资料时被付…...

2026 RAG 全景落地教程(非常详细),从大模型基座到 Agent 记忆从入门到精通,收藏这一篇就够了!

这是一份让你看完就能动手&#xff0c;少走半年弯路的实战指南。 为什么你必须搞懂 RAG 2023 年是大模型“百模大战”年&#xff0c;所有人都在刷榜单、比参数。2024 年起&#xff0c;战场转移了——谁能把大模型真正用起来&#xff0c;谁才有价值。 而检索增强生成&#xf…...

网络和并发 第五节:Python中的多线程

一、线程的相关概念 在Python中,想要实现多任务除了使用进程,还可以使用线程来完成,线程是实现多任务的另外一种方式。 1、什么是线程 线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要cpu进行调度 ,也就是说线程是cpu调度的基本单位,每个进…...

DFS实现回溯算法

在算法学习的过程中&#xff0c;深度优先搜索&#xff08;DFS&#xff09;和回溯算法可以说是每个程序员都必须掌握的经典内容。它们像是一对孪生兄弟&#xff0c;经常一起出现&#xff0c;解决各种组合、排列、搜索类问题。今天&#xff0c;我们就来深入探讨如何用DFS实现回溯…...

遥感图像分割实战:用ResNet50和VGG16改进UNet,哪个模型效果更好?

遥感图像分割实战&#xff1a;UNet架构下ResNet50与VGG16骨干网络的深度对比 当我们需要从高空视角中精确识别建筑物轮廓时&#xff0c;遥感图像分割技术就像给计算机装上"透视眼"。在众多解决方案中&#xff0c;UNet及其变体已成为医学影像和遥感领域的黄金标准。但…...

如何通过Jellyfin Bangumi插件实现番剧元数据的精准管理

如何通过Jellyfin Bangumi插件实现番剧元数据的精准管理 【免费下载链接】jellyfin-plugin-bangumi bgm.tv plugin for jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-bangumi 在数字媒体管理领域&#xff0c;番剧作为一种特殊的内容形式&…...

微前端架构中awesome-micro-npm-packages的终极应用指南:模块化开发的未来趋势

微前端架构中awesome-micro-npm-packages的终极应用指南&#xff1a;模块化开发的未来趋势 【免费下载链接】awesome-micro-npm-packages A curated list of small, focused npm packages. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-micro-npm-packages awe…...

效率提升神器:用快马AI自动诊断并修复npm 128错误,节省排错时间

效率提升神器&#xff1a;用快马AI自动诊断并修复npm 128错误&#xff0c;节省排错时间 最近在团队协作开发一个Node.js项目时&#xff0c;频繁遇到npm安装依赖报错128的问题。每次都要花大量时间排查SSH配置、网络代理或仓库源的问题&#xff0c;严重影响了开发效率。于是我开…...