衡阳派盒市场营销有限公司

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

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

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

一個(gè)跟地址對(duì)齊有關(guān)的應(yīng)用異常案例

茶話MCU ? 來源:lq ? 2019-02-04 15:20 ? 次閱讀

曾有STM32用戶反饋,他發(fā)現(xiàn)同樣代碼在STM32F1系列芯片上運(yùn)行好好的,而且代碼跟STM32外設(shè)關(guān)聯(lián)性也不大。而當(dāng)代碼運(yùn)行在stm32L071VB單片機(jī)時(shí),在做數(shù)據(jù)的內(nèi)存拷貝時(shí)會(huì)進(jìn)入硬件錯(cuò)誤【Hard Fault】,覺得不可理解。

它定義了類似下面的數(shù)據(jù)結(jié)構(gòu),并用到預(yù)編譯命令安排結(jié)構(gòu)體數(shù)據(jù)成員的存放對(duì)齊原則:

#pragma pack? (1)

Struct Comm_Frame {

uint8_t Head;

uint16_t Data[3];

uint8_t Class;

uint16_t Tail [2];

} Stream;

#pragma pack ()

他使用到基于上面結(jié)構(gòu)體定義的數(shù)據(jù)變量進(jìn)行數(shù)據(jù)通信,為了讓數(shù)據(jù)成員在內(nèi)存中緊湊連續(xù)存放,將數(shù)據(jù)結(jié)構(gòu)體的地址對(duì)齊規(guī)則指定為字節(jié)對(duì)齊,即使用#pragma pack (1)。數(shù)據(jù)在內(nèi)存中像下面樣子擺放:

他這樣設(shè)計(jì)的話,數(shù)據(jù)結(jié)構(gòu)體中的Data[]和Tail[]雙字節(jié)數(shù)據(jù)會(huì)出現(xiàn)在奇數(shù)地址的地方。那么,當(dāng)將上述Stream.Data[]數(shù)據(jù)拷貝出去的時(shí)候,在基于雙字節(jié)數(shù)據(jù)類型的指針尋址訪問時(shí),會(huì)出現(xiàn)被訪問數(shù)據(jù)的地址不遵循2倍數(shù)的原則,即出現(xiàn)訪問地址不對(duì)齊的問題,可能導(dǎo)致運(yùn)行出錯(cuò)。一般來講,對(duì)于ARM內(nèi)核的芯片,基于雙字節(jié)數(shù)據(jù)寬度的尋址訪問時(shí),被訪問數(shù)據(jù)的地址要求是2的倍數(shù);基于4字節(jié)數(shù)據(jù)寬度的尋址訪問時(shí),地址要求是4的倍數(shù)。

比如:這里定義了一個(gè)數(shù)組uint16_t forcomp[3]和下面兩個(gè)指針:

uint16_t *pointer1 = &forcomp[0];

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

現(xiàn)將上面結(jié)構(gòu)體成員Stream.Data[]的內(nèi)容通過指針尋址按如下方式拷貝進(jìn)?forcomp[]?。

上面的代碼如果運(yùn)行在基于M0或M0+內(nèi)核的STM32芯片的話,就會(huì)出現(xiàn)Hard Fault錯(cuò)誤. 客戶使用的芯片stm32L071VBT6正是基于M0+內(nèi)核的STM32芯片。

為什么會(huì)這樣呢?這可以從Cortex M0/M0+的內(nèi)核技術(shù)手冊(cè)上看到相關(guān)描述:

顯然,基于M0、M0+內(nèi)核的芯片,它是不支持非對(duì)齊尋址訪問的。

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

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

也就是說,基于CortexM3內(nèi)核的芯片,它支持部分指令的非對(duì)齊訪問,但非對(duì)齊訪問要慢于對(duì)齊訪問。即非對(duì)齊訪問是需要代價(jià)的,訪問效率會(huì)受到影響。所以,我們?cè)趹?yīng)用中要盡量遵循地址對(duì)齊的尋址訪問方式。關(guān)于地址對(duì)齊話題,在各個(gè)ARM內(nèi)核技術(shù)參考手冊(cè)里略有介紹。

結(jié)合本案的實(shí)際情況,碰巧用戶代碼先是可以正常運(yùn)行于基于M3內(nèi)核的STM32F1芯片,而在基于M0+內(nèi)核的芯片上出現(xiàn)了異常。導(dǎo)致他覺得不好理解。

這里,指針?biāo)笖?shù)據(jù)類型為雙字節(jié)類型,為了避免在M0/M0+內(nèi)核芯片里尋址訪問時(shí)發(fā)生非對(duì)齊而導(dǎo)致的異常,可以將結(jié)構(gòu)體變量的內(nèi)存地址對(duì)齊方式改為雙字節(jié)對(duì)齊,即使用#pragma pack (2)。數(shù)據(jù)在內(nèi)存中像下面這樣擺放。

這樣修改后,經(jīng)過測(cè)試的確沒有問題。結(jié)合到客戶的具體情況,客戶希望數(shù)據(jù)連續(xù)、緊湊存放,不希望數(shù)據(jù)間有空隙,即結(jié)構(gòu)體數(shù)據(jù)成員的內(nèi)存地址對(duì)齊規(guī)則不變,仍然采用pack(1)。那么,數(shù)據(jù)拷貝操作時(shí)可以將雙字節(jié)數(shù)據(jù)類型的指針強(qiáng)轉(zhuǎn)為單字節(jié)數(shù)據(jù)類型的指針,將雙字節(jié)數(shù)據(jù)按字節(jié)對(duì)齊尋址方式分作兩次連續(xù)讀取完成。此時(shí),用戶只需將應(yīng)用程序稍作調(diào)整即可。

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

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

    關(guān)注

    2272

    文章

    10924

    瀏覽量

    357583
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4827

    瀏覽量

    69054
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40232

原文標(biāo)題:一個(gè)跟地址對(duì)齊有關(guān)的應(yīng)用異常案例

文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MAC地址的作用范圍,MAC地址怎么申請(qǐng)?

    物理地址(PhysicalAddress),用于在網(wǎng)絡(luò)中唯標(biāo)示個(gè)網(wǎng)卡。以下是英利檢測(cè)針對(duì)其作用范圍及申請(qǐng)方式的詳細(xì)解答:MAC地址的作用
    的頭像 發(fā)表于 12-19 17:44 ?648次閱讀
    MAC<b class='flag-5'>地址</b>的作用范圍,MAC<b class='flag-5'>地址</b>怎么申請(qǐng)?

    文分清IP地址、子網(wǎng)和子網(wǎng)掩碼的關(guān)系

    大家在進(jìn)行IPv4地址配置時(shí)都看到過“子網(wǎng)掩碼”這樣的參數(shù)名,許多小伙伴都會(huì)疑惑這是個(gè)啥?有什么用呢? 下面帶領(lǐng)大家認(rèn)識(shí)認(rèn)識(shí)子網(wǎng)掩碼以及其密不可分的子網(wǎng)! 1 IP地址、子網(wǎng)和子網(wǎng)掩
    的頭像 發(fā)表于 12-07 10:20 ?1482次閱讀
    <b class='flag-5'>一</b>文分清IP<b class='flag-5'>地址</b>、子網(wǎng)和子網(wǎng)掩碼的關(guān)系

    KiCad的對(duì)齊工具不好用?

    “ ?不存在的。唯的原因是您還沒有學(xué)會(huì)怎么用。 ? ” 對(duì)齊命令在哪里? KiCad的對(duì)齊命令(Align)藏得比較隱蔽,既不在菜單欄,也不在工具欄。右鍵的菜單中默認(rèn)也不存在。只有當(dāng)您 選中兩
    的頭像 發(fā)表于 12-04 18:15 ?268次閱讀
    KiCad的<b class='flag-5'>對(duì)齊</b>工具不好用?

    I2S有左對(duì)齊,右對(duì)齊標(biāo)準(zhǔn)的I2S三種格式,那么這三種格式各有什么優(yōu)點(diǎn)呢?

    大家好,關(guān)于I2S格式,有兩個(gè)疑問請(qǐng)教下 我們知道I2S有左對(duì)齊,右對(duì)齊標(biāo)準(zhǔn)的I2S三種格式,那么這三種格式各有什么優(yōu)點(diǎn)呢? 而且對(duì)于
    發(fā)表于 10-21 08:23

    IP地址會(huì)被黑?

    IP地址會(huì)被黑?是的,你的IP地址如果不幸被惡意分子盯上,就會(huì)被惡意利用,這會(huì)引發(fā)系列明顯的異常表現(xiàn)。就像網(wǎng)絡(luò)會(huì)突然變得異常緩慢,下載速度
    的頭像 發(fā)表于 09-12 14:24 ?424次閱讀

    如何獲取MAC地址?MAC地址的三個(gè)申請(qǐng)條件

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

    IP地址與子網(wǎng)劃分

    子網(wǎng)的劃分,實(shí)際上就是設(shè)計(jì)子網(wǎng)掩碼的過程,它指的是指將個(gè)給定的IP網(wǎng)絡(luò)地址空間劃分為更小的子網(wǎng)絡(luò)。 在子網(wǎng)掩碼中用1和0來分別網(wǎng)絡(luò)號(hào)和主機(jī)號(hào),其中是1的表示是網(wǎng)絡(luò)部分,0表示的是主機(jī)部分,所有
    的頭像 發(fā)表于 09-06 09:46 ?421次閱讀

    文帶你了解IP地址別名

    、什么是IP地址別名 IP地址別名是將多個(gè)IP地址個(gè)網(wǎng)絡(luò)接口關(guān)聯(lián)起來的
    的頭像 發(fā)表于 09-05 14:11 ?279次閱讀

    DHCP服務(wù)異常與IP地址管理挑戰(zhàn)

    DHCP是種計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議,主要用于自動(dòng)分配IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)、DNS等網(wǎng)絡(luò)參數(shù)給客戶端設(shè)備。它是局域網(wǎng)中實(shí)現(xiàn)自動(dòng)IP地址分配的重要協(xié)議,極大地簡(jiǎn)化了網(wǎng)絡(luò)管理員對(duì)IP地址的管理
    的頭像 發(fā)表于 08-30 14:35 ?1287次閱讀

    谷景科普電感的感值什么有關(guān)

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

    IP地址與網(wǎng)絡(luò)監(jiān)控

    如何識(shí)別和應(yīng)對(duì)異常流量和可疑活動(dòng)。 IP地址與網(wǎng)絡(luò)監(jiān)控的基礎(chǔ) IP地址是互聯(lián)網(wǎng)中設(shè)備的唯標(biāo)識(shí)符,它在網(wǎng)絡(luò)通信中起著至關(guān)重要的作用。通過監(jiān)控IP地址
    的頭像 發(fā)表于 07-09 16:41 ?502次閱讀

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

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

    求助,關(guān)于STM32H7的Cache無效化操作32字節(jié)對(duì)齊問題求解

    core_cm7.h更新到5.1.1版本后,發(fā)現(xiàn)該函數(shù)對(duì)dsize做了32字節(jié)對(duì)齊,但是op_addr地址32字節(jié)對(duì)齊卻注釋掉了?,圖片的這句話是不是說SCB-&gt
    發(fā)表于 03-29 06:51

    STM32關(guān)于FLASH的編程對(duì)齊錯(cuò)誤標(biāo)志位(PGAERR)的疑問求解

    大神們,我現(xiàn)在正在做一個(gè)應(yīng)用,需要熟悉STM32F4的FLASH的任何錯(cuò)誤標(biāo)識(shí),以用于特殊情況下的錯(cuò)誤標(biāo)識(shí)判斷做相應(yīng)處理,但是針對(duì)FLASH的編程對(duì)齊錯(cuò)誤標(biāo)志(PGAERR)與我理解不同。 原文
    發(fā)表于 03-22 07:59

    TC277如何指定該全局?jǐn)?shù)組變量的存儲(chǔ)地址對(duì)齊方式?

    定義全局?jǐn)?shù)組變量,如何指定該全局?jǐn)?shù)組變量的存儲(chǔ)地址對(duì)齊方式
    發(fā)表于 02-19 07:37
    百家乐官网桌布呢布| 威尼斯人娱乐平台赌| 百家乐下注所有组合| 百家乐官网网址| 赌百家乐的体会| 足球百家乐投注| 网上的百家乐是真是假| 百家乐强弱走势图| 金三角百家乐的玩法技巧和规则| 致胜百家乐软件| 百家乐b28博你发v| 大发888娱乐场存款168| 大发888客户端软件| 德州扑克与梭哈| 88娱乐城2| 百家乐官网试玩活动| 网上百家乐官网真的假的| 好用百家乐官网软件| 正品百家乐官网游戏| 百家乐官网小钱赢钱| 加州百家乐官网的玩法技巧和规则| 百家乐如何计算| 百家乐园云鼎娱乐平台| 钱大发888扑克| 通海县| 真人百家乐官网导航| 362百家乐官网的玩法技巧和规则| 免费百家乐娱乐城| 百家乐官网翻天| 功夫百家乐的玩法技巧和规则 | 无锡百家乐官网的玩法技巧和规则| 百家乐园千术大全| 威尼斯人娱乐城备用网址| 牌九娱乐城| 打百家乐官网最好办法| 百家乐娱乐城怎么样| 百家乐桌子黑色| 大发888登录| 奔驰百家乐官网可信吗| 百家乐官网操作技巧| 全讯网社区|