在單片機的軟件開發中,經常會遇到各種各樣的問題,很多時候為了定位到出現bug的地方,我們可能會借助很多的手段或者工具。比如串口打印、MDK在線仿真、上位機調試工具等等的。但是,有時候想要用串口打印輸出某些結果,而硬件設計又沒有預留串口,這種時候就感覺很不方便。我個人使用串口調試的頻率還是蠻多的,主要是簡單易操作,可以在想要觀察運行結果的代碼位置隨便加調試輸出,很方便定位問題。在硬件上沒有多余的串口預留的話,如果有外接仿真引腳出來的話,在MDK環境下就可以使用ST-LINK、J-LINK等的各種LINK進行調試,實現printf輸出的功能,簡直是不要太棒了!在MDK的開發IDE環境下,支持仿真調試的組件有好幾個,我這里使用的是Event Recorder。這個組件功能是在MDK5.22的版本是哪個開始增加的,所以想要使用這個組件功能,需要將自己的MDK開發工具升級到5.22以上,建議是當前最新的版本!
1、添加 Event Recorder 組件
1)打開你需要添加調試組件的項目工程,點擊如下圖所示的圖標:
![pYYBAGPl3oOAdGhCAABKe-ugfoU937.png](https://file.elecfans.com/web2/M00/90/49/pYYBAGPl3oOAdGhCAABKe-ugfoU937.png)
2)選擇 “Compiler”,并按照如下勾選,勾選之后點擊“ok”即可。如下圖:
![pYYBAGPl3pCAe2rzAACStiKdwfI693.png](https://file.elecfans.com/web2/M00/90/49/pYYBAGPl3pCAe2rzAACStiKdwfI693.png)
勾選之后可以看到工程目錄上出現一個“Compiler”的選項,說明組件添加成功了,如下圖:
![pYYBAGPl3ueAXCjkAAB1gI1u5LI697.png](https://file.elecfans.com/web2/M00/90/49/pYYBAGPl3ueAXCjkAAB1gI1u5LI697.png)
3)檢查組件的工程配置,如下:
![pYYBAGPl3vKAW0OSAAFPC0GOVD4584.png](https://file.elecfans.com/web2/M00/90/49/pYYBAGPl3vKAW0OSAAFPC0GOVD4584.png)
說明如下:
Number of Records:表示 Event Recorder 緩沖可以記錄的消息條數。Time Stamp Source:表示時間戳的來源其中,Time Stamp Source 有如下四種可以選擇,一般使用 DWT 時鐘周期計數器。如下圖:
![poYBAGPl3v2AGp3GAAAS3zyYi8I176.png](https://file.elecfans.com/web2/M00/8F/C6/poYBAGPl3v2AGp3GAAAS3zyYi8I176.png)
至此,Event Record組件就已經添加完成了。
2、printf 重定向
在Event Recorder 實現printf輸出需要使用MDK的 Debug 功能,輸出的效果就跟串口調試工具上的顯示效果是一樣的。Event Recorder 中的重定向代碼如下:
int fputc (int c, FILE * stream) {
#if (!defined(RTE_Compiler_IO_STDOUT) && !defined(RTE_Compiler_IO_STDERR))
(void)c;
(void)stream;
#endif
#ifdef RTE_Compiler_IO_STDOUT
if (stream == &__stdout) {
#if (STDOUT_CR_LF != 0)
if (c == 'n') stdout_putchar('r');
#endif
return (stdout_putchar(c));
}
#endif
#ifdef RTE_Compiler_IO_STDERR
if (stream == &__stderr) {
#if (STDERR_CR_LF != 0)
if (c == 'n') stderr_putchar('r');
#endif
return (stderr_putchar(c));
}
#endif
return (-1);
}
注意:使用 Event Recorder 實現printf重定向時,一定要取消掉自己的項目中原本的重定向!
1)進入仿真調試模式,如下:
![pYYBAGPl3wuALctGAAAxhoV4-D0964.png](https://file.elecfans.com/web2/M00/90/49/pYYBAGPl3wuALctGAAAxhoV4-D0964.png)
2)選中 Debug(printf)Viewer 調試組件,如下圖:
![poYBAGPl3xeAa7f9AAMXkalcjzg602.png](https://file.elecfans.com/web2/M00/8F/C6/poYBAGPl3xeAa7f9AAMXkalcjzg602.png)
3)選擇仿真時周期更新,如下圖:
![pYYBAGPl3ySAKl9XAAMsqzVAvhA382.png](https://file.elecfans.com/web2/M00/90/4A/pYYBAGPl3ySAKl9XAAMsqzVAvhA382.png)
4)添加初始化代碼,如下:
/* 初始化 EventRecorder 并開啟 */
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
5)全速運行即可以看到結果。
![poYBAGPl3zCAcgiIAABoQ7jU4M0498.png](https://file.elecfans.com/web2/M00/8F/C6/poYBAGPl3zCAcgiIAABoQ7jU4M0498.png)
示例:
測試代碼如下:
![poYBAGPl3zqAQ9sXAAE-ZmJKzRU919.png](https://file.elecfans.com/web2/M00/8F/C6/poYBAGPl3zqAQ9sXAAE-ZmJKzRU919.png)
仿真結果如下:
![poYBAGPl30aAKOp7AADfB0rjQW4368.png](https://file.elecfans.com/web2/M00/8F/C6/poYBAGPl30aAKOp7AADfB0rjQW4368.png)
鼠標右鍵還可以對 Debug(printf)Viewer 進行設置,如下圖:
![pYYBAGPl31SAbpRNAAFpwzo6K-U868.png](https://file.elecfans.com/web2/M00/90/4A/pYYBAGPl31SAbpRNAAFpwzo6K-U868.png)
3、簡單方便的時間測量功能
Event Recorder 也可以測量代碼運行的時間,時間測量功能簡單易用,僅需一個起始函數,一個停止函數即可。
3.1、時間測量起始函數
EventStartG (slot)
或者
EventStopGv (slot, val1, val2)
函數說明:
1)函數中的字母 G 是表示分組 A,B,C,D,即實際調用函數為 EventStartA,EventStartB,EventStartC 和 EventStartD。2)函數的第一個形參 slot 的范圍是 0-15,也就是最大可以測量 16 路。3)函數后面的兩個形象 val1 和 val2 是 32 Bit變量,用戶可以用這兩個形參來傳遞變量數值給 Event Statistics 調試組件里面,用于圖形化展示。
3.2、時間測量結束函數
EventStopG (slot)
或者
EventStopGv (slot, val1, val2)
函數說明:
1)函數中的字母G是表示分組A,B,C,D,即實際調用函數為EventStopA,EventStopB,EventStopC 和 EventStopD。2)函數的第一個形參 slot 的范圍是 0-15,也就是最大可以測量 16 路。3)函數后面的兩個形象 val1 和 val2 是 32 位變量,用戶可以用這兩個形參來傳遞變量數值給 Event Statistics 調試組件里面,用于圖形化展示。
3.3、使用示例
1)添加初始化代碼
/* 初始化 EventRecorder 并開啟 */
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
2)在代碼前后加上起始和結束時間的測量API函數,如下所示:
![poYBAGPl32WAU9bLAAFVbwk3L8g506.png](https://file.elecfans.com/web2/M00/8F/C6/poYBAGPl32WAU9bLAAFVbwk3L8g506.png)
3)選擇 Event Statistics 調試組件,如下:
![pYYBAGPl33OAUz0FAAYRAqFym9E226.png](https://file.elecfans.com/web2/M00/90/4A/pYYBAGPl33OAUz0FAAYRAqFym9E226.png)
4)全速運行,查看結果,如下:
![pYYBAGPl33-AJECJAAFhG1Z328I392.png](https://file.elecfans.com/web2/M00/90/4A/pYYBAGPl33-AJECJAAFhG1Z328I392.png)
從圖中可以看出,開始測量的位置是在 149 行處,結束測量的位置是在152 行處,下方的紅色方框處標出了測量的最大時間和最小時間。
-
單片機
+關注
關注
6043文章
44621瀏覽量
638626 -
軟件開發
+關注
關注
0文章
624瀏覽量
27453 -
上位機
+關注
關注
27文章
945瀏覽量
55010
發布評論請先 登錄
相關推薦
【原創專題教程第7期】終極調試組件Event Recorder,各種Link通吃,支持時間和功耗測量,printf打印,RTX5及中間件調試
靈動微課堂 (第164講) | MM32F013x——Event Recorder使用方法
STM32F407的終極調試組件Event Recorder
移植Event Recorder調試工具
Event Recorder是什么?Event Recorder的特色有哪些
怎樣使用keil的Event Recorder中間件進行打印呢
Event Recorder的特色主要有幾點
淺析基于GD32F427適配RTX4+調試組件Event Recorder
【STM32F429開發板用戶手冊】第8章 STM32F429的終極調試組件Event Recorder
![【STM32F429開發板用戶手冊】第8章 STM32F429的終極調試組件<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32F407開發板用戶手冊】第8章 STM32F407的終極調試組件Event Recorder
![【STM32F407開發板用戶手冊】第8章 STM32F407的終極調試組件<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32H7教程】第8章 STM32H7的終極調試組件Event Recorder
![【STM32H7教程】第8章 STM32H7的終極調試組件<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
MM32F013x——Event Recorder使用方法
![MM32F013x——<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>使用方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
MM32F013x——Event Recorder使用方法
![MM32F013x——<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>使用方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論