精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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
    +關注

    關注

    2266

    文章

    10871

    瀏覽量

    354800
  • 代碼
    +關注

    關注

    30

    文章

    4748

    瀏覽量

    68351
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40093

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

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

收藏 人收藏

    評論

    相關推薦

    I2S有左對齊,右對齊標準的I2S三種格式,那么這三種格式各有什么優點呢?

    大家好,關于I2S格式,有兩疑問請教下 我們知道I2S有左對齊,右對齊標準的I2S三種格式,那么這三種格式各有什么優點呢? 而且對于
    發表于 10-21 08:23

    IP地址會被黑?

    IP地址會被黑?是的,你的IP地址如果不幸被惡意分子盯上,就會被惡意利用,這會引發系列明顯的異常表現。就像網絡會突然變得異常緩慢,下載速度
    的頭像 發表于 09-12 14:24 ?281次閱讀

    如何獲取MAC地址?MAC地址的三申請條件

    在產品設備都規范化管理的當今社會,如果您的產品設備想要投入市場,設備物理地址碼MAC地址則是唯能識別設備的識別碼。那么MAC地址的申請條件有哪些?接下來請看英利檢測的分享。提交必要信
    的頭像 發表于 09-06 17:14 ?355次閱讀
    如何獲取MAC<b class='flag-5'>地址</b>?MAC<b class='flag-5'>地址</b>的三<b class='flag-5'>個</b>申請條件

    文帶你了解IP地址別名

    、什么是IP地址別名 IP地址別名是將多個IP地址網絡接口關聯起來的
    的頭像 發表于 09-05 14:11 ?173次閱讀

    DHCP服務異常與IP地址管理挑戰

    DHCP是種計算機網絡協議,主要用于自動分配IP地址、子網掩碼、網關、DNS等網絡參數給客戶端設備。它是局域網中實現自動IP地址分配的重要協議,極大地簡化了網絡管理員對IP地址的管理
    的頭像 發表于 08-30 14:35 ?939次閱讀

    谷景科普電感的感值什么有關

    感值也就是我們常說的電感量,它是電感的非常重要的性能參數,衡量的是電感在電路中對電流變化的抵抗能力的物理量。那么,你知道電感值與哪些因素有關嗎? 有人說電感越大它的電感值就越大的,分裝尺寸大小
    的頭像 發表于 08-19 10:31 ?276次閱讀

    IP地址與網絡監控

    如何識別和應對異常流量和可疑活動。 IP地址與網絡監控的基礎 IP地址是互聯網中設備的唯標識符,它在網絡通信中起著至關重要的作用。通過監控IP地址
    的頭像 發表于 07-09 16:41 ?386次閱讀

    鴻蒙ArkUI開發:【彈性布局(主軸&amp;交叉軸對齊方式)】

    通過justifyContent參數設置在主軸方向的對齊方式,和Row、Column的主軸對齊方式行為
    的頭像 發表于 05-14 15:33 ?641次閱讀
    鴻蒙ArkUI開發:【彈性布局(主軸&amp;交叉軸<b class='flag-5'>對齊</b>方式)】

    STM32關于FLASH的編程對齊錯誤標志位(PGAERR)的疑問求解

    大神們,我現在正在做一個應用,需要熟悉STM32F4的FLASH的任何錯誤標識,以用于特殊情況下的錯誤標識判斷做相應處理,但是針對FLASH的編程對齊錯誤標志(PGAERR)與我理解不同。 原文
    發表于 03-22 07:59

    TC277如何指定該全局數組變量的存儲地址對齊方式?

    定義全局數組變量,如何指定該全局數組變量的存儲地址對齊方式
    發表于 02-19 07:37

    SPI全雙工模式下數據接收異常原因

    前面給小伙伴講過串口發送和接收異常的可能原因,今天我們講下SPI全雙工模式下數據接收異常原因。
    的頭像 發表于 01-23 09:31 ?1255次閱讀
    SPI全雙工模式下數據接收<b class='flag-5'>異常</b>的<b class='flag-5'>一</b><b class='flag-5'>個</b>原因

    程序中增加變量導致異常的分析

    大家在平常的編程過程應該會碰到各種奇葩的問題吧,反正我最近是碰到了次,再此大家分享下。事情的原因是我在程序中增加了變量,然后就會導
    的頭像 發表于 01-22 09:56 ?524次閱讀
    程序中增加<b class='flag-5'>一</b><b class='flag-5'>個</b>變量導致<b class='flag-5'>異常</b>的分析

    OneLLM:對齊所有模態的框架!

    OneLLM 是第一個在單個模型中集成八種不同模態的MLLM。通過統的框架和漸進式多模態對齊pipelines,可以很容易地擴展OneLLM以包含更多數據模式。
    的頭像 發表于 01-04 11:27 ?908次閱讀
    OneLLM:<b class='flag-5'>對齊</b>所有模態的框架!

    AD9288輸出不平衡Vref有關系嗎?

    的參考信號1.25V,用示波器看有點紋波,1.29~1.22V,濾波電容是0.1uF的,后來增加1uF的貌似沒有改善,請問這個不平衡Vref有關系嗎?
    發表于 12-15 06:24

    dhcp服務異常怎么修復

    DHCP(Dynamic Host Configuration Protocol)是種網絡協議,它能夠自動分配 IP 地址和其他網絡參數給計算機和其他網絡設備。然而,有時候 DHCP 服務可能會出現異常
    的頭像 發表于 11-27 14:53 ?9768次閱讀