FreeRTOS 之二 Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)
2020/5/19
- 更新了在使用 4.3.8 時(shí)遇到的一些問(wèn)題說(shuō)明
2018/5/16
- 大約一個(gè)月之前,Tracealyzer for FreeRTOS目前更新到了4.x,新版本不在區(qū)分針對(duì)哪個(gè)系統(tǒng),而是統(tǒng)一使用 Percepio Tracealyzer 這個(gè)名稱 。而且整個(gè)軟件也是基本全部重新實(shí)現(xiàn)了,且與 3.x 版本 License 不兼容。
- 破解啥的不多說(shuō),和 3.x 基本一樣。只是在判斷邏輯上有所變化!
2017/12/30
- Tracealyzer for FreeRTOS目前更新到了3.3.1,其配置稍有改動(dòng)。
簡(jiǎn)介
??最近公司搞新項(xiàng)目,需要使用 FreeRTOS,之前學(xué)的 Linux 的長(zhǎng)時(shí)間不用基本忘的差不多了,對(duì)于 FreeRTOS 不是非常了解。在官網(wǎng)轉(zhuǎn)悠的時(shí)候發(fā)現(xiàn)了有個(gè)可視化分析工具:FreeRTOS+Trace,感覺(jué)應(yīng)該不錯(cuò)!下載后發(fā)現(xiàn)其是 http://percepio.com/ 這個(gè)網(wǎng)站上的東西。到官網(wǎng)看了看,功能確實(shí)非常強(qiáng)大!目前,官網(wǎng)最新版為4.3.8,支持最新的 FreeRTOS 10.3.1 。
??不過(guò)這個(gè)東西是收費(fèi)的,雖然也提供了免費(fèi)版本,但是免費(fèi)版功能確實(shí)太少了,只能查看各全局圖,沒(méi)有詳細(xì)信息!不過(guò),對(duì)于個(gè)人使用,可以申請(qǐng) 30 天的評(píng)估版 License,至于破解啥的,之前也在相關(guān)論壇發(fā)過(guò)破解教程,非常簡(jiǎn)單,就不多說(shuō)了!
Trace 源碼
??想要使用 Percepio Tracealyzer,必須將 Percepio Tracealyzer 的 Trace 源碼移植到自己的項(xiàng)目中才可以!安裝后在軟件的安裝目錄下會(huì)有針對(duì)不同系統(tǒng)的 Trace 源碼
下面我們就以 FreeRTOS 為例,來(lái)說(shuō)明一下各文件的具體用途。
注意:
??目前,Percepio Tracealyzer支持兩種追蹤模式:快照模式(Snapshot Mode)和流模式(Streaming Mode)
快照模式(Snapshot Mode)
??該模式下,將追蹤數(shù)據(jù)放到目標(biāo)機(jī)的 RAM 中,然后你可以在任何時(shí)間讀取出來(lái)分析顯示(就相當(dāng)于每次都取一次快照)。這種方法具有最小的硬件依賴性,因此可以用于基本上任何 32 位處理器,只需要有一定的方法(如調(diào)試連接或文件系統(tǒng))可以從目標(biāo)機(jī)獲取數(shù)據(jù)即可。
??快照錄制針對(duì)內(nèi)存效率進(jìn)行了優(yōu)化,并將事件保存為四字節(jié)記錄,通常每個(gè)事件只使用一個(gè)此類記錄,包括時(shí)間戳記。因此,我們的標(biāo)準(zhǔn)演示應(yīng)用程序僅在快照模式下生成大約 18 KB/s的跟蹤數(shù)據(jù),平均每個(gè)事件少于 7 個(gè)字節(jié)。 但是,快照模式中使用的優(yōu)化可防止流式傳輸跟蹤,因此流模式使用不同的實(shí)現(xiàn)和數(shù)據(jù)格式。
??在官方的手冊(cè)之中,有針對(duì)各種開發(fā)環(huán)境的的詳細(xì)配置使用說(shuō)明。由于快照模式需要額外內(nèi)存,并不適合我,這里就不多介紹了,具體去看手冊(cè)!
流模式(Streaming Mode)
??在使用流模式時(shí),數(shù)據(jù)將不斷傳輸?shù)?PC 上。 這樣,只要 PC 上有磁盤空間,就可以不停的緩存終端發(fā)回的跟蹤數(shù)據(jù),并被保存為 .psf 的文件。 由于RTOS 跟蹤產(chǎn)生的數(shù)據(jù)量是中等的(大約20-200 KB / s),理論上可以記錄幾天甚至幾周的大硬盤驅(qū)動(dòng)器。
??針對(duì)于緩存的跟蹤數(shù)據(jù)文件(.psf 文件),Percepio Tracealyzer 從版本 3.1 開始受限于 PC 中 RAM 的容量。 您可以打開任意大小的跟蹤文件,但是如果您的PC 耗盡了物理內(nèi)存,則導(dǎo)致頁(yè)面交換可能導(dǎo)致加載時(shí)間過(guò)長(zhǎng)以及 GUI 響應(yīng)速度較慢。 然而,Percepio Tracealyzer 可以在標(biāo)準(zhǔn) PC 上加載相當(dāng)大的跟蹤數(shù)據(jù)文件,通??梢蕴幚?5-10 百萬(wàn)個(gè)事件。 這至少需要幾分鐘的時(shí)間,通常是 10-30 分鐘。 此外,Percepio Tracealyze r會(huì)檢測(cè)跟蹤文件是否對(duì)可用 RAM 太大,然后發(fā)出警告,要求您確認(rèn)加載跟蹤。
??流模式的實(shí)施針對(duì)速度進(jìn)行了優(yōu)化,并且存儲(chǔ)事件的速度比針對(duì)低內(nèi)存使用情況高度優(yōu)化的快照模式快得多。
streamports
??streamports 是一組宏,這些宏定義了記錄器(即需要移植到自己項(xiàng)目中的 Trace 源碼)應(yīng)如何將跟蹤數(shù)據(jù)寫入流接口以及如何從 Percepio Tracealyzer 讀取命令(啟動(dòng)/停止)。 記錄器包括幾個(gè)預(yù)定義的 streamports,這些 streamports 可以在安裝目錄下的streamports 目錄中找到。
??我們還可以創(chuàng)建自己的 streamport,以利用系統(tǒng)中任何合適的通信接口。 官方有一篇博客來(lái)具體介紹了這一部分,地址:https://percepio.com/2016/10/05/rtos-tracing/ 。
??官方提供的各 streamports,在我們使用時(shí)需要進(jìn)行一定的配置,這部分手冊(cè)中有很詳細(xì)的說(shuō)明,如下圖:
這里就不過(guò)多介紹了!
流模式在 ARM-MDK 的使用
??Tracealyzer 默認(rèn)的模式是快照模式。這里,我以流模式使用 Jlink_RTT 方式為例來(lái)說(shuō)明。使用的開發(fā)板為自己畫的,芯片為 STM32F407VG 和 STM32L476VC。在移植之前,首先確保已將 FreeRTOS 移植完成,并能正常運(yùn)行。
??首先對(duì)Trace的源代碼進(jìn)行一下整理(個(gè)人不喜歡在源碼中放一堆實(shí)際用不到的文件),以下是我的目錄結(jié)構(gòu):
如果使用的是快照模式,streamports 下的代碼完全忽略即可。
接下來(lái),在MDK-ARM中建立項(xiàng)目
(1)將各文件添加到 MDK-ARM 中,并且設(shè)置好 MDK-ARM 頭文件路徑(保證 FreeRTOS 以正常運(yùn)行)
(2)打開trcConfig.h,修改如下,尤其是加注釋的地方,特別注意。其他參數(shù)保持默認(rèn)即可:
#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" // 這里根據(jù)需要添加自己的芯片的頭文件 //#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 // 選擇芯片對(duì)應(yīng)的類型,具體支持的類型見(jiàn)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 // 選擇追蹤模式(默認(rèn)快照模式,這里我改成了流模式)/******************************************************************************** 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 // 這里根據(jù)自己的FreeRTOS版本修改/* 這中間還有一大堆,這里省略,通常來(lái)說(shuō)不需要修改。。。 *//* 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)注意:由于默認(rèn)情況下,Keil 不支持 C99 特性,而 Trace 源碼使用了C99特性(C99 規(guī)定,變量聲明可以放到函數(shù)的任何位置,而早期 C 規(guī)定,變量定義必須在函數(shù)開頭)。在 Keil 中,將 C99 特性選中,如下圖:
如果沒(méi)有上面的設(shè)置,編譯時(shí),Keil報(bào)錯(cuò):error: #268: declaration may not appear after executable statement in block.
(4)修改 FreeRTOSConfig.h。FreeRTOS 是一個(gè)高度可配置的系統(tǒng)。通常來(lái)說(shuō),我們只需要修改該配置文件即可,而不用去關(guān)注FreeRTOS 的其他文件,修改后文件如下(注意圖中注釋部分):
/* 前面全部省略了... *//* Trace源碼頭文件,前面說(shuō)過(guò),最新的3.1.0版本,Trace源碼被統(tǒng)一,簡(jiǎn)化,使用者只需要包含trcRecorder.h 這一個(gè)文件即可!*/ /** @addtogroup Integrates the Tracealyzer recorder with FreeRTOS.* @{*/ /* 以下為使用Percepio Tracealyzer需要的東西,不需要時(shí)將 configUSE_TRACE_FACILITY 定義為 0 ,使用時(shí),將 configUSE_TRACE_FACILITY 定義為 1 即可 */ #if ( configUSE_TRACE_FACILITY == 1 ) #include "trcRecorder.h" #define INCLUDE_xTaskGetCurrentTaskHandle 1 // 啟用一個(gè)可選函數(shù)(該函數(shù)被 Trace源碼使用,默認(rèn)該值為0 表示不用)。最新的 4.3.8,FreeRTOS 10.3.1 不再需要,直接刪除即可 #endif /*** @}*/注意:
(5)在 main 函數(shù)中,啟用 trcRecorder 中統(tǒng)一的API即可!啟動(dòng)追蹤函數(shù)為 vTraceEnable(TRC_INIT)或者vTraceEnable(TRC_START_AWAIT_HOST)。必須在啟動(dòng) FreeRTOS 的調(diào)度器(vTaskStartScheduler();)之前。
(6)配置 PC 端的軟件。
注意:
??至此,編譯項(xiàng)目(我已經(jīng)添加了兩個(gè)任務(wù)),現(xiàn)在到開發(fā)板即可!打開Tracealyzer for FreeRTOS,如下,現(xiàn)在自己的芯片類型,然后,菜單->file->就可以開始追蹤了(以下為3.x的軟件)!
問(wèn)題
附件
STM32_FreeRTOS_Tracealyzer
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的FreeRTOS 之二 Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FreeRTOS 之一 源码目录文件 及
- 下一篇: PC-lint使用说明