日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

FreeRTOS 之二 Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)

發(fā)布時(shí)間:2024/10/14 编程问答 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FreeRTOS 之二 Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ō)明一下各文件的具體用途。

│ readme.txt │ trcKernelPort.c │ trcSnapshotRecorder.c │ trcStreamingRecorder.c ├─config │ trcConfig.h // 整個(gè)Trace源碼的配置文件. │ trcSnapshotConfig.h // 快照模式配置文件,和流模式對(duì)應(yīng)文件選其一 │ trcStreamingConfig.h // 流模式配置文件,和快照模式對(duì)應(yīng)文件選其一 ├─include │ trcHardwarePort.h // 所有硬件依賴關(guān)系。包含幾個(gè)預(yù)定義的硬件端口,包括ARM Cortex-M,PIC32,Renesas RX等。 │ trcKernelPort.h // FreeRTOS特定的定義,最值得注意的是跟蹤鉤子定義。 │ trcPortDefines.h // 配置文件的各種常量定義 │ trcRecorder.h // 公共API,開發(fā)者將以上兩種模式進(jìn)行了統(tǒng)一,用戶使用時(shí),只需要包含該文件即可! └─streamports // 該文件夾下就是流模式對(duì)應(yīng)的不同接口方式的實(shí)現(xiàn),以下任選其一即可。最新的 4.x 中又多了幾種,這里沒(méi)有添加├─Jlink_RTT│ │ Readme.txt│ │ SEGGER_RTT.c│ │ SEGGER_RTT_Printf.c│ └─include│ SEGGER_RTT.h│ SEGGER_RTT_Conf.h│ trcStreamingPort.h├─TCPIP│ │ Readme.txt│ │ trcStreamingPort.c│ └─include│ trcStreamingPort.h└─USB_CDC│ Readme.txt│ trcStreamingPort.c└─includetrcStreamingPort.h

注意:

  • 官網(wǎng)最新的版本是 4.3.8,從 3.1.0 開始,Trace 源代碼有了很大的改變,源碼進(jìn)行了整合,簡(jiǎn)潔了很多!
  • FreeRTOS 的源碼目錄下有個(gè) FreeRTOS-Plus 目錄,其中也有 Trace 源碼,但是該源碼也比較舊,不建議使用!
  • 網(wǎng)上現(xiàn)有資料也是針對(duì)舊源碼的,和官方的 User Manual 不匹配。
  • ??目前,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ò)多介紹了!

  • 僅適用于 FreeRTOS v7.3 及之后的版本
  • 目前默認(rèn)提供了 Jlink_RTT、 USB CDC、TCP/IP 等種方式的示例程序
  • 上圖為針對(duì) FreeRTOS 系統(tǒng)的,如果使用其他系統(tǒng),上面的 streamports 可能不同
  • 流模式在 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):

    Trace │ trcKernelPort.c │ trcStreamingRecorder.c ├─include │ trcConfig.h │ trcHardwarePort.h │ trcKernelPort.h │ trcPortDefines.h │ trcRecorder.h │ trcStreamingConfig.h └─streamports│ SEGGER_RTT.c│ trcStreamingPort.c└─includeSEGGER_RTT.hSEGGER_RTT_Conf.htrcStreamingPort.h

    如果使用的是快照模式,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 /*** @}*/

    注意:

  • 由于 trcRecorder 的源碼是使用的是舊版本的 FreeRTOS,在最新的 FreeRTOS 中,好多類型都改變了,例如xQueueHandle -> QueueHandle_t。因此,configENABLE_BACKWARD_COMPATIBILITY 必須留空或者定義為 1 以兼容舊的FreeRTOS源碼。
  • 在新版本中,好像有變化,具體看源碼
  • (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 端的軟件。

    注意:

  • 對(duì)于兩種模式,trcRecorder中的公共 API 的傳參是有區(qū)別的!例如:上面的 vTraceEnable 函數(shù),在流模式下只能用:TRC_INIT 或者TRC_START_AWAIT_HOST
  • 流模式下,使用TRC_START_AWAIT_HOST時(shí),只有收到了主機(jī)傳來(lái)的命令時(shí)才開始工作,否則不會(huì)有任何額外的開銷。
  • ??至此,編譯項(xiàng)目(我已經(jīng)添加了兩個(gè)任務(wù)),現(xiàn)在到開發(fā)板即可!打開Tracealyzer for FreeRTOS,如下,現(xiàn)在自己的芯片類型,然后,菜單->file->就可以開始追蹤了(以下為3.x的軟件)!

    問(wèn)題

  • 如果 Jink 設(shè)置的速度過(guò)慢將導(dǎo)致出現(xiàn)大量丟包。官方博客 https://percepio.com/2018/02/19/problems-j-link-rtt-streaming/ 有介紹如何處理
  • 舊的 Trace 源碼可能不支持最新版的 FreeRTOS
  • 附件

    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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。