一、 概述
目前車載應用中有不少應用會用到 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
2023年11月6日