基于正点原子的FreeRTOS学习笔记——任务时间管理API实验

目录

一、任务时间管理API介绍

二、宏定义修改

三、实验程序

3.1、时基定时器配置

3.2、任务程序

四、实验现象


一、任务时间管理API介绍

在官方文档的API引用任务实用程序中可以找到此API的介绍

https://www.freertos.org/zh-cn-cmn-s/a00021.html#vTaskGetRunTimeStats

void vTaskGetRunTimeStats( char *pcWriteBuffer );

此函数用于统计任务的运行时间信息并且configGENERATE_RUN_TIME_STATS、configUSE_STATS_FORMATTING_FUNCTIONS 和 configSUPPORT_DYNAMIC_ALLOCATION 必须全部定义为 1,该函数才可用。该应用程序 还必须提供 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 和 portGET_RUN_TIME_COUNTER_VALUE 的定义, 以便分别配置外设定时器/计数器和返回定时器的当前计数值。计数器的频率应该至少是滴答计数的 10 倍。

注意:此函数将在其持续时间内禁用中断。 它不是作为正常的应用程序运行时的工具,而是作为调试辅助工具

该 API 在内部调用 vTaskGetRunTimeStatistics 函数,并假设 pcWriteBuffer 的长度为 configSTATS_BUFFER_MAX_LENGTH。该函数仅适用于向后兼容。建议新应用程序使用 vTaskGetRunTimeStatistics 并显式提供 pcWriteBuffer 的长度。

参数:

pcWriteBuffer 一个缓冲区, 执行时间将以 ASCII 形式写入其中。 假设此缓冲区足够大, 足以容纳生成的报告。 大约为每个任务分配 40 字节的缓冲区 就足够了。

 函数会生成一个表格信息,使用printf打印出现下列表格的效果

Abs Time:绝对时间,任务实际运行时间,乘以滴答定时器定时时间。

% Time:占总处理时间的百分比。

二、宏定义修改

需要配置四个宏。 这些宏可以在 FreeRTOSConfig.h 中定义。

  1. configGENERATE_RUN_TIME_STATS

    通过将 configGENERATE_RUN_TIME_STATS 定义为 1,启用收集运行时统计信息。 一旦完成此设置,还必须定义另外两个宏,以确保能成功 编译。

  2. configUSE_STATS_FORMATTING_FUNCTIONS                               configUSE_TRACE_FACILITY为1时,会编译vTaskList()和vTaskGetRunTimeStats()函数, 

  3. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()

    运行时统计信息的时间基数需要比 tick 中断具有更高的分辨率—— 否则统计信息可能会不准确,无法真正发挥作用。 建议将 此时间基数设置为比 tick 中断快 10 到 100 倍。 时间基数越快, 统计数据就越准确——但定时器值也会越早溢出。

    如果将 configGENERATE_RUN_TIME_STATS 定义为 1,那么 RTOS 内核会 在启动时自动调用 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (从 vTaskStartScheduler() API 中进行调用)。

  4. portGET_RUN_TIME_COUNTER_VALUE()

    此宏应只返回当前的时间,正如 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 所配置的那样。

三、实验程序

3.1、时基定时器配置

#define configTICK_RATE_HZ   1000   /* 定义系统时钟节拍频率, 单位: Hz, 无默认需定义 */

由此宏定义滴答定时器为(1 / 1000Hz)= 1ms,时基定时器要快10~100倍,这里设置快100倍,所以时基定时器为10us。

uint32_t FreeRTOSRunTimeTicks;/*10us = 72 * 10 / 72M*/
void ConfigureTimeForRunTimeStats(void)
{btim_timx_int_init(9,71);FreeRTOSRunTimeTicks = 0;
}

注:定义后记得在头文件中声明

3.2、任务程序

char task_buff[300];
/* 实现任务状态查询API函数使用 */
void task2( void * pvParameters )
{uint8_t key = 0;while(1){key = key_scan(0);if(key == KEY0_PRES){vTaskGetRunTimeStats(task_buff);printf("%s\r\n",task_buff);}vTaskDelay(10);}}

四、实验现象

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

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

相关文章

23_嵌入式系统存储体系

目录 高速缓存cache cache的作用 统一的cache和独立的数据/程序cache CPU更新cache和主存的方法 读操作分配cache和写操作分配cache cache工作原理 存储管理单元 MMU特点 TLB MMU内存块和域 MMU的地址变换过程 使能MMU时存储访问过程 禁止MMU时存储访问过程 快速上…

3033. 修改矩阵 Easy

给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix ,新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等,接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。 返回矩阵 answer 。 示例 1: 输入:…

【基于R语言群体遗传学】-2-模拟基因型(simulating genotypes)

书接上文,我们昨天讨论了遗传的哈代温伯格比例: 【基于R语言群体遗传学】-1-哈代温伯格基因型比例-CSDN博客 接下来,如果我们能够模拟一个过程并观察模拟结果与我们预期的是否相符,这通常有助于指导我们对这个过程的直观感觉。让…

Mysql笔记-v2

零、 help、\h、? 调出帮助 mysql> \hFor information about MySQL products and services, visit:http://www.mysql.com/ For developer information, including the MySQL Reference Manual, visit:http://dev.mysql.com/ To buy MySQL Enterprise support, training, …

【刷题笔记(编程题)05】另类加法、走方格的方案数、井字棋、密码强度等级

1. 另类加法 给定两个int A和B。编写一个函数返回AB的值,但不得使用或其他算数运算符。 测试样例: 1,2 返回:3 示例 1 输入 输出 思路1: 二进制0101和1101的相加 0 1 0 1 1 1 0 1 其实就是 不带进位的结果1000 和进位产生的1010相加 无进位加…

grpc-go服务端接口添加

【1】新建一个目录whgserviceproto,目录下新建一个proto包:whgserviceproto.proto (注意目录和包名称保持一致) //协议为proto3 syntax "proto3"; // 指定生成的Go代码在你项目中的导入路径 option go_package"…

【数据结构】06.栈队列

一、栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&#…

昇思MindSpore学习总结九——FCN语义分割

1、语义分割 图像语义分割(semantic segmentation)是图像处理和机器视觉技术中关于图像理解的重要一环,AI领域中一个重要分支,常被应用于人脸识别、物体检测、医学影像、卫星图像分析、自动驾驶感知等领域。 语义分割的目的是对图…

【MySQL】数据类型{tinyint/bit/float/decimal/char/varchar/date/enum/set}

文章目录 1.数据类型分类2.数值类型2.1tinyint 1字节2.2bit 0-64位2.3浮点类型float 4个字节decimal 3.字符串类型char开多少空间为多大varchar开多少是上限 存多少占多大空间日期和时间类型enum和setenum:枚举,“单选”类型;set:…

数字人大赋能未来治理新篇章,正宇软件助力人大建设新实践

在全面贯彻落实党的二十大精神的开局之年,数字中国战略的深入实施如同一股强劲的东风,吹遍了神州大地的每一个角落。作为数字中国建设的重要组成部分,数字人大作为现代信息技术与人大工作深度融合的产物,正以其独特的魅力和深远的…

自定义代理编辑控件类TComboBoxDelegate

自定义代理编辑控件是在tableView单元格中,呈现编辑辅助的Combox控件 自定义代理编辑控件类TComboBoxDelegate的定义过程 重写自定义代理编辑组件类的四个方法: 创建编辑组件、模型赋值给代理编辑组件、代理编辑组件数据到模型、更新位置 .h #ifndef TC…

google::protobuf命名空间下常用的C++ API----message.h

#include <google/protobuf/message.h> namespace google::protobuf 假设您有一个消息定义为: message Foo {optional string text 1;repeated int32 numbers 2; } 然后&#xff0c;如果你使用 protocol编译器从上面的定义生成一个类&#xff0c;你可以这样使用它: …

docker介绍与详细安装

1 docker 介绍 1.1 虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破实…

docker部署wg-easy和firefly

Background WireGuard是一种新型的VPN协议,它通过在内核层运行,提供高效、安全、简单和现代的VPN解决方案。wg-easy是一个专为简化 WireGuard VPN配置和管理而设计的工具&#xff0c;提供了界面化的管理&#xff0c;进一步降低WireGuard 的使用门槛&#xff0c;让用户无需深入了…

嵌入式Linux系统编程 — 6.7 实时信号

目录 1 什么是实时信号 2 sigqueue函数 3 sigpending()函数 1 什么是实时信号 等待信号集只是一个掩码&#xff0c;它并不追踪信号的发生次数。这意味着&#xff0c;如果相同的信号在被阻塞的状态下多次产生&#xff0c;它只会在信号集中被记录一次&#xff0c;并且在信号集…

利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API

谷歌在2024年4月发布了全新一代的多模态模型Gemini 1.5 Pro&#xff0c;Gemini 1.5 Pro不仅能够生成创意文本和代码&#xff0c;还能理解、总结上传的图片、视频和音频内容&#xff0c;并且支持高达100万tokens的上下文。在多个基准测试中表现优异&#xff0c;性能超越了ChatGP…

node 下载文件到网络共享目录

1、登录网络共享计算器 2、登录进入后复制要存储文件的目录路径 例如&#xff1a; \\WIN-desktop\aa\bb\cc 3、node 下载后写入网络共享目录 注意&#xff08;重要&#xff09;:在使用UNC路径时&#xff0c;请确保你正确转义了反斜杠&#xff08;使用两个反斜杠来表示一个&…

Ubuntu 22.04远程自动登录桌面环境

如果需要远程自动登录桌面环境&#xff0c;首先需要将Ubuntu的自动登录打开&#xff0c;在【settings】-【user】下面 然后要设置【Sharing】进行桌面共享&#xff0c;Ubuntu有自带的桌面共享功能&#xff0c;不需要另外去安装xrdp或者vnc之类的工具了 点开【Remote Desktop】…

跑冒滴漏智能识别摄像机

对于现代城市管理来说&#xff0c;跑冒滴漏智能识别摄像机正逐渐成为解决水管漏水问题和保护城市供水安全的重要工具。这类摄像机通过先进的视觉识别和数据分析技术&#xff0c;能够有效监测和识别城市管道系统中的漏水现象&#xff0c;对于提升供水系统效率和保障城市居民生活…

探寻操作系统文件名字符限制的规则和历史

引言 从最早的电脑系统到现代的操作系统&#xff0c;文件命名的规则一直在不断发展&#xff0c;这些规则体现了不同操作系统设计哲学的差异。作为开发者&#xff0c;了解这些差异和背后的历史渊源非常有价值&#xff0c;本文将详细探讨Windows、macOS和Linux三大主流操作系统在…