国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個跟地址對齊有關的應用異常案例

茶話MCU ? 來源:lq ? 2019-02-04 15:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

曾有STM32用戶反饋,他發現同樣代碼在STM32F1系列芯片上運行好好的,而且代碼跟STM32外設關聯性也不大。而當代碼運行在stm32L071VB單片機時,在做數據的內存拷貝時會進入硬件錯誤【Hard Fault】,覺得不可理解。

它定義了類似下面的數據結構,并用到預編譯命令安排結構體數據成員的存放對齊原則:

#pragma pack? (1)

Struct Comm_Frame {

uint8_t Head;

uint16_t Data[3];

uint8_t Class;

uint16_t Tail [2];

} Stream;

#pragma pack ()

他使用到基于上面結構體定義的數據變量進行數據通信,為了讓數據成員在內存中緊湊連續存放,將數據結構體的地址對齊規則指定為字節對齊,即使用#pragma pack (1)。數據在內存中像下面樣子擺放:

他這樣設計的話,數據結構體中的Data[]和Tail[]雙字節數據會出現在奇數地址的地方。那么,當將上述Stream.Data[]數據拷貝出去的時候,在基于雙字節數據類型的指針尋址訪問時,會出現被訪問數據的地址不遵循2倍數的原則,即出現訪問地址不對齊的問題,可能導致運行出錯。一般來講,對于ARM內核的芯片,基于雙字節數據寬度的尋址訪問時,被訪問數據的地址要求是2的倍數;基于4字節數據寬度的尋址訪問時,地址要求是4的倍數。

比如:這里定義了一個數組uint16_t forcomp[3]和下面兩個指針:

uint16_t *pointer1 = &forcomp[0];

uint16_t *pointer2 = &Stream.Data[0];

現將上面結構體成員Stream.Data[]的內容通過指針尋址按如下方式拷貝進?forcomp[]?。

上面的代碼如果運行在基于M0或M0+內核的STM32芯片的話,就會出現Hard Fault錯誤. 客戶使用的芯片stm32L071VBT6正是基于M0+內核的STM32芯片。

為什么會這樣呢?這可以從Cortex M0/M0+的內核技術手冊上看到相關描述:

顯然,基于M0、M0+內核的芯片,它是不支持非對齊尋址訪問的。

客戶又說過,相同代碼在STM32F1芯片上運行又沒有問題,那怎么解釋呢?

STM32F1系列MCU是基于ARMCortex M3內核的芯片,關于地址對齊方面跟M0/M0+有所不同。M3內核支持部分指令的非對齊地址訪問,相關描述如下:

也就是說,基于CortexM3內核的芯片,它支持部分指令的非對齊訪問,但非對齊訪問要慢于對齊訪問。即非對齊訪問是需要代價的,訪問效率會受到影響。所以,我們在應用中要盡量遵循地址對齊的尋址訪問方式。關于地址對齊話題,在各個ARM內核技術參考手冊里略有介紹。

結合本案的實際情況,碰巧用戶代碼先是可以正常運行于基于M3內核的STM32F1芯片,而在基于M0+內核的芯片上出現了異常。導致他覺得不好理解。

這里,指針所指數據類型為雙字節類型,為了避免在M0/M0+內核芯片里尋址訪問時發生非對齊而導致的異常,可以將結構體變量的內存地址對齊方式改為雙字節對齊,即使用#pragma pack (2)。數據在內存中像下面這樣擺放。

這樣修改后,經過測試的確沒有問題。結合到客戶的具體情況,客戶希望數據連續、緊湊存放,不希望數據間有空隙,即結構體數據成員的內存地址對齊規則不變,仍然采用pack(1)。那么,數據拷貝操作時可以將雙字節數據類型的指針強轉為單字節數據類型的指針,將雙字節數據按字節對齊尋址方式分作兩次連續讀取完成。此時,用戶只需將應用程序稍作調整即可。

所以,在STM32開發過程中,有些代碼或許跟MCU外設沒什么關系,但可能跟內核有關。STM32系列眾多,涉及多個ARM內核,不同的內核在諸多方面存在些差異,這點需要注意。其實,從MCU軟件開發層面來看,地址對齊問題、中斷優先級安排問題、堆棧安排問題,都是些比較隱蔽的問題,出錯了后果往往也很嚴重,我們平時可以多留意下。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2309

    文章

    11162

    瀏覽量

    373406
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73955
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    41584

原文標題:一個跟地址對齊有關的應用異常案例

文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    對 M7 內核上的 memcpy 速度的疑問求解

    些調試器延遲,但這仍然感覺異常長。 這種不可緩存內存的 memcpy 速度是 M7 內核上典型的嗎? 目前不使用 DMA,地址和數據大小為 8 字節對齊
    發表于 03-02 06:14

    Cortex-M3工作模式及異常

    向量。這些地址對應的區域可以是代碼區,但更多是在 RAM 區。在 RAM 區就可以修改向量的入口地址了。為了實現這個功能, NVIC中有寄存器,稱為“向量表偏移量寄存器”(在
    發表于 01-20 08:24

    LAT1185+地址對齊引起的 HardFault 異常應用筆記

    ,則程序運行正常。表面上看,這似乎是 KEIL MDK 的問題,通過分析,導致這個問題的本質原因是內存地址沒有對齊引起的,下面章節將詳細分析該問題的來龍去脈以及解決方法。
    發表于 01-11 17:28 ?0次下載

    開關電源 變壓器初級電流異常

    直流開關電源,單相全橋逆變,硬開關電路 變壓器初級電流異常突變 開始使用EE磁芯沒有問題,后來換成環形磁芯就發現初級電流異常了,且功率大小沒有關
    發表于 12-20 16:57

    CW32操作FLASH地址對齊的要求

    地址邊界對齊,即使用 16bit 位寬訪問 FLASH 時的地址必須是偶地址,使用 32bit 位寬時的地址必須是 4 的倍數
    發表于 12-15 06:30

    摩爾線程新代大語言模型對齊框架URPO入選AAAI 2026

    近日,摩爾線程在人工智能前沿領域取得重要突破,其提出的新代大語言模型對齊框架——URPO統獎勵與策略優化,相關研究論文已被人工智能領域的國際頂級學術會議AAAI 2026收錄。這
    的頭像 發表于 11-17 16:03 ?481次閱讀
    摩爾線程新<b class='flag-5'>一</b>代大語言模型<b class='flag-5'>對齊</b>框架URPO入選AAAI 2026

    Hardfult對齊異常怎么解決?

    1.使用O3編譯,正常運行。 2.使用OZ編譯,報UNALIGNED異常。 3.全局使用Oz編譯,對ipc.c文件單獨O3編譯,正常運行。 00> msh >psr
    發表于 10-13 07:45

    連得上熱點,但是ping baidu.com出現timeout,請問什么有關

    連得上熱點,但是ping baidu.com出現了timeout, ping其他ip也是timeout,timeout什么有關系,需要怎么操作
    發表于 09-17 08:19

    芯知識|WT2003H語音芯片音頻地址詳解:線/UART模式差異及靜音地址實踐

    語音功能的關鍵前提。本文將清晰解析這核心機制:、音頻播放地址核心規則線串口、兩線串口(單字節/雙字節模式):起始地址:0x00(十進制
    的頭像 發表于 06-19 09:21 ?785次閱讀
    芯知識|WT2003H語音芯片音頻<b class='flag-5'>地址</b>詳解:<b class='flag-5'>一</b>線/UART模式差異及靜音<b class='flag-5'>地址</b>實踐

    CYPD5235的CC Pin功能異常,還可能會什么有關

    /VSYS/VDDD/V5V_P1的電都是正常的。 請教問題: 1。CYPD5235的CC Pin功能異常,還可能會什么有關? 2。去掉的MP8859,會影響CYPD5235的軟件代碼執行嗎?如果會
    發表于 05-30 07:04

    Allegro Skill布局功能--器件絲印過孔對齊介紹與演示

    Allegro系統雖然提供了基本的元件對齊功能,但其適用范圍較為有限。相比之下,Fanyskill 的“對齊”命令在操作體驗和功能性上更具優勢:其界面設計更加直觀易用,并支持多種元素的對齊操作,包括
    發表于 05-14 08:59 ?3652次閱讀
    Allegro Skill布局功能--器件絲印過孔<b class='flag-5'>對齊</b>介紹與演示

    PCB布局太亂? Altium Designer這個快捷鍵幫你對齊全場

    在做PCB設計的時候,你是否也遇到過這種情況: 器件擺好但總感覺歪歪扭扭? 有些元件間距不致,看著難受? 想對齊一個個拖動,累得不行? 別急!今天教你招? Altium Desi
    的頭像 發表于 04-14 09:09 ?4830次閱讀
    PCB布局太亂? Altium Designer這個快捷鍵幫你<b class='flag-5'>一</b>秒<b class='flag-5'>對齊</b>全場

    散熱設計與測試:PCBA異常發熱的解決之道

    在電子設備的生產和測試過程中,PCBA(印制電路板組裝)異常發熱是常見且棘手的問題。過高的溫度不僅會影響設備的性能,還可能導致元器件損壞甚至設備報廢。因此,快速定位發熱原因并采取有效的解決措施
    的頭像 發表于 04-10 18:04 ?1609次閱讀

    圖解邊沿對齊,中心對齊PWM(可下載)

    在說邊沿對齊,中心對齊前,我們先來段鋪墊,PWM 又稱脈沖寬度調制,我們通過調 節脈沖的占空比,我們可以控制電壓的大小(比如我們滿占空比時電壓為 12V,我們可以通 過調節占空比讓電壓變為 7V
    發表于 03-31 15:15 ?1次下載

    匯川西門子PLC之間通訊項目調試的筆記

    剛完成了匯川西門子PLC之間通訊項目,采集IGT-DSER智能網關,兩邊的PLC內都不用編程的; 支持字節順序的調整,通訊速度是毫秒級別的,與總線無差異; 該方法也可以實現西門子PLC
    發表于 03-26 14:24