0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何快速排查IO異常輸出問(wèn)題

strongerHuang ? 來(lái)源:魚(yú)鷹談單片機(jī) ? 作者:魚(yú)鷹談單片機(jī) ? 2022-03-09 17:55 ? 次閱讀

嵌入式開(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)的。

如何快速排查IO異常輸出問(wèn)題

當(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ě)入情況:

如何快速排查IO異常輸出問(wèn)題

(這里設(shè)置為 4 字節(jié)訪問(wèn),是因?yàn)檫@里的寄存器是 32 位的)

如何快速排查IO異常輸出問(wèn)題

當(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)下班玩游戲啊。

如何快速排查IO異常輸出問(wè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)注明出處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    描述mcp內(nèi)核常見(jiàn)問(wèn)題的排查方法幫助快速排查定位問(wèn)題

    任何系統(tǒng),硬件故障和軟件故障都不可避免。比如車(chē)載系統(tǒng),由于汽車(chē)行駛過(guò)程中的震動(dòng),發(fā)熱,電瓶饋電等,很容易影響電子元件的特性,這對(duì)設(shè)備是致命的影響,會(huì)直接改變程序邏輯及運(yùn)行結(jié)果從而產(chǎn)生各種不可預(yù)測(cè)的異常情況,本文描述常見(jiàn)問(wèn)題的排查方法幫助
    的頭像 發(fā)表于 07-12 09:23 ?2410次閱讀
    描述mcp內(nèi)核常見(jiàn)問(wèn)題的<b class='flag-5'>排查</b>方法幫助<b class='flag-5'>快速</b><b class='flag-5'>排查</b>定位問(wèn)題

    請(qǐng)問(wèn)快速IO與普通IO有什么區(qū)別?

    STM32開(kāi)發(fā)板TFT上定義的快速IO與普通IO有什么區(qū)別呀???jī)H僅是設(shè)置IO口時(shí)一個(gè)要調(diào)用函數(shù),所以普通一個(gè)不需要調(diào)用函數(shù),所以快速嗎?
    發(fā)表于 04-16 05:08

    如何排查 CS1237/CS1238 異常問(wèn)題?

    首先確認(rèn)處于量產(chǎn)階段,還是開(kāi)發(fā)階段。如果是量產(chǎn)產(chǎn)品,則著重檢查芯片是否損壞。簡(jiǎn)單的方法包括:觀察 AD 值是否跳動(dòng)幅度大;測(cè)量工作電流/休眠電流,看是否明顯異常;測(cè)量芯片的二極管特性( GND-IO
    發(fā)表于 03-02 18:02

    寄存器配置IO輸入輸出問(wèn)題怎么去解決呢

    寄存器配置IO輸入輸出問(wèn)題來(lái)源:移植原子哥的IIC例程時(shí),想修改一個(gè)SDA和SCL的引腳,卻發(fā)現(xiàn)原子哥有一部分代碼使用了寄存器編程。原函數(shù)如下://IO方向設(shè)置#define SDA_IN
    發(fā)表于 01-19 08:29

    Labview的一個(gè)異常崩潰

    起因:昨天升級(jí)程序后產(chǎn)線突然反饋程序異常崩潰,排查到了一個(gè)神奇的BUG。Labview異常崩潰報(bào)告未知異常:0x0000000000.排查
    發(fā)表于 03-17 18:05

    快速IO鏈接PHY大師決議

    快速IO鏈接PHY大師決議
    發(fā)表于 04-18 19:36 ?9次下載
    <b class='flag-5'>快速</b><b class='flag-5'>IO</b>鏈接PHY大師決議

    NXP LPC2214 ARM7芯片的引腳無(wú)法輸出問(wèn)題

    NXP LPC2214 ARM7芯片的引腳無(wú)法輸出問(wèn)題:工程是從LPC2138用過(guò)來(lái)的,增加了P2.3口的控制發(fā)現(xiàn)GPIOP2.3 無(wú)法輸出高電平/*配置IO管腳映射*/PINSEL0
    發(fā)表于 12-04 10:51 ?9次下載
    NXP LPC2214 ARM7芯片的引腳無(wú)法<b class='flag-5'>輸出問(wèn)題</b>:

    在Kubernetes集群發(fā)生網(wǎng)絡(luò)異常時(shí)如何排查

    本文將引入一個(gè)思路:“在 Kubernetes 集群發(fā)生網(wǎng)絡(luò)異常時(shí)如何排查”。文章將引入 Kubernetes 集群中網(wǎng)絡(luò)排查的思路,包含網(wǎng)絡(luò)異常模型,常用工具,并且提出一些案例以供學(xué)
    的頭像 發(fā)表于 09-02 09:45 ?4797次閱讀

    電壓輸出IO有哪些應(yīng)用?

    (1)控制執(zhí)行器: 電壓輸出IO可以用來(lái)控制執(zhí)行器,如繼電器、電磁閥、電機(jī)驅(qū)動(dòng)器等。 通過(guò)改變輸出電壓的狀態(tài)和數(shù)值,可以實(shí)現(xiàn)對(duì)執(zhí)行器的開(kāi)關(guān)、速度、方向等控制。 (2)驅(qū)動(dòng)顯示器: 電壓輸出
    的頭像 發(fā)表于 07-05 08:05 ?829次閱讀

    Android異常日志快速定位分析小技巧

    Android異常日志快速定位分析小技巧
    的頭像 發(fā)表于 08-09 10:06 ?2843次閱讀
    Android<b class='flag-5'>異常</b>日志<b class='flag-5'>快速</b>定位分析小技巧

    java內(nèi)存溢出排查方法

    過(guò)程中常見(jiàn)的問(wèn)題之一,可能導(dǎo)致應(yīng)用程序崩潰、性能下降甚至系統(tǒng)崩潰。在本文中,將詳細(xì)介紹如何排查和解決Java內(nèi)存溢出問(wèn)題。 一、什么是Java內(nèi)存溢出 在開(kāi)始解決Java內(nèi)存溢出問(wèn)題之前,首先需要了解Java內(nèi)存
    的頭像 發(fā)表于 11-23 14:46 ?3247次閱讀

    Java怎么排查oom異常

    據(jù)量的應(yīng)用中。要排查OOM異常,需要經(jīng)過(guò)以下幾個(gè)步驟: 理解OOM異常的原因:OOM異常通常有以下幾個(gè)原因:內(nèi)存泄露、內(nèi)存溢出、內(nèi)存不足以容納所需的數(shù)據(jù)等。理解OOM
    的頭像 發(fā)表于 12-05 13:47 ?1256次閱讀

    光伏電站絕緣阻抗異常排查方法

    ? 光伏電站絕緣阻抗異常排查方法 【摘要】近幾年,光伏發(fā)電技術(shù)迅猛發(fā)展,光伏扶貧電站及分布式光伏使光伏發(fā)電走進(jìn)千家萬(wàn)戶。然而光伏發(fā)電設(shè)備運(yùn)行期間仍存在隱患。及時(shí)發(fā)現(xiàn)并解決*常見(jiàn)異常運(yùn)行故障,可以很大
    的頭像 發(fā)表于 01-16 13:57 ?729次閱讀
    光伏電站絕緣阻抗<b class='flag-5'>異常</b><b class='flag-5'>排查</b>方法

    晶振輸出頻率異常怎么辦?

    晶振輸出頻率異常怎么辦? 晶振輸出頻率異常是指晶振輸出信號(hào)的頻率與預(yù)期不符。晶振作為一種常見(jiàn)的時(shí)鐘源,廣泛應(yīng)用于各種電子設(shè)備中,包括計(jì)算機(jī)、
    的頭像 發(fā)表于 01-24 16:11 ?927次閱讀

    令人頭疼的異常重啟,竟然是KV的鍋…

    合宙模組異常重啟原因排查
    的頭像 發(fā)表于 09-26 18:14 ?439次閱讀
    令人頭疼的<b class='flag-5'>異常</b>重啟,竟然是KV的鍋…