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系列

    1 多任务系统 1 1 前后台系统 单片机裸机开发时 一般都是在main函数里面用while 1 做一个大循环来完成所有的处理 循环中调用相应的函数完成所需的处理 有时也需要在中断中完成一些处理 相对于多任务系统而言 这就是单人单任务系统也
  • FreeRTOS快速上手

    FreeRTOS使用 一 源码下载和移植文件提取 1 1 源码下载 在网站https sourceforge net projects freertos 可以找到freertos最新的源码 1 2 移植文件提取 根据第一步 我们会得到一个f
  • 【FreeRTOS 信号量】互斥信号量

    互斥信号量与二值信号量类似 但是互斥信号量可以解决二值信号量出现的优先级翻转问题 解决办法就是优先级继承 普通互斥信号量创建及运行 参阅安富莱电子demo 互斥信号量句柄 static SemaphoreHandle t xMutex NU
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • FreeRTOS学习笔记(3、信号量、互斥量的使用)

    FreeRTOS学习笔记 3 信号量 互斥量的使用 前言 往期学习笔记链接 学习工程 信号量 semaphore 两种信号量的对比 信号量的使用 1 创建信号量 2 give 3 take 4 删除信号量 使用计数型信号量实现同步功能 使用
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • FreeRTOS之事件

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

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 小型 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 函数参数