FreeRtos 获取任务运行时状态以及实现方式分析

2023-05-16

一、获取全部任务的状态

1.1 系统API函数

void vTaskList( char * pcWriteBuffer )

1.2 函数功能

返回所有任务的:

  • 任务名
  • 任务当前运行状态
  • 任务优先级
  • 任务剩余的最大栈空间
  • 任务ID。

1.3 函数参数

传入一个缓冲区地址。这个缓冲区要足够的长。因为vTaskList,只传入一个缓冲区地址信息,而没有传入缓冲区长度。在函数内部,没办法做缓冲区越界处理。如果传入的缓冲区空间太小,会引起缓冲区越界。缓冲区所需的大小跟系统的任务个数有关。可以先分配一个较大的缓冲区,例如500字节,调用vTaskList(buf) 后,通过strlen(buf) 求出实际所需的大小,再调整。

1.4 函数使用

将缓冲区传入vTaskList,vTaskList 里面把全部的任务状态格式化之后,填入缓冲区。然后再打印缓冲区。

char buf[300] = {0};
void task_debug_entry(void *parameter)
{
    task_debug_init();

    while (1)
    {
        os_delay_ms(6000);
        vTaskList(buf);
        app_log("\r\n taskName   status    pri   leftStack     taskNum \r\n");
        app_log("%s",buf);
        app_log("len:%d\n",strlen(buf));

    }
}

串口打印输出

在这里插入图片描述

二、获取任务的cpu占用率

2.1 系统api 函数

void vTaskGetRunTimeStats( char *pcWriteBuffer )

2.2 函数功能

返回所有任务的:

  • 任务名
  • 任务运行时间:从任务第一次被调度,到当前。
  • 任务的cpu 占用率。

2.3 函数参数

参照上面vTaskList

2.4 计算cpu 使用率的原理和实现方式

2.4.1 原理

计算每一个任务每次执行的时间,并把这个时间累加。
**任务cpu 占用率 = 任务运行时间的累加和 / 系统运行时间。 **

系统源码, task.c 文件的 vTaskGetRunTimeStats 函数,对应的实现如下:

ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime;

2.4.2 实现方式

任务时间计算器

我们需要一个独立于所有任务的计数器,用来精确计算每个任务的执行时间。由于系统调度的默认时间单位是1ms,有些简单的任务,还没执行够1ms,就阻塞,被切换了。所以,我们的计数器的时间单位,要远小于1ms。通常设置为系统调度时间的10-20 分之一。这里,我们设置为50us。

记录每个任务的执行的时间

在任务开始执行之前,记录下当前时间T0(ulTaskSwitchedInTime)。在任务被换出前,记录下当前时间T1(ulTotalRunTime )。当前任务运行的总的时间,就是T1 - T0。
在系统源码中, 任务上下文切换函数 vTaskSwitchContext 实现了这个处理。
在这里插入图片描述

2.5 在stm32 中的接口移植

增加全局的任务时间计算器

利用一个独立的定时器,产生一个周期为50us 的中断处理,在中断处理里,对任务时间进行累加。

long CPU_RunTime = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if ( htim == &htim16)
    {
      CPU_RunTime++;
    }
}

在系统接口中,返回CPU_RunTime

extern long CPU_RunTime;
__weak unsigned long getRunTimeCounterValue(void)
{
  return CPU_RunTime;
}

源码接口

FreeRTOSConfig.hportGET_RUN_TIME_COUNTER_VALUE 为系统源码的使用接口。
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue

2.5 应用层调用

void task_debug_entry(void *parameter)
{
    task_debug_init();

    while (1)
    {
        os_delay_ms(6000);
        vTaskGetRunTimeStats(buf);
        app_log("\r\n taskName    runCount    usedRate\r\n");
        app_log("%s",buf);
        app_log("len:%d\n",strlen(buf));
    }
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRtos 获取任务运行时状态以及实现方式分析 的相关文章

  • 【FreeRTOS 信号量】互斥信号量

    互斥信号量与二值信号量类似 但是互斥信号量可以解决二值信号量出现的优先级翻转问题 解决办法就是优先级继承 普通互斥信号量创建及运行 参阅安富莱电子demo 互斥信号量句柄 static SemaphoreHandle t xMutex NU
  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • Freertos中vTaskDelay()是怎么用的

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS ------- 任务(task)

    在学习RTOS的时候 个人觉得带着问题去学习 会了解到更多 1 什么是任务 在FreeRTOS中 每个执行线程都被称为 任务 每个任务都是在自己权限范围内的一个小程序 其具有程序入口每个任务都是在自己权限范围内的一个小程序 其具有程序入口通
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站

随机推荐

  • pixhawk接口图以及引脚说明

    pixhawk接口图和引脚如下 pixhawk可以同时使用2个GPS xff0c 这只能使用其中一个罗盘 xff0c 实际中飞控挑选其中信号好的一个GPS进行定位 硬件部分 xff1a 第二个GPS插在serial 4 5接口上 xff0c
  • 搭建pixhawk飞控无人小车--前期准备

    2019年打算搭建一款无人小车 xff0c 具有遥控 自动走线 激光雷达避障 视觉识别等功能 1 搭建apm开发环境 感谢阿木实验室提供开发环境 xff0c 下载其提供带开发环境的虚拟机即可 下载地址如下 xff1a 该地址已经失效 xff
  • 搭建pixhawk飞控无人小车--替换自带遥控器

    因为小车原装遥控器接收机和电调版整合在一个小板子上 xff0c 且没有相关资料 xff0c 无法接入飞控 因此单独购买遥控器 在某宝上购买富斯遥控器i6 xff0c 总共六个通道 三个双向开关 一个三向开关 遥控器简单入门视频如下 xff0
  • 搭建pixhawk飞控无人小车--飞控接遥控器、舵机、电调以及模式切换

    1 pixhawk飞控的RC IN接遥控器的接收机的PPM CH1 遥控器只需要接这个接线即可 注意飞控正面朝上 xff0c 上面为接地 和遥控器接收机刚好相反 因此不要接错 如下图 2 修改遥控器配置 xff1a System gt RX
  • 欠驱动Or全驱动?——关于机械手驱动方式的介绍与更优选择(以德国Schunk Hand为例)

    这篇文章主要将介绍机械手两种不同驱动方式 即欠驱动和全驱动的定义 应用背景 优劣性能等特性 xff0c 并将以雄克灵巧手为例 xff0c 讨论现阶段机械手驱动方式的更优选择方案 定义 xff1a 首先先来明确欠驱动和全驱动的定义 xff08
  • mysql 批量插入12位随机数字

    解析 xff1a 批量 随机12位数字 mysql随机12位数字 select CEILING RAND 900000000000 43 100000000000 mysql批量处理函数 delimiter create PROCEDURE
  • 俩小伙一晚上写了个 AI 应用,月入两万??(文末附开发教程)

    开发出一款能够与 AI 对话生成和编辑思维导图的工具 xff0c 听起来似乎只能是一群专业的 AI 背景团队花费大量的时间和精力训练模型 xff0c 打磨应用才能完成的事情 但是 xff0c 两名大学生却在一夜之间完成了 xff0c 就像炼
  • 几本对于笔试和面试有用的书

    4本408核心书籍 xff1a 数据结构 计算机操作系统 计算机网络 计算机组成原理 面试宝典 xff1a 程序员面试宝典 剑指offer 编程之美 微软技术面试心得 编程珠玑 Java程序员面试宝典 C语言 xff1a The C Pro
  • 我如何在计算机视觉顶级会议CVPR上发表论文?

    Scalers 点评 xff1a 两个月前 xff0c 成长会的Ramon S290 收到了计算机视觉顶级会议CVPR论文录取的通知 xff0c 而且是口头报告 CVPR在计算机视觉领域属于三大顶级会议之一 xff0c 具有较高的影响力 x
  • nginx整体结构,进程模型

    nginx的整体结构 xff1a 启动nginx 看到了一个master进程 xff0c 一个worker进程 命令 ps ef grep nginx 第一列 xff1a UID 进程所属的用户id 第二列 xff1a 进程ID PID 用
  • ICP、ISP、IAP、JTAG、SWD下载方式

    目录 ICP ISP IAP JTAG SWD下载方式 概述 JTAG SWD ICP ISP IAP ISP与ICP的差别 ISP和IAP的差别 ICP ISP IAP JTAG SWD下载方式 概述 JTAG和SWD是一种标准协议 xf
  • Linux定时任务crontab -e编辑无法保存

    创作时间 xff1a 2022年8月16日09 36 44 提示没权限 进入 var spool下查看cron目录是正常的 xff0c 但是在cron里面没有权限建立文件这个原因 可以尝试先在 var spool cron目录下用vim编辑
  • C++内存分配

    常见的内存分配方式 静态存储区 xff08 基栈 xff09 xff1a 此时的内存在程序编译的时候已经分配好 xff0c 并且在程序的整个运行期间都存在 里面的变量通常为 xff1a static变量 全局变量const常量 xff1b
  • PWM输出讲解

    一 PWM基础知识 1 PWM的定义 PWM xff0c 是脉冲宽度调制 缩写 xff0c 它是通过对一系列脉冲的宽度进行调制 xff0c 等效出所需要的波形 xff08 包含形状以及幅值 xff09 xff0c 对模拟信号电平进行数字编码
  • Win11中安装Linux 教程 | WSL2的使用

    Windows11今天正式向大家开始推送了 xff0c 这也算是十一假期中的一个重磅消息了 我相信有很多小伙伴会升级到Windows11 那这个视频就讲解一下如何在Windows11中安装Linux系统 xff0c 来帮助我们开发 也就是我
  • 没有键盘和显示屏玩转树莓派

    前期准备 win10电脑一台 xff0c 树莓派开发板 xff0c SD卡 xff0c 电源 xff0c 一根网线 xff08 教程中树莓派为RPI3 xff09 废话不说 xff0c 直接跟着走就行了 xff08 1 xff09 把SD卡
  • 无人机遥感应用

    xfeff xfeff 遥感的通用格式为tiff格式 科普 无人机遥感技术的几个领域应用 2016 09 14 10 10 来源 无人机频道 无人机 科普 原标题 xff1a 科普 无人机遥感技术的几个领域应用 无人机遥感在气象监测中的应用
  • Laf Assistant:云开发从未如此爽快!

    原文链接 xff1a https forum laf run d 67 工欲善其事 xff0c 必先利其器 在编写代码时 xff0c IDE 也是我们不可或缺的 它可以让我们更高效地完成代码编写 xff0c 提高开发效率 因此 xff0c
  • S 串口编程 详解4 串口发送数据

    S 串口编程 详解4 串口发送数据 串口发送数据包括 xff1a 十六进制发送数据 手动发送数据 自动发送数据 手动发送数据的代码如下 xff1a 手动发送 long TX count 61 0 void CSCOMMDlg OnButto
  • FreeRtos 获取任务运行时状态以及实现方式分析

    一 获取全部任务的状态 1 1 系统API函数 void vTaskList char pcWriteBuffer 1 2 函数功能 返回所有任务的 xff1a 任务名任务当前运行状态任务优先级任务剩余的最大栈空间任务ID 1 3 函数参数