色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    5419

    瀏覽量

    171594
收藏 人收藏

    評論

    相關推薦

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

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-MAC幀格式介紹 (qq.com) 一.前言 ? 在
    的頭像 發表于 08-30 09:23 ?2360次閱讀
    基于<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 ?3736次閱讀
    基于<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 ?4496次閱讀
    基于<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 ?2008次閱讀
    基于<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 ?2319次閱讀
    基于<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 ?1588次閱讀
    基于<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 ?1718次閱讀
    基于<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(內存池)未對齊導致問題的案例分享

    管理中也用到了地址(指針)強制轉換所以也會遇到這個問題。對于老手比較容易發現,對于新手可能會比較疑惑。所以也單獨分享一個案例吧,權當一個小的check list的case。 二
    的頭像 發表于 09-09 08:44 ?1718次閱讀
    基于<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以太網驅動開發-RTOS環境移植LWIP與性能測試

    本文轉自公眾號,歡迎關注 基于DWC_ether_qos以太網驅動開發-RTOS環境移植LWIP與性能測試 (qq.com) https:
    的頭像 發表于 09-11 11:20 ?2086次閱讀
    基于<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 ?1997次閱讀
    基于<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 ?1658次閱讀
    基于<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 ?1887次閱讀
    基于<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>

    以太網Lwip例程

    以太網Lwip例程
    發表于 12-06 16:53 ?26次下載
    <b class='flag-5'>以太網</b><b class='flag-5'>Lwip</b>例程

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

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

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

    以太網上數據非常多,如果所有數據都接收交給軟件去處理軟件負載會非常重,所以一般只需要接收發給自己的數據即可
    的頭像 發表于 09-02 09:19 ?1745次閱讀
    基于<b class='flag-5'>DWC_ether_qos</b>的<b class='flag-5'>以太網</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-包過濾
    主站蜘蛛池模板: 午夜伦理在线观看| 国产白浆视频在线播放| 甜涩性爱下载| 两个女人互添下身高潮自视频| 出租屋交换人妻 全文| 亚洲人交性视频| 日产精品久久久久久久蜜殿| 久久成人免费大片| 国产成A人片在线观看| 最近更新2019中文字幕免费| 无遮挡午夜男女XX00动态| 哪里能看毛片| 红杏俱乐部| 国产精品伦一区二区三级视频 | 中文字幕无码乱人伦蜜桃| 少妇内射视频播放舔大片| 奶大B紧17p| 久久视热频国产这里只有精品23| 国产精品久久久久久52AVAV| a视频免费在线| 在教室伦流澡到高潮H女攻视频| 性吧 校园春色| 天天看学生视频| 日本另类xxxx| 欧美xxxx83d| 狼群资源网中文字幕| 黃色带三级a级| 国内精品欧美久久精品| 国产精品永久免费| 高潮久久久久久久久不卡| xxxx18动漫| jaPanesmature儿母| 91九色网址| 18videosex性欧美黑色| 亚洲中久无码永久在线| 亚洲视频欧美视频| 亚洲精品久久久久AV无码林星阑| 双腿打开揉弄高潮H苏安安秦慕深 双腿被绑成M型调教PLAY照片 | 高挑人妻无奈张开腿| Y8848高清私人影院软件优势| 97色伦图片97色伦图影院久久|