FreeRTOS 之二 Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)
2020/5/19
- 更新了在使用 4.3.8 時遇到的一些問題說明
2018/5/16
- 大約一個月之前,Tracealyzer for FreeRTOS目前更新到了4.x,新版本不在區分針對哪個系統,而是統一使用 Percepio Tracealyzer 這個名稱 。而且整個軟件也是基本全部重新實現了,且與 3.x 版本 License 不兼容。
- 破解啥的不多說,和 3.x 基本一樣。只是在判斷邏輯上有所變化!
2017/12/30
- Tracealyzer for FreeRTOS目前更新到了3.3.1,其配置稍有改動。
簡介
??最近公司搞新項目,需要使用 FreeRTOS,之前學的 Linux 的長時間不用基本忘的差不多了,對于 FreeRTOS 不是非常了解。在官網轉悠的時候發現了有個可視化分析工具:FreeRTOS+Trace,感覺應該不錯!下載后發現其是 http://percepio.com/ 這個網站上的東西。到官網看了看,功能確實非常強大!目前,官網最新版為4.3.8,支持最新的 FreeRTOS 10.3.1 。
 
 ??不過這個東西是收費的,雖然也提供了免費版本,但是免費版功能確實太少了,只能查看各全局圖,沒有詳細信息!不過,對于個人使用,可以申請 30 天的評估版 License,至于破解啥的,之前也在相關論壇發過破解教程,非常簡單,就不多說了!
Trace 源碼
??想要使用 Percepio Tracealyzer,必須將 Percepio Tracealyzer 的 Trace 源碼移植到自己的項目中才可以!安裝后在軟件的安裝目錄下會有針對不同系統的 Trace 源碼
 
 下面我們就以 FreeRTOS 為例,來說明一下各文件的具體用途。
注意:
??目前,Percepio Tracealyzer支持兩種追蹤模式:快照模式(Snapshot Mode)和流模式(Streaming Mode)
快照模式(Snapshot Mode)
??該模式下,將追蹤數據放到目標機的 RAM 中,然后你可以在任何時間讀取出來分析顯示(就相當于每次都取一次快照)。這種方法具有最小的硬件依賴性,因此可以用于基本上任何 32 位處理器,只需要有一定的方法(如調試連接或文件系統)可以從目標機獲取數據即可。
 
 ??快照錄制針對內存效率進行了優化,并將事件保存為四字節記錄,通常每個事件只使用一個此類記錄,包括時間戳記。因此,我們的標準演示應用程序僅在快照模式下生成大約 18 KB/s的跟蹤數據,平均每個事件少于 7 個字節。 但是,快照模式中使用的優化可防止流式傳輸跟蹤,因此流模式使用不同的實現和數據格式。
 ??在官方的手冊之中,有針對各種開發環境的的詳細配置使用說明。由于快照模式需要額外內存,并不適合我,這里就不多介紹了,具體去看手冊!
流模式(Streaming Mode)
??在使用流模式時,數據將不斷傳輸到 PC 上。 這樣,只要 PC 上有磁盤空間,就可以不停的緩存終端發回的跟蹤數據,并被保存為 .psf 的文件。 由于RTOS 跟蹤產生的數據量是中等的(大約20-200 KB / s),理論上可以記錄幾天甚至幾周的大硬盤驅動器。
 ??針對于緩存的跟蹤數據文件(.psf 文件),Percepio Tracealyzer 從版本 3.1 開始受限于 PC 中 RAM 的容量。 您可以打開任意大小的跟蹤文件,但是如果您的PC 耗盡了物理內存,則導致頁面交換可能導致加載時間過長以及 GUI 響應速度較慢。 然而,Percepio Tracealyzer 可以在標準 PC 上加載相當大的跟蹤數據文件,通常可以處理 5-10 百萬個事件。 這至少需要幾分鐘的時間,通常是 10-30 分鐘。 此外,Percepio Tracealyze r會檢測跟蹤文件是否對可用 RAM 太大,然后發出警告,要求您確認加載跟蹤。
 ??流模式的實施針對速度進行了優化,并且存儲事件的速度比針對低內存使用情況高度優化的快照模式快得多。
streamports
??streamports 是一組宏,這些宏定義了記錄器(即需要移植到自己項目中的 Trace 源碼)應如何將跟蹤數據寫入流接口以及如何從 Percepio Tracealyzer 讀取命令(啟動/停止)。 記錄器包括幾個預定義的 streamports,這些 streamports 可以在安裝目錄下的streamports 目錄中找到。
 ??我們還可以創建自己的 streamport,以利用系統中任何合適的通信接口。 官方有一篇博客來具體介紹了這一部分,地址:https://percepio.com/2016/10/05/rtos-tracing/ 。
 ??官方提供的各 streamports,在我們使用時需要進行一定的配置,這部分手冊中有很詳細的說明,如下圖:
 
 這里就不過多介紹了!
流模式在 ARM-MDK 的使用
??Tracealyzer 默認的模式是快照模式。這里,我以流模式使用 Jlink_RTT 方式為例來說明。使用的開發板為自己畫的,芯片為 STM32F407VG 和 STM32L476VC。在移植之前,首先確保已將 FreeRTOS 移植完成,并能正常運行。
 ??首先對Trace的源代碼進行一下整理(個人不喜歡在源碼中放一堆實際用不到的文件),以下是我的目錄結構:
如果使用的是快照模式,streamports 下的代碼完全忽略即可。
接下來,在MDK-ARM中建立項目
 
 (1)將各文件添加到 MDK-ARM 中,并且設置好 MDK-ARM 頭文件路徑(保證 FreeRTOS 以正常運行)
(2)打開trcConfig.h,修改如下,尤其是加注釋的地方,特別注意。其他參數保持默認即可:
#ifndef TRC_CONFIG_H #define TRC_CONFIG_H#ifdef __cplusplus extern "C" { #endif#include "trcPortDefines.h"/******************************************************************************* Include of processor header file* * Here you may need to include the header file for your processor. This is * required at least for the ARM Cortex-M port, that uses the ARM CMSIS API.* Try that in case of build problems. Otherwise, remove the #error line below.*****************************************************************************/ #include "stm32F4xx.h" // 這里根據需要添加自己的芯片的頭文件 //#error "Trace Recorder: Please include your processor′s header file here and remove this line."/******************************************************************************** Configuration Macro: TRC_CFG_HARDWARE_PORT** Specify what hardware port to use (i.e., the "timestamping driver").* All ARM Cortex-M MCUs are supported by "TRC_HARDWARE_PORT_ARM_Cortex_M".** See trcSnapshotHardwarePort.h or trcStreamingHardwarePort.h for available* ports and information on how to define your own port, if not already present.******************************************************************************/ #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_ARM_Cortex_M // 選擇芯片對應的類型,具體支持的類型見trcStreamingPort.h/******************************************************************************** Configuration Macro: TRC_CFG_RECORDER_MODE** Specify what recording mode to use. Snapshot means that the data is saved in* an internal RAM buffer, for later upload. Streaming means that the data is* transferred continuously to the host PC. ** For more information, see http://percepio.com/2016/10/05/rtos-tracing/* and the Tracealyzer User Manual.** Values:* TRC_RECORDER_MODE_SNAPSHOT* TRC_RECORDER_MODE_STREAMING******************************************************************************/ #define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_STREAMING // 選擇追蹤模式(默認快照模式,這里我改成了流模式)/******************************************************************************** Configuration Macro: TRC_CFG_RECORDER_BUFFER_ALLOCATION** Specifies how the recorder's internal buffer is allocated (snapshot or* streaming). Note that CUSTOM is only supported in snapshot mode.** TRC_RECORDER_BUFFER_ALLOCATION_STATIC - Static allocation * TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC - Allocated in vTraceEnable* TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM - Use vTraceSetRecorderDataBuffer******************************************************************************/ #define TRC_CFG_RECORDER_BUFFER_ALLOCATION TRC_RECORDER_BUFFER_ALLOCATION_STATIC/******************************************************************************* TRC_CFG_FREERTOS_VERSION** Specify what version of FreeRTOS that is used (don't change unless using the* trace recorder library with an older version of FreeRTOS).** TRC_FREERTOS_VERSION_7_3 If using FreeRTOS v7.3.x* TRC_FREERTOS_VERSION_7_4 If using FreeRTOS v7.4.x * TRC_FREERTOS_VERSION_7_5_OR_7_6 If using FreeRTOS v7.5.0 - v7.6.0* TRC_FREERTOS_VERSION_8_X If using FreeRTOS v8.X.X* TRC_FREERTOS_VERSION_9_0_0 If using FreeRTOS v9.0.0* TRC_FREERTOS_VERSION_9_0_1 If using FreeRTOS v9.0.1* TRC_FREERTOS_VERSION_9_0_2 If using FreeRTOS v9.0.2* TRC_FREERTOS_VERSION_10_0_0 If using FreeRTOS v10.0.0 or later*****************************************************************************/ #define TRC_CFG_FREERTOS_VERSION TRC_FREERTOS_VERSION_10_0_0 // 這里根據自己的FreeRTOS版本修改/* 這中間還有一大堆,這里省略,通常來說不需要修改。。。 *//* Specific configuration, depending on Streaming/Snapshot mode */ #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) #include "trcSnapshotConfig.h" #elif (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) #include "trcStreamingConfig.h" #endif#ifdef __cplusplus } #endif#endif /* _TRC_CONFIG_H */(3)注意:由于默認情況下,Keil 不支持 C99 特性,而 Trace 源碼使用了C99特性(C99 規定,變量聲明可以放到函數的任何位置,而早期 C 規定,變量定義必須在函數開頭)。在 Keil 中,將 C99 特性選中,如下圖:
 
如果沒有上面的設置,編譯時,Keil報錯:error: #268: declaration may not appear after executable statement in block.
(4)修改 FreeRTOSConfig.h。FreeRTOS 是一個高度可配置的系統。通常來說,我們只需要修改該配置文件即可,而不用去關注FreeRTOS 的其他文件,修改后文件如下(注意圖中注釋部分):
/* 前面全部省略了... *//* Trace源碼頭文件,前面說過,最新的3.1.0版本,Trace源碼被統一,簡化,使用者只需要包含trcRecorder.h 這一個文件即可!*/ /** @addtogroup Integrates the Tracealyzer recorder with FreeRTOS.* @{*/ /* 以下為使用Percepio Tracealyzer需要的東西,不需要時將 configUSE_TRACE_FACILITY 定義為 0 ,使用時,將 configUSE_TRACE_FACILITY 定義為 1 即可 */ #if ( configUSE_TRACE_FACILITY == 1 ) #include "trcRecorder.h" #define INCLUDE_xTaskGetCurrentTaskHandle 1 // 啟用一個可選函數(該函數被 Trace源碼使用,默認該值為0 表示不用)。最新的 4.3.8,FreeRTOS 10.3.1 不再需要,直接刪除即可 #endif /*** @}*/注意:
(5)在 main 函數中,啟用 trcRecorder 中統一的API即可!啟動追蹤函數為 vTraceEnable(TRC_INIT)或者vTraceEnable(TRC_START_AWAIT_HOST)。必須在啟動 FreeRTOS 的調度器(vTaskStartScheduler();)之前。
(6)配置 PC 端的軟件。
 
注意:
??至此,編譯項目(我已經添加了兩個任務),現在到開發板即可!打開Tracealyzer for FreeRTOS,如下,現在自己的芯片類型,然后,菜單->file->就可以開始追蹤了(以下為3.x的軟件)!
問題
附件
STM32_FreeRTOS_Tracealyzer
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的FreeRTOS 之二 Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: FreeRTOS 之一 源码目录文件 及
- 下一篇: Visual Studio Code (
