91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

實(shí)戰(zhàn)經(jīng)驗(yàn) | 數(shù)據(jù)意外變化導(dǎo)致條件判斷流程異常

STM32單片機(jī) ? 來源:未知 ? 2023-12-07 10:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


關(guān)鍵詞:數(shù)據(jù)意外變化導(dǎo)致條件判斷流程異常


目錄預(yù)覽

1、問題描述

2、問題分析

3、小結(jié)


01

問題描述


用戶使用的 MCU 型號是 STM32H750VB。


在客戶的代碼中有多個(gè)條件語句,在條件里面的變量數(shù)值沒有變化的情況下執(zhí)行了條件里面的邏輯。有點(diǎn)類似如下 C 語句 :



即變量 A 在明明沒有變化且條件不滿足的情況下, 程序運(yùn)行時(shí)偏偏執(zhí)行了條件內(nèi)部的代碼. 很奇怪的現(xiàn)象。一時(shí)很難判斷是編譯器的問題還是芯片問題.


了解到客戶的代碼中使用了第三方庫, xx.o 文件, 像這樣的條件有 80 多個(gè), 每次出現(xiàn)問題的具體變量并不是固定哪一個(gè), 但是在大概 10 分鐘內(nèi)肯定會有其中一個(gè)出現(xiàn)執(zhí)行邏輯問題。隨意動(dòng)一下代碼問題就不出現(xiàn), 或者出現(xiàn)的位置發(fā)生變化 ; 用 KEIL 編譯器去設(shè)置斷點(diǎn), 想看該變量信息, 也會導(dǎo)致問題不再出現(xiàn)。


02

問題分析


一開始查看 errta sheet, 看到以下相關(guān)內(nèi)容 :



即懷疑問題跟 AXI SRAM 相關(guān). 查看客戶的這些變量, 確實(shí)是存放在 AXI SRAM 中. 由于任何修改代碼都可能導(dǎo)致問題不再出現(xiàn), 因此所有嘗試須建立在不修改代碼的基礎(chǔ)上, 不然無法說明問題。


于是讓客戶用 STM32CubeProgrammer 以 hot plug 模式連接 MCU, 按照勘誤手冊中 2.2.9 節(jié)所描述的 workaround 方式將 AXI_TARG7_FN_MOD 寄存器的 READ_ISS_OVERRIDE 位通過地址的方式直接修改 :



結(jié)果發(fā)現(xiàn)并沒什么效果. 于是排除了這種可能性.


一開始也懷疑問題可能跟 Cache 有關(guān), 于是測試下關(guān)閉 Cahce 會怎么樣. 通過 KEIL 調(diào)試模式下,暫停住 CPU 運(yùn)行, 然后手動(dòng)關(guān)閉 D-Cache :



結(jié)果發(fā)現(xiàn)問題消失不見 ! 說明問題肯定跟 Cache 有關(guān).


但客戶的代碼最終肯定是不能關(guān)閉 Cache 的, 想到內(nèi)核中有一個(gè)寄存器可以打開全局 Cache 的write throght 模式, 如下編程手冊中的 CACR 寄存器的 FORCEWT 位 :



結(jié)果發(fā)現(xiàn), 客戶的代碼本身就已經(jīng)打開 :



看樣子此模式與此問題無關(guān). 得換個(gè)思路.


考慮到問題跟內(nèi)存數(shù)據(jù)有關(guān), 代碼又不能動(dòng). 但是得想辦法讓內(nèi)存中數(shù)據(jù)的位置動(dòng)動(dòng), 看看會有什么效果 ?


通過修改 KEIL 的鏈接配置文件.sct 文件, 將變量隨意動(dòng)動(dòng), 結(jié)果發(fā)現(xiàn)問題也會消失不見 ! 這說明,數(shù)據(jù)的地址跟問題絕對有關(guān)聯(lián).那么具體是哪些數(shù)據(jù)呢 ?


為了精確定位到與哪些變量有關(guān), 查看 KEIL 生成的 map 文件, 按地址倒序?qū)⒚總€(gè)程序中所用到的.o 的對應(yīng)變量逐個(gè)挪移動(dòng) DTCM RAM 中.



為什么要倒序呢? 主要是因?yàn)? 假如先挪低地址的變量, 肯定會導(dǎo)致高地址的變量向低地址移動(dòng).這好比, 如果先抽掉下面的磚頭, 那么上面的磚頭會自動(dòng)移動(dòng)下面去. 假如先抽掉上面的磚頭情況就不一樣了, 下面的磚頭還會保持不動(dòng). 這就是為什么先挪移上面的磚頭的意義, 也就是所謂的倒序.


通過這種方式, 最終定位到問題跟 heap_4.o 文件以及用戶使用到的第三方提供的 xx.o 文件中的ZI 數(shù)據(jù)有關(guān). 只要保持這兩種數(shù)據(jù)位置不變, 那么問題就可以穩(wěn)定觸發(fā), 一旦其中任何一個(gè)位置有所變動(dòng), 問題就消失不見.



現(xiàn)在我們知道規(guī)律了, 那么只要固定好這兩種 ZI 數(shù)據(jù)位置不變的情況下, 再去嘗試修改代碼, 結(jié)果發(fā)現(xiàn), 此時(shí)修改代碼不再會對結(jié)果產(chǎn)生影響! 換句話說, 現(xiàn)在可以自由修改代碼了.


考慮到此問題與 Cache 有關(guān), 于是接下來通過 MPU 設(shè)置將 heap_4.o 所在區(qū)域的 Cache 功能關(guān)閉, 結(jié)果發(fā)現(xiàn)問題消失.




Heap_4.o 的 ZI 數(shù)據(jù)是存放在 SRAM2 中的 0x3002 E050 位置.



現(xiàn)在的現(xiàn)象是,Heap_4.o 的 ZI 數(shù)據(jù)只需要固定在這個(gè)位置, 問題就能穩(wěn)定重現(xiàn),只不過將其對應(yīng)的cache 關(guān)閉, 問題則消失.


那么此區(qū)域默認(rèn)的 Cache 屬性是怎么樣的呢? 這個(gè)在 AN4839 中可以找到其默認(rèn)屬性:



于是我們通過代碼, 將其 MPU 屬性再次配置其默認(rèn)屬性:




結(jié)果問題可以重現(xiàn). 這再次說明, cache 屬性對結(jié)果有影響.


但是此時(shí)還無法對其產(chǎn)生的過程細(xì)節(jié)進(jìn)行解釋.


與此同時(shí), 嘗試關(guān)閉客戶使用第三方庫 xx.o 文件中的數(shù)據(jù) cache, 問題也同樣會消失。這說明, 此問題跟客戶所使用的第三方庫是有關(guān)系的, 其數(shù)據(jù)在 cache 中產(chǎn)生了一致性問題.


于是詢問客戶這個(gè)第三方庫是如何來的? 他們回復(fù)是一家歐洲公司提供的, 且是以 M4 內(nèi)核編譯的.


很明顯, 在使用原則上, M4 編譯出來的.o 文件, 就不應(yīng)該用在 H7 工程上.


以 M4 為內(nèi)核編譯的.o 文件放到 M7 工程中會產(chǎn)生什么樣的影響? 雖然理論上, M7 內(nèi)核的指令集是向下兼容的, 但是也需要考慮 M7 內(nèi)核相關(guān)的一些特性, 比如 Cache, memory barrier 等等. 不能完全確保不會出問題, 最保險(xiǎn)就是重新以 M7 內(nèi)核編譯這個(gè).o 文件.


由于這個(gè)第三方.o 文件客戶自己也是無法知道其內(nèi)部是如何實(shí)現(xiàn)的, 因此, 問題的具體產(chǎn)生過程是沒辦法進(jìn)一步調(diào)查了. 但定位到這個(gè).o 文件已經(jīng)是當(dāng)前能得到的最終結(jié)果.


03

小結(jié)


本文最終問題的真相雖有點(diǎn)匪夷所思, 但這正反映了當(dāng)前國內(nèi)軟件應(yīng)用上的混亂情況. 本文所描述的問題根本原因雖然很另類, 但所涉及到的方法卻對開發(fā)者有一定的參考意義, 在不能動(dòng)代碼的情況下, 需要挪動(dòng)數(shù)據(jù)的位置, 這就必須對編譯器有一定的了解. 雖也不至于太難, 但對很多開發(fā)都來說, 對編譯器的了解未必很深, 因此, 一開始很多人就會卡住。另外, 對 MPU 的了解也是一大門檻. 因此, 特奉上此文, 以供參考.


完整內(nèi)容請點(diǎn)擊“閱讀原文”下載原文檔。


原文標(biāo)題:實(shí)戰(zhàn)經(jīng)驗(yàn) | 數(shù)據(jù)意外變化導(dǎo)致條件判斷流程異常

文章出處:【微信公眾號:STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

    關(guān)注

    6076

    文章

    45495

    瀏覽量

    670297
  • STM32
    +關(guān)注

    關(guān)注

    2309

    文章

    11162

    瀏覽量

    373423

原文標(biāo)題:實(shí)戰(zhàn)經(jīng)驗(yàn) | 數(shù)據(jù)意外變化導(dǎo)致條件判斷流程異常

文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    1688 商品詳情 API 調(diào)用與數(shù)據(jù)解析 Python 實(shí)戰(zhàn)

    你想要的是 1688 商品詳情 API 的 Python 調(diào)用與數(shù)據(jù)解析實(shí)戰(zhàn)方案,核心是完成 API 憑證配置、接口請求(含簽名)、響應(yīng)數(shù)據(jù)解析、異常處理 的全
    的頭像 發(fā)表于 02-10 11:23 ?252次閱讀

    RK806中斷處理流程深度解析:從架構(gòu)到調(diào)試實(shí)戰(zhàn)

    RK806 作為瑞芯微主流 PMIC(電源管理芯片),其中斷機(jī)制是實(shí)現(xiàn)“電源鍵響應(yīng)、電壓異常保護(hù)、休眠喚醒、 watchdog 超時(shí)處理” 等核心功能的基礎(chǔ)。Linux 驅(qū)動(dòng)基于regmap_irq框架設(shè)計(jì),屏蔽了底層寄存器操作細(xì)節(jié),但調(diào)試時(shí)若不理解中斷流程,往往會陷入“
    的頭像 發(fā)表于 02-05 13:46 ?932次閱讀
    RK806中斷處理<b class='flag-5'>流程</b>深度解析:從架構(gòu)到調(diào)試<b class='flag-5'>實(shí)戰(zhàn)</b>

    雪深數(shù)據(jù)精準(zhǔn)采集:激光傳感器抗干擾技術(shù)實(shí)戰(zhàn)指南

    。本文結(jié)合實(shí)戰(zhàn)經(jīng)驗(yàn),拆解激光雪深傳感器的抗干擾技術(shù)細(xì)節(jié)與實(shí)操要點(diǎn),助力搭建穩(wěn)定可靠的監(jiān)測系統(tǒng)。 一、雪天激光傳感器核心干擾源解析 1. 光學(xué)類干擾 自然強(qiáng)光(陽光直射、雪地反射)會淹沒激光回波信號,導(dǎo)致接收端信噪比
    的頭像 發(fā)表于 02-02 14:45 ?175次閱讀

    無線傾角傳感器在房屋監(jiān)測中的應(yīng)用:用數(shù)據(jù)替代經(jīng)驗(yàn)判斷

    直川科技無線傾角傳感器精度達(dá)±0.005°,可連續(xù)監(jiān)測房屋毫米級傾斜趨勢,彌補(bǔ)人工巡檢盲區(qū)。在江蘇昆山紫竹公寓項(xiàng)目中,成功識別無外觀異常的結(jié)構(gòu)變化,實(shí)現(xiàn)早期預(yù)警。設(shè)備IP67防護(hù),3–5年免維護(hù),推動(dòng)房屋安全從經(jīng)驗(yàn)
    的頭像 發(fā)表于 01-20 13:48 ?700次閱讀
    無線傾角傳感器在房屋監(jiān)測中的應(yīng)用:用<b class='flag-5'>數(shù)據(jù)</b>替代<b class='flag-5'>經(jīng)驗(yàn)</b><b class='flag-5'>判斷</b>

    車載音頻功放芯片實(shí)戰(zhàn)經(jīng)驗(yàn)與深度疑問

    中,因未考慮老舊車型電源紋波問題,CD7388 工作時(shí)出現(xiàn)間歇性雜音,加裝二級濾波電路后,雜音完全消除,連續(xù)工作 3 個(gè)月無異常。 3. 故障排查與快速定位經(jīng)驗(yàn) 在 CD7377CZ 與 CD7388
    發(fā)表于 12-05 09:53

    UART、SPI、I2C 實(shí)戰(zhàn)對比:哪個(gè)更適合你的項(xiàng)目?

    在嵌入式開發(fā)中,設(shè)備之間的通信是繞不開的話題。常見的三種總線接口——UART、SPI、I2C——各有優(yōu)缺點(diǎn)。不同項(xiàng)目需求決定了選擇哪一種協(xié)議最合適。本文結(jié)合實(shí)戰(zhàn)經(jīng)驗(yàn),逐項(xiàng)對比三者,并附帶實(shí)戰(zhàn)代碼
    的頭像 發(fā)表于 11-24 19:04 ?1148次閱讀
    UART、SPI、I2C <b class='flag-5'>實(shí)戰(zhàn)</b>對比:哪個(gè)更適合你的項(xiàng)目?

    怎么判斷土壓力計(jì)數(shù)據(jù)正常還是異常?

    土壓力計(jì)數(shù)據(jù)的正常與異常工作性態(tài)是怎樣的?通過對大量監(jiān)測數(shù)據(jù)的分析總結(jié),可識別出土壓力計(jì)的正常和異常工作模式,這為判斷儀器工作狀態(tài)和評估工程
    的頭像 發(fā)表于 10-31 14:43 ?244次閱讀
    怎么<b class='flag-5'>判斷</b>土壓力計(jì)<b class='flag-5'>數(shù)據(jù)</b>正常還是<b class='flag-5'>異常</b>?

    如何使用數(shù)據(jù)異常判斷電能質(zhì)量在線監(jiān)測裝置采樣電阻是否損壞?

    通過數(shù)據(jù)異常判斷電能質(zhì)量在線監(jiān)測裝置采樣電阻是否損壞,核心是聚焦電流測量數(shù)據(jù)異常特征—— 采樣電阻負(fù)責(zé)將電流信號轉(zhuǎn)為電壓信號,其損壞(開路
    的頭像 發(fā)表于 10-22 14:32 ?609次閱讀

    數(shù)據(jù)庫慢查詢分析與SQL優(yōu)化實(shí)戰(zhàn)技巧

    今天,我將分享我在處理數(shù)千次數(shù)據(jù)庫性能問題中積累的實(shí)戰(zhàn)經(jīng)驗(yàn),幫助你系統(tǒng)掌握慢查詢分析與SQL優(yōu)化的核心技巧。無論你是剛?cè)腴T的運(yùn)維新手,還是有一定經(jīng)驗(yàn)的工程師,這篇文章都將為你提供實(shí)用的解決方案。
    的頭像 發(fā)表于 09-08 09:34 ?977次閱讀

    Linux服務(wù)器性能調(diào)優(yōu)的核心技巧和實(shí)戰(zhàn)經(jīng)驗(yàn)

    如果你正在為這些問題頭疼,那么這篇文章就是為你準(zhǔn)備的!作為一名擁有10年經(jīng)驗(yàn)的運(yùn)維工程師,我將毫無保留地分享Linux服務(wù)器性能調(diào)優(yōu)的核心技巧和實(shí)戰(zhàn)經(jīng)驗(yàn)。
    的頭像 發(fā)表于 08-27 14:36 ?1045次閱讀

    碳化硅襯底 TTV 厚度測量數(shù)據(jù)異常的快速診斷與處理流程

    摘要 本文針對碳化硅襯底 TTV 厚度測量中出現(xiàn)的數(shù)據(jù)異常問題,系統(tǒng)分析異常類型與成因,構(gòu)建科學(xué)高效的快速診斷流程,并提出針對性處理方法,旨在提升數(shù)
    的頭像 發(fā)表于 08-14 13:29 ?1208次閱讀
    碳化硅襯底 TTV 厚度測量<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>異常</b>的快速診斷與處理<b class='flag-5'>流程</b>

    判斷伺服行星減速機(jī)出現(xiàn)噪音的異常

    伺服行星減速機(jī)出現(xiàn)噪音通常被視為一種異常現(xiàn)象,這種噪音可能會影響設(shè)備的正常運(yùn)行,甚至對工作環(huán)境和操作人員的健康造成不良影響。以下是對伺服行星減速機(jī)出現(xiàn)噪音異常判斷及可能原因的分析: 一、判斷
    的頭像 發(fā)表于 07-31 18:16 ?986次閱讀
    <b class='flag-5'>判斷</b>伺服行星減速機(jī)出現(xiàn)噪音的<b class='flag-5'>異常</b>

    數(shù)據(jù)數(shù)據(jù)恢復(fù)—服務(wù)器異常斷電導(dǎo)致Oracle數(shù)據(jù)庫故障的數(shù)據(jù)恢復(fù)案例

    Oracle數(shù)據(jù)庫故障: 某公司一臺服務(wù)器上部署Oracle數(shù)據(jù)庫。服務(wù)器意外斷電導(dǎo)致數(shù)據(jù)庫報(bào)錯(cuò),報(bào)錯(cuò)內(nèi)容為“system01.dbf需要
    的頭像 發(fā)表于 07-24 11:12 ?637次閱讀
    <b class='flag-5'>數(shù)據(jù)</b>庫<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—服務(wù)器<b class='flag-5'>異常</b>斷電<b class='flag-5'>導(dǎo)致</b>Oracle<b class='flag-5'>數(shù)據(jù)</b>庫故障的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    移動(dòng)電源EMC整改:認(rèn)證失敗到一次通過的實(shí)戰(zhàn)經(jīng)驗(yàn)

    深圳南柯電子|移動(dòng)電源EMC整改:認(rèn)證失敗到一次通過的實(shí)戰(zhàn)經(jīng)驗(yàn)
    的頭像 發(fā)表于 05-26 11:25 ?845次閱讀
    移動(dòng)電源EMC整改:認(rèn)證失敗到一次通過的<b class='flag-5'>實(shí)戰(zhàn)經(jīng)驗(yàn)</b>

    錫膏使用避坑指南:50 個(gè)實(shí)戰(zhàn)問答幫你解決 99% 的焊接難題(全流程解析)

    問題包含“原因分析 + 解決措施”,結(jié)合行業(yè)標(biāo)準(zhǔn)與實(shí)戰(zhàn)經(jīng)驗(yàn),為電子工程師、產(chǎn)線技術(shù)人員、營銷工程師提供 “一站式” 缺陷解決方案,助力提升焊接良率與產(chǎn)品可靠性。了解完5
    的頭像 發(fā)表于 04-14 09:45 ?1473次閱讀
    錫膏使用避坑指南:50 個(gè)<b class='flag-5'>實(shí)戰(zhàn)</b>問答幫你解決 99% 的焊接難題(全<b class='flag-5'>流程</b>解析)