IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> FreeRtos 获取任务运行时状态以及实现方式分析 -> 正文阅读

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

一、获取全部任务的状态

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));
    }
}

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:43:47  更:2022-03-12 17:44:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:17:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码