在嵌入式開(kāi)發(fā)過(guò)程中,IO 操作是不可避免的,很多時(shí)候 IO 操作很正常,但有些時(shí)候可能因?yàn)槟承┰驅(qū)е庐惓]敵?,或者說(shuō)不是你想要的輸出(本來(lái)應(yīng)該一直輸出高電平,突然出現(xiàn)一個(gè)低電平)。
1、時(shí)間太久,不知道在哪里操作了這個(gè) IO。
2、程序異常篡改 IO 輸出。
3、維護(hù)別人的程序,代碼太多,不知道哪些地方會(huì)修改這個(gè) IO。 針對(duì)這些情況,本篇筆記魚(yú)鷹將討論如何快速排查異常輸出問(wèn)題(軟件問(wèn)題,非單片機(jī)本身問(wèn)題)。
一、全局搜索
一般來(lái)說(shuō),IO 輸出肯定有跡可查,比如我們可以全局搜索 GPIOB 和 GPIO_Pin_0 之類(lèi)的。
當(dāng)然,我們也可以借助 SI 之類(lèi)的工具查看相關(guān)定義的使用情況。 總之,這個(gè)方法,比較笨,但對(duì)付一般的異常輸出,問(wèn)題不大。
二、斷點(diǎn)神器
如果上述方法還是沒(méi)法查出問(wèn)題,那么只能請(qǐng)出我們的終極殺人王“火云邪神”,不,終極調(diào)試神器——斷點(diǎn)出場(chǎng)了(關(guān)于該調(diào)試方法使用與介紹,可以查看歷史筆記《打了多年的單片機(jī)調(diào)試斷點(diǎn)到底應(yīng)該怎么設(shè)置?| 顛覆認(rèn)知》) 既然從源碼很難分析這些問(wèn)題,那就只能靠單片機(jī)本身提供的調(diào)試手段來(lái)查了。 比如,輸出時(shí),我們一般都會(huì)調(diào)用 GPIOB->BSRR 之類(lèi)的寄存器設(shè)置高電平或低電平,所以我們可以使用我們的調(diào)試神器跟蹤這個(gè)寄存器的寫(xiě)入情況,比如我們可以通過(guò)設(shè)置如下窗口跟蹤 GPIOB->BSRR 寫(xiě)入情況:
(這里設(shè)置為 4 字節(jié)訪問(wèn),是因?yàn)檫@里的寄存器是 32 位的)
當(dāng)然,除了要查 BSRR,還有 BRR、ODR 等寄存器,還有別忘了,位綁定的地址操作。 總之,這些地址全部跟蹤一遍,如果是軟件問(wèn)題,99% 都能查出來(lái)。 另外魚(yú)鷹再教大家一個(gè)快速找到寄存器地址方法,比如在調(diào)試模式下,可以在命令行中輸入下面這個(gè),就能得到對(duì)應(yīng)的地址,當(dāng)然綁定地址只能通過(guò)變量中轉(zhuǎn)一下了,或者直接看匯編代碼也很快。 總之,找地址的方法很多,千萬(wàn)不要傻傻的自己手工算,不然怎么早點(diǎn)下班玩游戲啊。
而對(duì)于有些 IO 的配置莫名的改變了,比如輸入變輸出,輸出變輸入,那還要跟蹤 CRL 、 CRH 寄存器。 該方法從根本上跟蹤指令,基本上所有代碼都將無(wú)所遁形(除了 DMA 的操作,不過(guò)一般人應(yīng)該不會(huì)用 DMA 去控制 IO 吧),即使你的代碼是指針或者其他騷操作,甚至是異常篡改 IO 寄存器這種情況。
如何避免?
一般來(lái)說(shuō),上面兩種方法基本上就可以排查問(wèn)題了,但是有些情況很復(fù)雜,就需要根據(jù)情況選擇適合自己的方法了,方法二絕對(duì)是神器級(jí)別的,一般問(wèn)題不大。 所以現(xiàn)在討論一下怎么盡量避免這個(gè)問(wèn)題。 1、每個(gè) IO 操作盡量封裝在單獨(dú)一個(gè)函數(shù)中,或者使用一個(gè)枚舉參數(shù)進(jìn)行控制,比如一個(gè)枚舉 OUT_PIN_LED,這樣在全局搜索時(shí),搜索這個(gè)函數(shù)或者枚舉就可找出所有操作該 IO 的位置,這也是魚(yú)鷹為什么要實(shí)現(xiàn)這個(gè) IO 框架的原因之一(簡(jiǎn)單實(shí)用IO輸入輸出框架)。絕對(duì)不建議直接操作庫(kù)函數(shù)或者寄存器。2、使用 LCKR (鎖定)寄存器。很多道友可能聽(tīng)說(shuō)或者見(jiàn)過(guò)這個(gè)寄存器,但在實(shí)際項(xiàng)目中很少使用。事實(shí)上這個(gè)寄存器很有用處,特別是你不確定這個(gè) IO 配置是否會(huì)被別人的代碼修改的情況。如果很確定這個(gè) IO 從始至終只會(huì)有一個(gè)配置(輸入或輸出等),那么建議大家在配置完后使用該寄存器鎖定對(duì)應(yīng)的引腳,這樣,你就不怕別人意外修改這個(gè) IO 的配置了(只要鎖定了,就無(wú)法修改配置,除非重新上電)。之后你的關(guān)注點(diǎn)集中在 IO 輸出即可,而不必懷疑配置被修改的可能。當(dāng)然,在鎖定這個(gè) IO 之前的代碼問(wèn)題,可不敢保證。
原文標(biāo)題:IO 異常輸出排查指南
文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44561瀏覽量
635665 -
嵌入式
+關(guān)注
關(guān)注
5083文章
19131瀏覽量
305551 -
代碼
+關(guān)注
關(guān)注
30文章
4790瀏覽量
68654
原文標(biāo)題:IO 異常輸出排查指南
文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論