首页 > 其他分享 >RTOS实时操作系统(任务运行性能分析)

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

时间:2024-09-09 20:54:00浏览次数:11  
标签:pcWriteBuffer void RTOS char 任务 实时操作系统 printf Task 性能

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%

标签:pcWriteBuffer,void,RTOS,char,任务,实时操作系统,printf,Task,性能
From: https://blog.csdn.net/qq_40008325/article/details/142028033

相关文章

  • 102MB缓存的锐龙5 7600X3D性能惊人!Zen5全都败了
    9月8日消息,AMD日前发布了锐龙57600X3D,是第一款AM5平台的六核心X3D产品,依然基于Zen4架构,配备多达102MB三级缓存,包括6MB二级缓存、32MB三级缓存、64MB3D缓存,热设计功耗仅为65W。不过,它没有公开零售,而是仅限欧美部分零售商,包括美国的MicroCenter、德国的MindFactory,后续是否会开放......
  • Vue2 和 Vue3 的区别(设计理念、性能提升、编码方式以及特性)
    Vue2和Vue3是Vue.js框架的两个主要版本,虽然它们具有许多相似之处,但也有一些重要的区别。下面是Vue2和Vue3之间的一些区别:设计理念:Vue2采用的是基于对象的设计理念,通过使用OptionsAPI来组织组件的相关选项(data、methods、computed、watch等)。Vue3采用的是基于函数的设计理念......
  • 京东鸿蒙上线前瞻——使用 Taro 打造高性能原生应用
    背景2024年1月,京东正式启动鸿蒙原生应用开发,基于HarmonyOSNEXT的全场景、原生智能、原生安全等优势特性,为消费者打造更流畅、更智能、更安全的购物体验。同年6月,京东鸿蒙原生应用尝鲜版上架华为应用市场,计划9月完成正式版的上架。早在2020年,京东与华为就签署......
  • 东芝 TB5128FTG 强大性能的步进电机驱动器
    概述TB5128FTG它以高精度和高效能为设计理念,采用PWM斩波方法,并内置时钟解码器。通过先进的BiCD工艺制造,这款驱动器提供高达50V和5.0A的输出额定值,成为广泛应用场景中的强劲解决方案。主要特性TB5128FTG拥有众多确保高性能、可靠性和灵活性的特性:BiCD工艺集成:在......
  • 案例分析:如何用设计模式优化性能14
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能15
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能8
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能10
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 在大规模环境下,如何优化Prometheus性能
    在大规模环境下,优化Prometheus性能是确保监控系统高效、稳定运行的关键。以下是一些优化建议:1.数据采集优化1.1限制数据采集频率降低采集频率:对于不需要实时数据的服务,可以适当降低采集频率。例如,可以将某些指标的采集频率从15秒调整到30秒或更长。1.2使用metric_......
  • 性能评估工具Profiler的使用与相关介绍
    性能评估工具Profiler经历三天的性能评估工具探索,终于找到了正确使用Profiler的正确使用方法。环境搭建#python环境搭建(python=3.10)condacreate--prefix=/path/to/you/env/namepython=3.10#torch环境搭建(CUDA12.1,linux,pip)pip3installtorchtorchvisiontorchaudio#......