今天周六,寫(xiě)點(diǎn)輕松一點(diǎn)的內(nèi)容,相信很多朋友都有使用宏定義的經(jīng)歷。宏定義寫(xiě)得好,你的代碼修改、調(diào)試、移植等都方便;相反,寫(xiě)的不好,可能你的頭腦會(huì)炸掉。
1問(wèn)題來(lái)源
我前面移植一部分代碼,忽略了一些細(xì)節(jié)問(wèn)題,直接測(cè)試,一有數(shù)據(jù)(正常應(yīng)該是進(jìn)入中斷),程序就掛了,進(jìn)入了“B .”處,如下圖:
這代表什么意思呢?網(wǎng)上一搜B .的意思就知道,程序運(yùn)行到這個(gè)地方,在這里死循環(huán)了。
2問(wèn)題跟蹤,并解決
遇到上面問(wèn)題,于是我就開(kāi)始了在線(xiàn)調(diào)試查找問(wèn)題。果然,在線(xiàn)調(diào)試一眼就看出了問(wèn)題,中斷函數(shù)體沒(méi)有被觸發(fā),先看下圖:
看上圖,經(jīng)常調(diào)試的人就知道,前面沒(méi)有灰色的標(biāo)記代表程序不會(huì)運(yùn)行到這個(gè)位置。
上面那個(gè)DEBUG_COM_IRQHandler函數(shù),我使用的是宏定義:
那么,問(wèn)題來(lái)了,我使用了宏定義中斷函數(shù)接口,為什么沒(méi)有進(jìn)入中斷函數(shù)?
問(wèn)題就出在宏定義和被定義函數(shù)體的包含關(guān)系,簡(jiǎn)單說(shuō)就是:stm32f4xx_it.c文件里面應(yīng)該添加#include "bsp_usart.h"這行代碼。
不添加包含宏定義的文件,編譯時(shí)就會(huì)把DEBUG_COM_IRQHandler當(dāng)做成一個(gè)普通函數(shù),也不會(huì)出錯(cuò)。此時(shí),中斷函數(shù)其實(shí)是沒(méi)有定義的,那么,程序運(yùn)行中斷函數(shù)時(shí),沒(méi)有定義函數(shù)體,自然就會(huì)跳轉(zhuǎn)到B .處去。
解決的辦法就如上所說(shuō):stm32f4xx_it.c文件添加添加#include "bsp_usart.h"即可。
3總結(jié)
針對(duì)以上問(wèn)題,拓展并總結(jié)幾點(diǎn)內(nèi)容:
1.宏定義注意事項(xiàng)
宏定義與源代碼最好要高度一致,就拿USART時(shí)鐘的宏定義來(lái)說(shuō),如下這種方式就容易出錯(cuò)。
宏定義:
#define DEBUG_COM_CLK RCC_APB2Periph_USART1
調(diào)用方式:
RCC_APB2PeriphClockCmd(DEBUG_COM_CLK, ENABLE);
假如我修改時(shí)鐘:
RCC_APB2Periph_USART1改為RCC_APB1Periph_USART2
發(fā)現(xiàn)問(wèn)題沒(méi)有:
APB2和APB1混亂調(diào)用了。
2.B .含義
這里提出來(lái),是讓有些初學(xué)者順便了解一下(其實(shí)網(wǎng)上一搜就明白)。這是一個(gè)匯編指令,“B”代表不返回的跳轉(zhuǎn),比如跳到某個(gè)標(biāo)號(hào)處。“.”是指定當(dāng)前的地址,B .這條指令,其實(shí)就是死循環(huán)。
3.在線(xiàn)調(diào)試代碼覆蓋
經(jīng)常有朋友問(wèn)題:我在線(xiàn)調(diào)試,為什么有些地方不能打斷點(diǎn)?處理需要配置輸出調(diào)試信息之外,就是這里說(shuō)的代碼覆蓋問(wèn)題。
看見(jiàn)我上面有兩個(gè)中斷函數(shù)那張圖沒(méi)有,里面我有文字說(shuō)明:前面有灰色標(biāo)記的代碼,代表程序可執(zhí)行(已覆蓋)。相反,則沒(méi)有被覆蓋。
4.中斷函數(shù)接口宏定義
一般很多初學(xué)者不知道函數(shù)接口可以使用宏定義。其實(shí),有很多地方,包括一些標(biāo)準(zhǔn)的代碼都有用到使用宏定義函數(shù)接口。拿我們比較熟悉的FreeRTOS來(lái)說(shuō),為了移植方便,使用宏定義三個(gè)中斷函數(shù),如下圖:
這里需要注意的就如上面分析的,包含關(guān)系需加上。
-
源代碼
+關(guān)注
關(guān)注
96文章
2946瀏覽量
66963 -
USART
+關(guān)注
關(guān)注
1文章
195瀏覽量
30978 -
宏定義
+關(guān)注
關(guān)注
0文章
51瀏覽量
9051
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論