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

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

3天內不再提示

基于DWC_ether_qos的以太網驅動開發-LWIP的堆管理介紹

嵌入式USB開發 ? 來源:嵌入式Lee ? 作者:嵌入式Lee ? 2023-09-08 08:40 ? 次閱讀

本文轉自公眾號歡迎關注

基于DWC_ether_qos的以太網驅動開發-LWIP的堆管理介紹 (qq.com)

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

一.前言

堆管理是重點的基礎代碼,需要重點關注,移植時也需要關注。所以這一篇就來講講LWIP的堆管理。

二.LWIP的堆管理實現

LWIP實現了內部的堆管理,這樣無OS等環境也可以直接移植使用,不依賴系統的堆管理。

當然也可以配置為使用系統的堆管理。

源碼位于mem.c,mem.h

如果使能MEM_LIBC_MALLOC則使用系統的堆管理接口

需要配置以下宏

mem_clib_free

mem_clib_malloc

mem_clib_calloc

默認是

/* in case C library malloc() needs extra protection,

如果使能MEM_USE_POOLS則使用內存池實現,這個上一篇已經講解了。

否則使用mem.c的實現,我們重點關注這一部分。

三.堆的存儲分配

如果沒有定義LWIP_RAM_HEAP_POINTER則

mem.c中定義一個大數組LWIP_DECLARE_MEMORY_ALIGNED

大小是MEM_SIZE_ALIGNED + (2U * SIZEOF_STRUCT_MEM)

用戶可用空間是#define MEM_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SIZE)

即用戶定義的MEM_SIZE,默認值是1600

/**

這里多分配了2U * SIZEOF_STRUCT_MEM是一方面多一個ram_end標記末尾,作為末尾的邊界節點,一方面預留對齊的浪費空間。

用戶也可以直接定義宏LWIP_RAM_HEAP_POINTER指定存儲的位置。

個人覺得這里LWIP_RAM_HEAP_POINTER靜態指定,改為指針變量,初始化變量值為LWIP_RAM_HEAP_POINTER,然后也可以通過接口設定會更好。這樣用戶可以根據實際情況動態分配出這部分存儲來,否則靜態分配,程序不運行也要占用空間比較浪費。

LWIP_DECLARE_MEMORY_ALIGNED

實現如下

/** If you want to relocate the heap to external memory, simply define

四.源碼分析

4.1數據結構

核心數據結構如下struct mem

/**

* The heap is made up as a list of structs of this type.

* This does not have to be aligned since for getting its size,

* we only use the macro SIZEOF_STRUCT_MEM, which automatically aligns.

*/

struct mem {

/** index (-> ram[next]) of the next struct */

mem_size_t next;

/** index (-> ram[prev]) of the previous struct */

mem_size_t prev;

/** 1: this area is used; 0: this area is unused */

u8_t used;

#if MEM_OVERFLOW_CHECK

/** this keeps track of the user allocation size for guard checks */

mem_size_t user_size;

#endif

};

一個雙向鏈表來實現,該結構體描述某一個區塊,used表示當前區塊是否使用。

Next和prev分別指向前后區塊,用于入鏈表和出鏈表操作。

這里為什么沒有描述本區塊大小的字段呢?

因為可以直接從next減去當前區塊的基地址得到,所以不需要額外的大小信息了。

比如當前區塊基地址是ptr則當前區塊可用于分配的有效空間如下計算

(mem->next - (ptr + SIZEOF_STRUCT_MEM))

即后一個區塊的開始的地址-本區塊開始地址-信息頭。

這個實現其實和uCOS的堆管理實現差不多。

4.2接口

mem_init

初始化時,初始全局變量ram即對齊后的存儲空間,

lfree指向空閑塊的開頭,初始化時為ram,

lfree始終用于指向未分配的區塊。

此時只有一個整的未分配的區塊,next指向MEM_SIZE后,

MEM_SIZE外ram_end用于標記結束,這也是之前存儲多分配的原因。

wKgaomT6e8mAOc3CAABfv0oF-p8552.png

mem_malloc/mem_calloc

分配算法核心思想如下,

從lfree開始查找空閑空間大于等于需求size的塊。

如果找到了就分配它。

這里有一個處理,如果本塊比較大,則分配了size后還有剩余,所以要拆分,即分配出size后剩余的部分成為空閑塊。

這個到底多大要拆分,標準是大于等于(size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)拆分,即可用空間是MIN_SIZE_ALIGNED才拆分。

分配完后,如果分配出的塊剛好是lfree位置,則要更新lfree指向后續空閑塊。

因為lfree始終是指向的空閑塊,即lfree鏈接起來的都是空閑塊。分配出的塊就從lfree中去掉了。

比如分配黃色空間后如下

wKgZomT6e8mADuLYAABqy7Qyj1Y058.png

注意返回的是結構體之后的可用空間部分。

mem_free

區塊鏈接到lfree空閑塊中去,如果該塊前后為空閑則和前后拼接成大的空閑塊。

mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET));

先偏移結構到塊頭。

如果mem小于lfree則要更新lfree為mem。

核心處理是plug_holes,判斷mem前后是否空閑,如果是空閑則和前后合并。

mem_trim

縮小

如果本塊縮小后剩余的空間不夠SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED,則沒有必要縮小,不處理。

如果縮小后剩余空間大于上述大小則看next是否空閑如果是則和next合并,否則單獨獨立出來一個空閑塊。

五.總結

LWIP實現了小型的堆管理,這樣無OS也可以直接移植使用,另外也可以配置為實用內存池和系統實現,比較靈活。

審核編輯 黃宇

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

    關注

    40

    文章

    5145

    瀏覽量

    167025
收藏 人收藏

    評論

    相關推薦

    基于DWC_ether_qos以太網驅動開發-MAC幀格式介紹

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-MAC幀格式介紹 (qq.com) 一.前言 ? 在
    的頭像 發表于 08-30 09:23 ?1417次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-MAC幀格式<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網驅動開發-MDIO驅動編寫與測試

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-MDIO驅動編寫與測試 一.前言
    的頭像 發表于 08-30 09:37 ?2668次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-MDIO<b class='flag-5'>驅動</b>編寫與測試

    基于DWC_ether_qos以太網驅動開發-描述符鏈表介紹

    本文轉自公眾號歡迎關注 一.描述符概述 1.0 前言 對于DWC Ethernet QoS驅動的編寫來說,初始化完成之后,核心操作就是DMA的描述符鏈表配置(linked list
    的頭像 發表于 08-30 09:39 ?3113次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-描述符鏈表<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網驅動開發-數據流驗證過程

    轉自公眾號歡迎關注 https://mp.weixin.qq.com/s/klrHhaLMM_0W3FGVwHXFkA 基于DWC_ether_qos以太網驅動開發-數據流驗證過程
    的頭像 發表于 08-31 08:41 ?1313次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-數據流驗證過程

    基于DWC_ether_qos以太網驅動開發-收發驅動編寫與調試

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-收發驅動編寫與調試 (qq.com) https://mp.wei
    的頭像 發表于 09-05 08:47 ?1557次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-收發<b class='flag-5'>驅動</b>編寫與調試

    基于DWC_ether_qos以太網驅動開發-無OS環境移植LWIP

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-無OS環境移植LWIP (qq.com) https://mp.we
    的頭像 發表于 09-06 08:40 ?970次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-無OS環境移植<b class='flag-5'>LWIP</b>

    基于DWC_ether_qos以太網驅動開發-LWIP的內存池介紹

    本文轉自公眾號,歡迎關注 https://mp.weixin.qq.com/s/mBoGSf_u9edFF01U_OZT9g 一.前言 lwIP為基礎結構提供了專用的內存池管理,比如netconn
    的頭像 發表于 09-07 08:45 ?1005次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>的內存池<b class='flag-5'>介紹</b>

    基于DWC_ether_qos以太網驅動開發-LWIP的堆(內存池)未對齊導致問題的案例分享

    本文轉自公眾號歡迎關注 https://mp.weixin.qq.com/s/ErIa2ss2YZLGYbSwoJEzog 一.?前言 內存未對齊訪問問題這個已經是老生常談的問題了, 由于LWIP
    的頭像 發表于 09-09 08:44 ?1305次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>的堆(內存池)未對齊導致問題的案例分享

    基于DWC_ether_qos以太網驅動開發-RTOS環境移植LWIP與性能測試

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-RTOS環境移植LWIP與性能測試 (qq.com) https:
    的頭像 發表于 09-11 11:20 ?1312次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-RTOS環境移植<b class='flag-5'>LWIP</b>與性能測試

    基于DWC_ether_qos以太網驅動開發-LWIP在PC上進行開發調試

    本文轉自公眾號歡迎關注 基于DWC_ether_qos以太網驅動開發-LWIP在PC上進行開發
    的頭像 發表于 09-11 08:40 ?1360次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>在PC上進行<b class='flag-5'>開發</b>調試

    基于DWC_ether_qos以太網驅動開發-LWIP的定時器模塊詳解

    一. 前言 LWIP的定時器模塊,實現了通用的軟件定時器,用于內部的周期事件處理,比如arp,tcp的超時等,用戶也可以使用。這一篇來分析該模塊的實現。 二.代碼分析 2.1源碼 源碼
    的頭像 發表于 09-18 09:33 ?1033次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>的定時器模塊詳解

    基于DWC_ether_qos以太網驅動開發-LWIP的ARP模塊介紹

    TCP/IP通訊第一步需要先調通ARP,否則TCP/IP包都不知道MAC地址要發給誰。這一篇來基于LWIP的ARP實現進行相關的分析。
    的頭像 發表于 09-18 09:34 ?1204次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>LWIP</b>的ARP模塊<b class='flag-5'>介紹</b>

    設計軟件核心以太網服務質量數據手冊免費下載

    本文描述Synopsys設計軟件核心以太網服務質量DWC以太網QoS核心5.10A。DWC以太網
    發表于 10-23 08:00 ?15次下載
    設計軟件核心<b class='flag-5'>以太網</b>服務質量數據手冊免費下載

    基于DWC_ether_qos以太網驅動開發-包過濾

    以太網上數據非常多,如果所有數據都接收交給軟件去處理軟件負載會非常重,所以一般只需要接收發給自己的數據即可
    的頭像 發表于 09-02 09:19 ?1014次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-包過濾

    基于DWC_ether_qos以太網驅動開發-軟復位介紹與問題案例

    一般模塊都會有軟復位的功能,軟復位在驅動編寫中很重要。一般初始化時執行軟復位使得模塊進入確定的初始狀態以提高可靠性,異常時也可以重新初始化來恢復,所以軟復位在驅動中一般是必須要做的動作。
    的頭像 發表于 09-02 09:17 ?999次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-軟復位<b class='flag-5'>介紹</b>與問題案例
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>