一、 概述
目前车载应用中有不少应用会用到 RTOS,其中 FreeRTOS 作为主流的 RTOS,具有开源、体积小、可移植等特点,在 RTOS 开发中,通过统计 CPU 占有率可以知道当前系统资源是否紧张,另外还可以了解每个任务的占有率,对于了解怎个系统的运行状态有很大的参考意义,SemiDrive E3 系列 MCU 作为国产的车规级 MCU 芯片,满足 ASIL-D 安全等级、主频高达 600 MHz,性能强大,已经开始在车载市场上大量使用,本文将基于SemiDrive E3 平台介绍如何在 FreeRTOS 系统统计 CPU 占有率,具体内容包括前期的软硬件准备以及具体的操作步骤。
二、 软硬件准备
2.1. 硬件准备
(1)SemiDrive E3110 官方开发板
图 2.1 E3110 官方开发板
(2)Micro USB 数据线
图 2.2 Micro USB 数据线
(3)5V 电源适配器
图 2.3 5V 电源适配器
(4)Jlink 调试器,推荐使用 V11 版本
图 2.4 Jlink 烧录器
2.2 软件准备
(1)SSDK PTG3.0,可以从芯驰的线上支持系统申请获取,官网地址如下:https://support.semidrive.com/
图 2.5 SSDK PTG3.0 官网下载
(2)串口调试工具,例如 Putty
图 2.6 Putty 软件界面
三、 操作步骤
在介绍操作步骤之前先简单介绍下 CPU 占有率的概念,我们知道 CPU 在同一个时刻只能执行一个任务,而操作系统通过任务调度实现不同任务间的切换,时间片是任务执行时间的最小单位,用户可以根据实际场景配置时间片的大小,操作系统在运行中会统计每个任务运行所占用时间片的数量,该任务占有的时间片数量除以总的时间片数量即是该任务的 CPU 占有率,用户定义的所有任务的占有率相加就是 CPU 占有率,因为操作系统自身会建立一个空闲任务,因此我们可以通过统计空闲任务的 CPU 占有率来算出 CPU 的占有率。例如,用户建立了两个任务,系统开始运行到当前时刻总共 20s,任务 1 总共占用了 10 s,任务 2 总共占用了 5 s,空闲任务占用了 5s,因此当前 CPU 占有率为 100% - (5/20) x 100% = 75%。
下面以 E3110 开发板为例介绍如何获取 CPU 占有率,代码将基于 SDK 中的 FreeRTOS 例程进行修改,通过串口打印出 CPU 占有率。工程的路径如下:E3_SSDK_PTG3.0_Source_Code\ssdk\boards\e3_176_ref\app_demo\FreeRTOS
(1)通过一个高精度的硬件定时器以及一个外部变量进行时间的统计,通常将定时器的频率设置为 FreeRTOS 系统节拍频率的 10 倍以上,例如系统节拍是 1000 HZ,则定时器频率可以设置为 10000 HZ。首先在工程中添加 eTimer 定时器的驱动文件,驱动文件的路径位于:E3_SSDK_PTG3.0_Source_Code\ssdk\drivers\source\etimer
图 3.1 添加定时器的驱动文件
接着在 main.c 添加 etimer 的相关代码,具体如下图所示:
图 3.2 eTimer 相关代码
其中需要定义两个变量 cpu_run_time_cnt 和 cpu,cpu_run_time_cnt 用于统计系统时间,而 cpu 则用于统计 CPU 占有率。
(2)修改 FreeRTOSConfig.h 文件,要统计 CPU 任务的信息,我们需要使用 FreeRTOS 提供的接口 vTaskList 和 vTaskGetRunTimeStats,前者会获取所有任务的运行信息,包括任务名称、任务状态、任务优先级、任务堆栈等信息,而后者会获取所有任务的 CPU 占有率。要使用这两个接口,需要将相关宏打开,具体如下:
图 3.3 修改 FreeRTOSConfig.h
(3)修改 vTaskGetRunTimeStats 函数,添加获取 CPU 占有率的相关代码,如下图所示。
图 3.4 修改 vTaskGetRunTimeStats 函数
(4)在 main.c 中添加一个任务用于获取任务信息并通过串口打印
图 3.5 添加任务打印任务信息
(5)编译工程,接上 USB 串口,在线调试运行代码,可以看到每隔 1s 打印一次任务的信息,可以看到总共有 5 个任务,其中有 3 个任务是用户创建的,有两个是系统创建的任务,分别为空闲任务和定时器任务,可以看到 CPU 占有率为 5%,而 IDLE 任务的占有率为 95%。
至此,我们便实现了在 SemiDrive E3 平台上获取 CPU 占有率的功能。
图 3.6 串口打印信息
评论
Corgi
6 个月前