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

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