日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

茶話MCU ? 來(lái)源: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】,覺(jué)得不可理解。

它定義了類似下面的數(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ù)類型的指針尋址訪問(wèn)時(shí),會(huì)出現(xiàn)被訪問(wèn)數(shù)據(jù)的地址不遵循2倍數(shù)的原則,即出現(xiàn)訪問(wèn)地址不對(duì)齊的問(wèn)題,可能導(dǎo)致運(yùn)行出錯(cuò)。一般來(lái)講,對(duì)于ARM內(nèi)核的芯片,基于雙字節(jié)數(shù)據(jù)寬度的尋址訪問(wèn)時(shí),被訪問(wèn)數(shù)據(jù)的地址要求是2的倍數(shù);基于4字節(jié)數(shù)據(jù)寬度的尋址訪問(wèn)時(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)容通過(guò)指針尋址按如下方式拷貝進(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ì)齊尋址訪問(wèn)的。

客戶又說(shuō)過(guò),相同代碼在STM32F1芯片上運(yùn)行又沒(méi)有問(wèn)題,那怎么解釋呢?

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

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

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

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

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

聲明:本文內(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)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2313

    文章

    11195

    瀏覽量

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

    關(guān)注

    30

    文章

    4977

    瀏覽量

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

    關(guān)注

    3

    文章

    573

    瀏覽量

    41691

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    組態(tài)屏變量地址映射 / 數(shù)據(jù)類型不匹配解決方法

    在工業(yè)自動(dòng)化領(lǐng)域,組態(tài)屏作為人機(jī)交互的核心設(shè)備,其與控制器(如PLC、單片機(jī))之間的數(shù)據(jù)交換依賴于準(zhǔn)確的變量地址映射與數(shù)據(jù)類型匹配。然而,實(shí)際工程中,因地址規(guī)劃混亂或數(shù)據(jù)類型不致導(dǎo)致的顯示
    的頭像 發(fā)表于 04-22 10:41 ?181次閱讀
    組態(tài)屏變量<b class='flag-5'>地址</b>映射 / 數(shù)據(jù)類型不匹配解決方法

    科普|什么是MAC地址、MAC碼、OUI碼、藍(lán)牙串號(hào)

    (EthernetAddress)或物理地址(PhysicalAddress),它是個(gè)用來(lái)確認(rèn)網(wǎng)上設(shè)備位置的地址。在OSI模型中,第三層網(wǎng)絡(luò)層負(fù)責(zé)IP
    的頭像 發(fā)表于 04-16 11:07 ?303次閱讀
    科普|什么是MAC<b class='flag-5'>地址</b>、MAC碼、OUI碼、藍(lán)牙串號(hào)

    伺服電機(jī)正余弦編碼器的相位對(duì)齊方式

    對(duì)齊方式主要可以分為兩大類:需要物理調(diào)整的 硬件對(duì)齊 ,和依賴軟件算法的 軟件對(duì)齊 。 方法:物理調(diào)整的硬件對(duì)齊 這是傳統(tǒng)的、通過(guò)調(diào)整編
    的頭像 發(fā)表于 03-20 15:36 ?238次閱讀
    伺服電機(jī)正余弦編碼器的相位<b class='flag-5'>對(duì)齊</b>方式

    科技云報(bào)到:兩會(huì)“中場(chǎng)時(shí)刻”:從技術(shù)突破到制度對(duì)齊

    科技云報(bào)到:兩會(huì)“中場(chǎng)時(shí)刻”:從技術(shù)突破到制度對(duì)齊
    的頭像 發(fā)表于 03-06 19:01 ?975次閱讀

    對(duì) M7 內(nèi)核上的 memcpy 速度的個(gè)疑問(wèn)求解

    些調(diào)試器延遲,但這仍然感覺(jué)異常長(zhǎng)。 這種不可緩存內(nèi)存的 memcpy 速度是 M7 內(nèi)核上典型的嗎? 目前不使用 DMA,地址和數(shù)據(jù)大小為 8 字節(jié)對(duì)齊。
    發(fā)表于 03-02 06:14

    Cortex-M3工作模式及異常

    向量。這些地址對(duì)應(yīng)的區(qū)域可以是代碼區(qū),但更多是在 RAM 區(qū)。在 RAM 區(qū)就可以修改向量的入口地址了。為了實(shí)現(xiàn)這個(gè)功能, NVIC中有個(gè)寄存器,稱為“向量表偏移量寄存器”(在
    發(fā)表于 01-20 08:24

    LAT1185+個(gè)地址對(duì)齊引起的 HardFault 異常應(yīng)用筆記

    ,則程序運(yùn)行正常。表面上看,這似乎是 KEIL MDK 的問(wèn)題,通過(guò)分析,導(dǎo)致這個(gè)問(wèn)題的本質(zhì)原因是內(nèi)存地址沒(méi)有對(duì)齊引起的,下面章節(jié)將詳細(xì)分析該問(wèn)題的來(lái)龍去脈以及解決方法。
    發(fā)表于 01-11 17:28 ?0次下載

    開(kāi)關(guān)電源 變壓器初級(jí)電流異常

    直流開(kāi)關(guān)電源,單相全橋逆變,硬開(kāi)關(guān)電路 變壓器初級(jí)電流異常突變 開(kāi)始使用EE磁芯沒(méi)有問(wèn)題,后來(lái)?yè)Q成環(huán)形磁芯就發(fā)現(xiàn)初級(jí)電流異常了,且功率大小沒(méi)有關(guān)
    發(fā)表于 12-20 16:57

    CW32操作FLASH地址對(duì)齊的要求

    地址邊界對(duì)齊,即使用 16bit 位寬訪問(wèn) FLASH 時(shí)的地址必須是偶地址,使用 32bit 位寬時(shí)的地址必須是 4 的倍數(shù)
    發(fā)表于 12-15 06:30

    摩爾線程新代大語(yǔ)言模型對(duì)齊框架URPO入選AAAI 2026

    近日,摩爾線程在人工智能前沿領(lǐng)域取得重要突破,其提出的新代大語(yǔ)言模型對(duì)齊框架——URPO統(tǒng)獎(jiǎng)勵(lì)與策略優(yōu)化,相關(guān)研究論文已被人工智能領(lǐng)域的國(guó)際頂級(jí)學(xué)術(shù)會(huì)議AAAI 2026收錄。這
    的頭像 發(fā)表于 11-17 16:03 ?617次閱讀
    摩爾線程新<b class='flag-5'>一</b>代大語(yǔ)言模型<b class='flag-5'>對(duì)齊</b>框架URPO入選AAAI 2026

    Hardfult對(duì)齊異常怎么解決?

    1.使用O3編譯,正常運(yùn)行。 2.使用OZ編譯,報(bào)UNALIGNED異常。 3.全局使用Oz編譯,對(duì)ipc.c文件單獨(dú)O3編譯,正常運(yùn)行。 00> msh >psr
    發(fā)表于 10-13 07:45

    連得上熱點(diǎn),但是ping baidu.com出現(xiàn)timeout,請(qǐng)問(wèn)什么有關(guān)?

    連得上熱點(diǎn),但是ping baidu.com出現(xiàn)了timeout, ping其他ip也是timeout,timeout什么有關(guān)系,需要怎么操作
    發(fā)表于 09-17 08:19

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

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

    CYPD5235的CC Pin功能異常,還可能會(huì)什么有關(guān)

    /VSYS/VDDD/V5V_P1的電都是正常的。 請(qǐng)教問(wèn)題: 1。CYPD5235的CC Pin功能異常,還可能會(huì)什么有關(guān)? 2。去掉的MP8859,會(huì)影響CYPD5235的軟件代碼執(zhí)行嗎?如果會(huì)
    發(fā)表于 05-30 07:04

    Allegro Skill布局功能--器件絲印過(guò)孔對(duì)齊介紹與演示

    Allegro系統(tǒng)雖然提供了基本的元件對(duì)齊功能,但其適用范圍較為有限。相比之下,F(xiàn)anyskill 的“對(duì)齊”命令在操作體驗(yàn)和功能性上更具優(yōu)勢(shì):其界面設(shè)計(jì)更加直觀易用,并支持多種元素的對(duì)齊操作,包括
    發(fā)表于 05-14 08:59 ?4488次閱讀
    Allegro Skill布局功能--器件絲印過(guò)孔<b class='flag-5'>對(duì)齊</b>介紹與演示
    酉阳| 元谋县| 都江堰市| 湘潭县| 融水| 潼南县| 公安县| 威海市| 太和县| 鄯善县| 扶沟县| 松原市| 公安县| 万荣县| 崇仁县| 琼结县| 海林市| 澎湖县| 灵山县| 西贡区| 兴隆县| 新邵县| 肥乡县| 渑池县| 无棣县| 武宣县| 抚州市| 滨州市| 舟山市| 舒兰市| 大竹县| 长宁县| 新宁县| 万盛区| 滕州市| 湄潭县| 香格里拉县| 奉节县| 响水县| 汕头市| 辽中县|