溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

發(fā)布時(shí)間:2021-09-06 15:01:07 來(lái)源:億速云 閱讀:129 作者:小新 欄目:web開(kāi)發(fā)

小編給大家分享一下STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

 引言

我們?cè)谄匠J褂肧TM32單片機(jī)的時(shí)候,往往會(huì)碰到程序跑飛的情況,出現(xiàn)hard_fulat等錯(cuò)誤,而我們?cè)诙ㄎ诲e(cuò)誤的時(shí)候,采用的方法往往是連上仿真器,一步一步單步調(diào)試,定位到具體的錯(cuò)誤代碼,再去猜測(cè)、排除、推敲錯(cuò)誤原因,這樣一個(gè)過(guò)程很是痛苦,而且在實(shí)際情況中,很多產(chǎn)品真機(jī)調(diào)試時(shí)必須斷開(kāi)仿真器或者說(shuō),問(wèn)題確實(shí)存在,但是極難出現(xiàn),所以在基于這樣一個(gè)問(wèn)題背景下,RTT  的大佬armink開(kāi)發(fā)了一個(gè)基于 ARM Cortex-M系列的 MCU錯(cuò)誤追蹤庫(kù),用于幫助開(kāi)發(fā)者解決上述問(wèn)題。

CmBacktrace 的作用及適用平臺(tái)首先,CmBacktrace 是一款針對(duì)于 ARM Cortex-M 系列 MCU  的錯(cuò)誤代碼自動(dòng)追蹤、定位、錯(cuò)誤原因自動(dòng)分析的開(kāi)源庫(kù),它所支持的錯(cuò)誤包括:

  • 斷言(assert)

  • 故障

  • Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault

支持裸機(jī)以及以下操作系統(tǒng)平臺(tái):

  • RT-Thread

  • UCOS

  • FreeRTOS

適配 Cortex-M0/M3/M7  MCU,支持IAR、KEIL、GCC編譯器,能夠達(dá)到的效果是:故障原因自動(dòng)診斷,自動(dòng)分析故障原因,定位發(fā)生故障代碼位置,輸出錯(cuò)誤現(xiàn)場(chǎng)的函數(shù)調(diào)用棧。

移植

當(dāng)前筆者所使用的平臺(tái)是 keil 5,所使用的控制器是 STM32F103,我們準(zhǔn)備一個(gè)具備串口功能的工程,工程結(jié)構(gòu)如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306101326283

緊接著,我們來(lái)看下 cm_backtrace的源代碼:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306101659128

上述中,cm_backtrace文件夾中存放的是源代碼,我們需要將其全部復(fù)制到我們的工程目錄,demos是使用的例子,里面分為有操作系統(tǒng)和無(wú)操作系統(tǒng)兩種類型,然后tools存放的是工具,用命令行的形式來(lái)分析代碼錯(cuò)誤的工具,將相關(guān)文件復(fù)制到工程目錄之后工程目錄下的文件如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306102410525

然后,我們將相關(guān)文件添加至工程中,下面是添加之后的工程文件:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306102815766

同時(shí)應(yīng)該添加相關(guān)頭文件路徑,添加的頭文件路徑如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306102919999

至此,cm_backtrace的源代碼就添加完了,我們來(lái)編譯一下。編譯結(jié)果如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤


image-20210306103031890

可以發(fā)現(xiàn)有很多錯(cuò)誤,這是因?yàn)槲覀兊南嚓P(guān)宏還沒(méi)有打開(kāi),我們以照源碼中的說(shuō)明文檔中的一個(gè)表,在 cmb_def.h中依次打開(kāi)對(duì)應(yīng)的宏,表如下所示:

配置名稱功能備注
cmb_println(…)錯(cuò)誤及診斷信息輸出必須配置
CMB_USING_BARE_METAL_PLATFORM是否使用在裸機(jī)平臺(tái)使用則定義該宏
CMB_USING_OS_PLATFORM是否使用在操作系統(tǒng)平臺(tái)操作系統(tǒng)與裸機(jī)必須二選一
CMB_OS_PLATFORM_TYPE操作系統(tǒng)平臺(tái)RTT/UCOSII/UCOSIII/FREERTOS
CMB_CPU_PLATFORM_TYPECPU平臺(tái)M0/M3/M4/M7
CMB_USING_DUMP_STACK_INFO是否使用 Dump 堆棧的功能使用則定義該宏
CMB_PRINT_LANGUAGE輸出信息時(shí)的語(yǔ)言CHINESE/ENGLISH

更改之后的代碼如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306103649154

更改了宏之后,我們?cè)賮?lái)編譯代碼,編譯結(jié)果如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306103729814

提示要開(kāi)啟c99編譯模式,我們?cè)趉eil中設(shè)置,設(shè)置方式如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306103831859

繼續(xù)編譯,看到還有一個(gè)錯(cuò)誤信息,編譯結(jié)果如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306104005145

這是因?yàn)閏mb_fault.S中使用匯編定義了 HardFault_Handler函數(shù),而在原本工程中,stm32f10x_it.c中已經(jīng)定義了  HardFault_Handler,我們將stm32f10x_it.c中的HardFault_Handler注釋掉,代碼如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306104326301

現(xiàn)在編譯就可以通過(guò)了。

測(cè)試

移植完之后,我們現(xiàn)在來(lái)測(cè)試一下,在單片機(jī)中除0造成的錯(cuò)誤如何檢查出來(lái),我們?cè)谥骱瘮?shù)中添加如下所示的代碼:

#include "stm32f10x.h" #include "bsp_usart.h" #include <cm_backtrace.h>  #define HARDWARE_VERSION               "V1.0.0" #define SOFTWARE_VERSION               "V0.1.0"  extern void fault_test_by_div0(void);  /**   * @brief  主函數(shù)   * @param  無(wú)   * @retval 無(wú)   */ int main(void) {       /*初始化USART 配置模式為 115200 8-N-1,中斷接收*/   USART_Config();    /* CmBacktrace initialize */   cm_backtrace_init("CmBacktrace", HARDWARE_VERSION, SOFTWARE_VERSION);    fault_test_by_div0();    while(1)   {       }     }

將程序燒錄單片機(jī),通過(guò)串口調(diào)試助手觀查輸出的信息:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306105316179

我們可以看到輸出信息顯示了當(dāng)前用法錯(cuò)誤是:企圖除 0  操作,并給出了相關(guān)寄存器信息,但是我們還不知道出現(xiàn)錯(cuò)誤的代碼在哪一行,這個(gè)時(shí)候,就需要使用到前文所說(shuō)的tools文件夾下的工具,addr2line工具。在使用這個(gè)工具的時(shí)候,需要知道當(dāng)前工具輸出的可執(zhí)行文件的名字,我們打開(kāi)keil,信息如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306105719377

然后,我們找到 cm_backtrace文件夾下的tools工具,將其復(fù)制到USART.axf所在的目錄,復(fù)制之后的文件夾目錄如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306110017993

在當(dāng)前文件夾下打開(kāi) cmd窗口,然后運(yùn)行addr2line -e USART.axf -a -f 08001844 0800189a,在這里提一下打開(kāi)  cmd的方法,按住Shift鍵,然后右鍵,打開(kāi)Powershell

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306110527928

打開(kāi)的 Powershell如下所示,并在Powershell中輸入start cmd打開(kāi)cmd窗口,然后在cmd窗口輸入addr2line -e  USART.axf -a -f 08001844 0800189a,結(jié)果如下所示:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306110839097

可以看到錯(cuò)誤信息是fault_test.c的38行,我們打開(kāi)源代碼查看:

STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤

image-20210306111229605

可以看到確實(shí)是38行,問(wèn)題分析正確。

以上是“STM32在Keil環(huán)境下怎么使用Cm_Backtrace進(jìn)行錯(cuò)誤追蹤”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI