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

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

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

基于DWC_ether_qos的以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP的堆(內(nèi)存池)未對(duì)齊導(dǎo)致問(wèn)題的案例分享

嵌入式USB開發(fā) ? 來(lái)源:嵌入式Lee ? 作者:嵌入式Lee ? 2023-09-09 08:44 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注

https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog

一.前言

內(nèi)存未對(duì)齊訪問(wèn)問(wèn)題這個(gè)已經(jīng)是老生常談的問(wèn)題了, 由于LWIP的堆管理中也用到了地址(指針)強(qiáng)制轉(zhuǎn)換所以也會(huì)遇到這個(gè)問(wèn)題。對(duì)于老手比較容易發(fā)現(xiàn),對(duì)于新手可能會(huì)比較疑惑。所以也單獨(dú)分享一個(gè)案例吧,權(quán)當(dāng)一個(gè)小的check list的case。

二.問(wèn)題

Lwipopts.h中MEM_ALIGNMENT可以配置堆對(duì)齊大小,有問(wèn)題時(shí)是配置為1

#define MEM_ALIGNMENT 1U

異常時(shí)打印寄存器如下,當(dāng)然不同平臺(tái)異常時(shí)如何獲取上下文信息方式不一樣,不在本文討論范圍內(nèi),我這里是RISC-V環(huán)境。

wKgZomT8eX6AMEQ-AABzY0VnW3o925.png

看到打印的mepc是0x20006C88,異常原因是地址未對(duì)齊。

所以是在運(yùn)行0x20006C88時(shí)進(jìn)入了異常,當(dāng)然這個(gè)地方不一定是原始問(wèn)題所在點(diǎn),異??赡苁桥芰撕芫貌懦霈F(xiàn)的。

所以先在這里打個(gè)斷點(diǎn)試試

wKgaomT8eX6AUD_8AABEZWWlkqQ976.png

可以看到是pbuf.c的代碼中,所以可以懷疑是內(nèi)存池或者堆的問(wèn)題。

我們運(yùn)行發(fā)現(xiàn)斷點(diǎn)并不能觸發(fā),之前就已經(jīng)異常了,所以只能跟代碼逐漸縮小范圍確認(rèn)問(wèn)題的。一般采用的方式是,逐步斷點(diǎn)或者打印或者刪除代碼,逐步縮小范圍的方法。

可以借鑒一些二分的思想,加快定位。

這里還是從pbuf開始,先找到相關(guān)代碼上層函數(shù)處,斷點(diǎn)

b pbuf_init_alloced_pbuf

wKgZomT8eX-AdmboAADlv8kiXEA056.png

看到異常前是可以停下來(lái)的

看到此時(shí)p的值是0x28201406

wKgaomT8eX-AR_T0AABTVvjvaR8580.png

查看如下匯編代碼可知

sw zero,0(a0)即對(duì)應(yīng)代碼p->next = NULL;

sw是word操作指令,但是地址a0不是word對(duì)齊,所以會(huì)產(chǎn)生異常

wKgZomT8eX-ASom5AAFE3W3Yn_w817.png

再si單步確實(shí)進(jìn)入異常

wKgaomT8eYCADzT-AAEK7I1mMTY531.png

所以問(wèn)題確認(rèn)了。

因?yàn)槎咽欠峙涞囊粔K區(qū)域,每一塊區(qū)域的開始地址對(duì)齊值就是上面設(shè)置的對(duì)齊大小,分配區(qū)塊后作為其他模塊使用,比如pbuf使用,前面部分作為管理結(jié)構(gòu)體

struct pbuf 操作,所以實(shí)際是將一個(gè)區(qū)塊地址強(qiáng)制轉(zhuǎn)為了結(jié)構(gòu)體指針。

此時(shí)訪問(wèn)結(jié)構(gòu)體成員,編譯器是自動(dòng)按照自然對(duì)齊生成匯編指令的,因?yàn)榫幾g器并不知道你的對(duì)齊要求,所以如果系統(tǒng)不支持對(duì)應(yīng)的指令非對(duì)其訪問(wèn)就有問(wèn)題,但是有些系統(tǒng)對(duì)應(yīng)的匯編指令的行為支持不對(duì)齊訪問(wèn)那么就沒(méi)有問(wèn)題。

當(dāng)然出于可靠性設(shè)計(jì),建議不要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,比如MISRA標(biāo)準(zhǔn)里的規(guī)范就是如此。

如果代碼要做到兼容性可靠性非常好就要注意這個(gè)問(wèn)題,此時(shí)不能使用強(qiáng)制類型轉(zhuǎn)換,而是使用字節(jié)序手動(dòng)拼接得到成員的值。

但是出于靈活性考慮,很多協(xié)議棧的設(shè)計(jì)都是直接使用強(qiáng)制類型轉(zhuǎn)換的,所以這時(shí)用戶就需要注意,比如這里我們可以配置#define MEM_ALIGNMENT 4U

來(lái)保證上述分配出來(lái)的地址p是4字節(jié)對(duì)齊的,所以按照偏移,其成員也是4字節(jié)對(duì)齊的,sw指令操作的就是4字節(jié)對(duì)齊的成員,就不會(huì)有問(wèn)題。

三.總結(jié)

以上分享一個(gè)簡(jiǎn)單的案例,目的是提醒下要注意類似問(wèn)題,尤其有指針強(qiáng)制類型轉(zhuǎn)換的要注意對(duì)齊問(wèn)題。問(wèn)題不難,也不復(fù)雜,但是可以作為check list的case可以作為檢查項(xiàng)目。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5424

    瀏覽量

    171701
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    86

    瀏覽量

    27168
  • 驅(qū)動(dòng)開發(fā)

    關(guān)注

    0

    文章

    130

    瀏覽量

    12077
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-MAC幀格式介紹

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-MAC幀格式介紹 (qq.com) 一.前言 ? 在以太網(wǎng)
    的頭像 發(fā)表于 08-30 09:23 ?2381次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-MAC幀格式介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-MDIO驅(qū)動(dòng)編寫與測(cè)試

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-MDIO驅(qū)動(dòng)編寫與測(cè)試 一.前言
    的頭像 發(fā)表于 08-30 09:37 ?3766次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-MDIO<b class='flag-5'>驅(qū)動(dòng)</b>編寫與測(cè)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-描述符鏈表介紹

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 一.描述符概述 1.0 前言 對(duì)于DWC Ethernet QoS驅(qū)動(dòng)的編寫來(lái)說(shuō),初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list
    的頭像 發(fā)表于 08-30 09:39 ?4534次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-描述符鏈表介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-數(shù)據(jù)流驗(yàn)證過(guò)程

    轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-數(shù)據(jù)流驗(yàn)證過(guò)程
    的頭像 發(fā)表于 08-31 08:41 ?2053次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-數(shù)據(jù)流驗(yàn)證過(guò)程

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-收發(fā)驅(qū)動(dòng)編寫與調(diào)試

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-收發(fā)驅(qū)動(dòng)編寫與調(diào)試 (qq.com) https://mp.wei
    的頭像 發(fā)表于 09-05 08:47 ?2342次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-收發(fā)<b class='flag-5'>驅(qū)動(dòng)</b>編寫與調(diào)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-無(wú)OS環(huán)境移植LWIP

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-無(wú)OS環(huán)境移植LWIP (qq.com) https://mp.we
    的頭像 發(fā)表于 09-06 08:40 ?1613次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-無(wú)OS環(huán)境移植<b class='flag-5'>LWIP</b>

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP內(nèi)存介紹

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 https://mp.weixin.qq.com/s/mBoGSf_u9edFF01U_OZT9g 一.前言 lwIP為基礎(chǔ)結(jié)構(gòu)提供了專用的內(nèi)存管理,比如netconn
    的頭像 發(fā)表于 09-07 08:45 ?1745次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>LWIP</b>的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>池</b>介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP管理介紹

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP管理介紹 (
    的頭像 發(fā)表于 09-08 08:40 ?1318次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>LWIP</b>的<b class='flag-5'>堆</b>管理介紹

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-RTOS環(huán)境移植LWIP與性能測(cè)試

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-RTOS環(huán)境移植LWIP與性能測(cè)試 (qq.com) https:
    的頭像 發(fā)表于 09-11 11:20 ?2129次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-RTOS環(huán)境移植<b class='flag-5'>LWIP</b>與性能測(cè)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP在PC上進(jìn)行開發(fā)調(diào)試

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP在PC上進(jìn)行開發(fā)
    的頭像 發(fā)表于 09-11 08:40 ?2040次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>LWIP</b>在PC上進(jìn)行<b class='flag-5'>開發(fā)</b>調(diào)試

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP的定時(shí)器模塊詳解

    一. 前言 LWIP的定時(shí)器模塊,實(shí)現(xiàn)了通用的軟件定時(shí)器,用于內(nèi)部的周期事件處理,比如arp,tcp的超時(shí)等,用戶也可以使用。這一篇來(lái)分析該模塊的實(shí)現(xiàn)。 二.代碼分析 2.1源碼 源碼
    的頭像 發(fā)表于 09-18 09:33 ?1680次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>LWIP</b>的定時(shí)器模塊詳解

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-LWIP的ARP模塊介紹

    TCP/IP通訊第一步需要先調(diào)通ARP,否則TCP/IP包都不知道MAC地址要發(fā)給誰(shuí)。這一篇來(lái)基于LWIP的ARP實(shí)現(xiàn)進(jìn)行相關(guān)的分析。
    的頭像 發(fā)表于 09-18 09:34 ?1915次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>LWIP</b>的ARP模塊介紹

    以太網(wǎng)Lwip例程

    以太網(wǎng)Lwip例程
    發(fā)表于 12-06 16:53 ?28次下載
    <b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>Lwip</b>例程

    設(shè)計(jì)軟件核心以太網(wǎng)服務(wù)質(zhì)量數(shù)據(jù)手冊(cè)免費(fèi)下載

    本文描述Synopsys設(shè)計(jì)軟件核心以太網(wǎng)服務(wù)質(zhì)量DWC以太網(wǎng)QoS核心5.10A。DWC以太網(wǎng)
    發(fā)表于 10-23 08:00 ?16次下載
    設(shè)計(jì)軟件核心<b class='flag-5'>以太網(wǎng)</b>服務(wù)質(zhì)量數(shù)據(jù)手冊(cè)免費(fèi)下載

    基于DWC_ether_qos以太網(wǎng)驅(qū)動(dòng)開發(fā)-包過(guò)濾

    以太網(wǎng)上數(shù)據(jù)非常多,如果所有數(shù)據(jù)都接收交給軟件去處理軟件負(fù)載會(huì)非常重,所以一般只需要接收發(fā)給自己的數(shù)據(jù)即可
    的頭像 發(fā)表于 09-02 09:19 ?1790次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-包過(guò)濾