当前位置: 首页 > article >正文

RTOS实时操作系统(任务运行性能分析)

1,查看任务运行状态:

  • X:表示任务当前正在运行(eXecuting)。
  • B:表示任务处于阻塞状态(Blocked),这意味着任务正在等待某个事件发生,比如等待信号量、互斥量、事件组、消息队列或者定时器。
  • R:表示任务处于就绪状态(Ready),这意味着任务已经准备好运行,但是当前没有在运行,因为它被调度器分配给其他任务执行。
  • S 是挂起态,表示任务进入了挂起的状态。
  • D 是删除态。

2,查看任务相关任务cpu利用率

void vTaskGetRunTimeStats( char * pcWriteBuffer );

3,查看任务状态和优先级:

void vTaskList( char * pcWriteBuffer );

4,举例说明

#include "FreeRTOS.h"
#include "task.h"
#include<stdio.h>


void vApplicationMallocFailedHook() {
	while(1);
}

void vApplicationStackOverflowHook(TaskHandle_t xTask, char * pcTaskName ) {
	while(1);
}

#include "semphr.h"

// 用于任务调用的宏定义
#define mainDELAY_LOOP_COUNT    ( 0xffffff )

// 定义任务句柄
TaskHandle_t xTask1Handle = NULL;
TaskHandle_t xTask2Handle = NULL;

// 定义任务函数
void vTask1(void *pvParameters);
void vTask2(void *pvParameters);

// 定义足够大的缓冲区用于存储统计信息
#define RUN_TIME_STATS_BUFFER_SIZE 2048
char runTimeStatsBuffer[RUN_TIME_STATS_BUFFER_SIZE];

int main(void)
{
    // 创建任务
    xTaskCreate(vTask1, "Task 1", 1000, NULL, 0, &xTask1Handle);
    xTaskCreate(vTask2, "Task 2", 1000, NULL, 0, &xTask2Handle);

    // 启动调度器
    vTaskStartScheduler();

    // 如果一切正常,以下代码不会被执行
    for (;;)
    {
    }

    return 0;
}

void vTask1(void *pvParameters)
{
    const TickType_t xDelay = pdMS_TO_TICKS(20);
	unsigned char pcWriteBuffer[500];

    for (;;)
    {
    	printf("================vTask1=================================\r\n");
		printf("任务名 	任务状态 	优先级 	剩余栈 	任务序号\r\n");
		vTaskList((char *)&pcWriteBuffer);
		printf("%s\r\n", pcWriteBuffer);
        // 任务代码...
        vTaskDelay(xDelay);
    }
}

void vTask2(void *pvParameters)
{
    const TickType_t xDelay = pdMS_TO_TICKS(20);
	unsigned char pcWriteBuffer[500];

    for (;;)
    {
    	printf("=================vTask2================================\r\n");
		printf("任务名 	任务状态 	优先级 	剩余栈 	任务序号\r\n");
		vTaskList((char *)&pcWriteBuffer);
		printf("%s\r\n", pcWriteBuffer);
		printf("\r\n 任务名 	运行计数 	使用率\r\n");
		vTaskGetRunTimeStats((char *)&pcWriteBuffer);
		printf("%s\r\n", pcWriteBuffer);
     
        // 任务代码...
        vTaskDelay(xDelay);
    }
}

================vTask1=================================
任务名     任务状态     优先级     剩余栈     任务序号
Task 1        X                   0            995            1
IDLE          R                   0            123            3
Task 2        B                   0            995            2
Tmr Svc     B                   1            251            4

=================vTask2================================
任务名     任务状态     优先级     剩余栈     任务序号
IDLE            R                0            123            3
Task 2         X                 0            995            2
Task 1         R                0             995            1
Tmr Svc      B                1             251            4


 任务名     运行计数     使用率
Task 2            37              1%
Task 1            15             <1%
IDLE              3328        100%
Tmr Svc          0              <1%

调整延时时间和优先级,可以复现cpu占用过高的问题,所以我们在加延时处理时要合理添加延时时间。

int main(void)
{
    // 创建任务
    xTaskCreate(vTask1, "Task 1", 1000, NULL, 1, &xTask1Handle);
    xTaskCreate(vTask2, "Task 2", 1000, NULL, 1, &xTask2Handle);

    // 启动调度器
    vTaskStartScheduler();

    // 如果一切正常,以下代码不会被执行
    for (;;)
    {
    }

    return 0;
}

void vTask1(void *pvParameters)
{
    const TickType_t xDelay = pdMS_TO_TICKS(5);
	unsigned char pcWriteBuffer[500];

    for (;;)
    {
    	printf("================vTask1=================================\r\n");
		printf("任务名 	任务状态 	优先级 	剩余栈 	任务序号\r\n");
		vTaskList((char *)&pcWriteBuffer);
		printf("%s\r\n", pcWriteBuffer);
		printf("\r\n 任务名     运行计数    	使用率\r\n");
		vTaskGetRunTimeStats((char *)&pcWriteBuffer);
		printf("%s\r\n", pcWriteBuffer);
        vTaskDelay(xDelay);
    }
}

void vTask2(void *pvParameters)
{
    const TickType_t xDelay = pdMS_TO_TICKS(5);
	unsigned char pcWriteBuffer[500];

    for (;;)
    {
    	printf("=================vTask2================================\r\n");
	
		printf("\r\n 任务名     运行计数    	使用率\r\n");
		vTaskGetRunTimeStats((char *)&pcWriteBuffer);
		printf("%s\r\n", pcWriteBuffer);
     
        // 任务代码...
        vTaskDelay(xDelay);
    }
}

=================vTask2================================

 任务名     运行计数        使用率
Task 2       196                98%
Task 1       8                    4%
IDLE          0                   <1%
Tmr Svc      0                  <1%


http://www.kler.cn/a/297471.html

相关文章:

  • 使用jenkins 打包前端私服代码失败的问题
  • A Comprehensive Survey on Graph Neural Networks笔记
  • 【Python 千题 —— 算法篇】字符串替换
  • 编译win2k3简易教程(202409)
  • 紫色UI趣味测试小程序源码,包含多种评测
  • vue3实现拖拽移动位置,拖拽过程中鼠标松开后元素还吸附在鼠标上并随着鼠标移动
  • 2409wtl,wtl与ddx
  • 服务器监控工具都是监控服务器的哪些性能和指标
  • 【文心智能体】通过工作流使用知识库来实现信息查询输出,一键查看旅游相关信息,让出行多一份信心
  • 【重学 MySQL】五、MySQL 的卸载
  • 数据结构:图
  • kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)
  • 【MySQL】—— MySQL命令行客户端介绍
  • 【Python知识宝库】Python中的日期和时间处理:datetime模块详解
  • FPGA随记——OSERDESE2和IERDESE2
  • 论文风向变了!迁移学习+多模态融合才是王道!性能爆炸好
  • TCP Analysis Flags 之 TCP Port numbers reused
  • 用 Python 创建一个简单的速算挑战游戏
  • Git-下载的zip包项目重新指向github项目地址
  • 黑神话 Java,Solon v2.9.2 发布