前言
RTOS的分析是比較困難的,特別是任務多且涉及很多任務通信的時候,程序的穩定性就是一個比較麻煩的問題了,不過好在有很多工具可以用來分析RTOS的運行狀況,常見的有SystemView、Tracealyzer,TIRTOS的分析工具ROV(運行時對象查看器)則集成在CCS中。下面以Segger的SystemView為例,如何在FreeRTOS上移植和使用SystemView。
准備工作
- 准備一個jlink
- SystemView的PC端下載(官網下載比較慢,這里用硬漢嵌入式論壇的鏡像) http://www.armbbs.cn/forum.php?mod=viewthread&tid=97090&highlight=Systemview
- 下載官方的Example Projects,https://wiki.segger.com/FreeRTOS_with_SystemView ,也可以參考文檔從零開始移植,給FreeRTOS打補丁,在添加一些鈎子函數。這步驟比較繁瑣還是用官方的例程比較簡單粗暴,直接下載對應的example project。
- 從零開始移植的話需要一些與RTT相關的庫文件 https://www.segger.com/downloads/systemview 如果直接使用上面的 example project 里面的庫文件就不需要下載這個
移植過程
這里暫不描述從零開始打補丁的過程,而是直接使用官方提供的打好補丁的FreeRTOS源碼和RTT源碼。
- 只要把example project這兩個文件夾移植到自己的板子工程上就完成一半了。把..\FreeRTOS_STM32F4_TRB_SystemView\lib\FreeRTOS\FreeRTOS-Kernel\Source\portable中不必要的文件刪除,只保留對應平台的port.c和portmacro.h,以及MemMang這個文件夾中選擇的堆管理文件,這里使用heap4.c。注意不要忘了要把 FreeRTOSConfig.h 也移植到工程中
- 這些步驟完成后添加相應的文件和文件路徑到工程中
到這一步工作已經完成80%了 - 添加相應的鈎子函數,直接復制Example Project中main.c中實現的函數
vApplicationMallocFailedHook
vApplicationStackOverflowHook
vApplicationIdleHook
vMainConfigureTimerForRunTimeStats
ulMainGetRunTimeCounterValue
vApplicationTickHook
vApplicationGetIdleTaskMemory
vApplicationGetTimerTaskMemory
把這幾個函數也復制到main.c中就基本完成了 - 在進入任務調度之前需要對RTT進行初始化,調用SEGGER_SYSVIEW_Conf()。
- 編寫一個簡單的任務測試
void Led1Task()
{
while(1)
{
BspLedToggle(LED1);
vTaskDelay(100);
}
}
- 編譯后通過jink連接下載程序到板子上面,打開安裝好的SystemView,點擊Start Record 開始記錄任務的運行情況。
總結
systemview使用后面再說
參考文檔
https://wiki.segger.com/FreeRTOS_with_SystemView
https://blog.csdn.net/qq_29486527/article/details/88010893
https://dalegi.com/2020/01/15/setup-guide-for-segger-j-link-and-systemview-with-stm32-nucleo-boards/