SemiDrive E3 如何统计 CPU 占有率

一、  概述

目前车载应用中有不少应用会用到 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 串口打印信息

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

Corgi

Corgi

6 个月前
照着配了一遍,很奇怪的报错,看起来没有新增很多变量,有人遇到吗? Error[Lp015]: section placement failure: overcommitted content in [0x40'4000-0x5f'ffff]