91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

Buddy算法的μC/OSII高可靠內存管理方案

電子設計 ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-08-29 09:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 內存管理概述

內存管理是操作系統(tǒng)中心任務之一,其主要任務是組織內存以容納內核和待執(zhí)行程序,跟蹤當前內存的使用情況,在需要時為進程分配內存,使用完畢后釋放并回收內存。目前嵌入式系統(tǒng)中常用的內存管理策略主要有兩種--靜態(tài)內存分配和動態(tài)內存分配。

靜態(tài)內存分配: 編譯或鏈接時將所需內存分配好,程序運行起來后所分配的內存不釋放。對于實時性和可靠性要求極高的系統(tǒng),不允許延遲或者分配失效,必須采用靜態(tài)內存分配的方式。

動態(tài)內存分配: 根據(jù)程序執(zhí)行過程中所需內存的大小而動態(tài)分配內存的策略。此方案按需分配內存,避免了靜態(tài)分配中的內存浪費,靈活性比較強,給程序的實現(xiàn)帶來了很大方便。缺點是容易造成內存碎片,且容易造成程序響應不及時等問題。

綜上所述,靜態(tài)內存分配和動態(tài)內存分配各有優(yōu)點,出于嵌入式系統(tǒng)可靠性、實時性及成本、功耗的考慮,如何在兩種方案中作出平衡的選擇是令嵌入式操作系統(tǒng)設計者頭疼的事。一般的嵌入式操作系統(tǒng)都是兩種方案的高效結合,μC/OSII也不例外。除此之外,嵌入式操作系統(tǒng)對內存的分配還有以下幾點要求:

① 可靠性。內存分配的請求必須得到滿足,如果分配失敗可能會帶來災難性的后果。比如,航天飛機的嵌入式操作系統(tǒng)若發(fā)生內存分配失效,損失是不可估量的。

② 快速性。嵌入式系統(tǒng)對實時性的保證,要求簡單、快速地分配內存。

③ 高效性。嵌入式系統(tǒng)中內存是一種有限、昂貴的資源,內存分配要盡可能地減少浪費。

μC/OSII作為一種典型的嵌入式操作系統(tǒng),其內存管理同樣要滿足以上3點要求,下面簡單介紹μC/OSII的內存管理策略,并分析其不足之處。

2 μC/OSII動態(tài)內存管理方案及不足

2.1 μC/OSII內存管理方案簡介

μC/OSII內存管理模塊主要由一個數(shù)據(jù)結構體和5個函數(shù)組成:

◆ 內存控制塊數(shù)據(jù)結構OS_MEM;

◆ 內存分區(qū)創(chuàng)建函數(shù)OSMemCreate(void *addr, INT32U nblks, INT32U blksize, INT8U *err);

◆ 內存塊分配函數(shù)OSMemGet(OS_MEM *pmem , INT8U *err);

◆ 內存塊釋放函數(shù)OSMemPut(OS_MEM *pmem , void *pblk);

◆ 內存分區(qū)狀態(tài)查詢函數(shù)OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *p_mem_data);

◆ 內存控制塊鏈表初始化函數(shù)OSMemInit(void)。

μC/OSII用一個內存控制塊(OS_MEM)來管理內存分區(qū),主要通過以下4步來管理:

① 內存控制塊鏈表初始化函數(shù)OSMemInit()負責創(chuàng)建空內存控制塊結構的鏈表,鏈表長度由內核OS_CFG.H文件中定義的OS_MAX_MEM_PART宏確定。

② 內存塊創(chuàng)建函數(shù)OSMemCreate()先從空內存控制塊結構鏈表上獲取一個空的內存控制根塊結構,根據(jù)用戶需要內存塊的大小來創(chuàng)建分區(qū)。一個分區(qū)中含有相同大小的內存塊,各內存塊也是通過鏈表鏈接起來,而不同分區(qū)中的內存塊大小一般不同,如圖1所示的Partition # 1和Partition # 2中內存塊的大小是不同的。

圖1 μC/OSII通過內存控制塊管理內存

③ 內存塊分配函數(shù)OSMemGet()通過從內存控制塊鏈表中找到能夠滿足自己內存塊需要的內存控制塊,然后從這個內存控制塊指向的分區(qū)鏈表首部得到自己需要的內存塊。

④ 內存塊釋放函數(shù)OSMemPut()負責回收內存塊。當應用程序不再使用某一個內存塊時,必須及時把它釋放,并放回到相應的內存分區(qū)中。

2.2 μC/OSII內存管理方案的不足之處

如前所述,μC/OSII的內存管理方案簡短精煉,僅百余行代碼,5個函數(shù)就能勝任。然而考慮到第1節(jié)提到的嵌入式系統(tǒng)對內存管理策略的3個要求,μC/OSII的內存管理策略存在以下不足之處:

① 原μC/OSII內存管理方案可靠性不高。因為原方案中各內存分區(qū)之間是孤立的,沒有聯(lián)系。一個內存分區(qū)上的內存塊用完時,不能利用其他分區(qū)上的內存塊,而只是簡單地報錯,從而使系統(tǒng)可靠性大大降低。在內存塊大小及需求量不確定的場合,如果經(jīng)常發(fā)生內存申請得不到滿足的情況,是嵌入式系統(tǒng)所不能容忍的。

② 原μC/OSII內存管理方案中內存分配不夠靈活。舉個例子來說,一個應用程序需要大小為1 KB、512 B、256 B三種內存塊,原方案有兩種解決方案,一是創(chuàng)建一個內存塊大小為1 KB的內存分區(qū),內存塊數(shù)目至少為3個;二是創(chuàng)建3個內存分區(qū),內存塊大小分別為1 KB、512 B、256 B。方案一創(chuàng)建了較少分區(qū),性能有保證,但造成內存資源的浪費;方案二雖然沒有浪費內存,但卻調用3次OS_MemCreate()函數(shù),效率較低。

3 Buddy算法簡介

Buddy算法是內存管理的經(jīng)典算法,目的是為了解決內存的外碎片問題,以及提高內存管理的可靠性。Buddy算法在Linux內核內存管理模塊得到成功的應用。

如圖2 所示,Buddy算法將所有空閑頁框分組為10個塊鏈表,每個塊鏈表的每個塊元素分別包含1、2、4、8、16、32、64、128、256、512個連續(xù)的頁框,每個塊的第一個頁框的物理地址是該塊大小的整數(shù)倍。例如,大小為4個頁框的塊,其起始地址是4×212(一個頁框的大小為4K,4個頁框的大小為4×4K,1K=1024=210,4K=212)的倍數(shù)。

圖2 Buddy算法簡介

假設要請求一個128個頁框的塊,算法先檢查128個頁框的鏈表是否有空閑塊,如果沒有則查256個頁框的鏈表,有則將256個頁框的塊分裂為兩份,一份使用,一份插入128個頁框的鏈表。如果還沒有,就查512個頁框的鏈表,有的話就分裂為128、128、256,一個128使用,剩余兩個插入對應鏈表。如果在512還沒查到,則返回出錯信號。用這種方法來分配頁框,由Linux內核的穩(wěn)定性可知其可靠性。

回收過程相反,內核試圖把大小為b的空閑伙伴合并為一個大小為2b的單獨塊,滿足以下條件的兩個塊稱為伙伴: 兩個塊具有相同的大小,記做b;它們的物理地址是連續(xù)的;第一個塊的第一個頁框的物理地址是2b×212的倍數(shù)。該算法迭代,如果成功合并所釋放的塊,會試圖合并2b的塊來形成更大的塊。在本方案中,只要滿足前兩個條件就足夠了。

4 μC/OSII內存管理改進方案

4.1 改進方案思路

① 修改內存控制塊的結構OS_MEM,去掉OS_MemAddr、OS_MemNFree成員,添加一個內存塊鏈表尾指針OSMemBlkTail,所以OS_MEM結構還含有4個成員:OSMemFreeList、OSMemBlkSize、OSMemNBlks、OSMemBlkTail。改進后的內存控制塊結構如圖3所示。

圖3 改進方案中的內存管理組織結構

② 首先初始化一個內存控制塊結構數(shù)組struct OS_MEM [],其下標是內存塊規(guī)模的對數(shù),引入結構數(shù)組的目的是在申請內存塊時能夠快速定位,起到索引的作用。而內存塊的實際大小為內存塊規(guī)模與內存塊粒度的乘積。然后將內存塊按內存塊規(guī)模從小到大掛到不同結構數(shù)組指向的鏈表上,并且保證初始化后同一鏈表上的內存塊地址不連續(xù)。在申請內存塊通過內存控制結構數(shù)組的下標快速定位到內存塊鏈表,查看內存塊控制結構字段中OSMemFreeList成員指針是否為空。若不為空,則從表頭取一個內存塊,并返回該內存塊的地址;否則向后搜索數(shù)組,看是否有空閑內存塊。若有則將該內存塊一分為二,低地址的那塊分配給申請者,高地址的那塊則掛到前一個結構數(shù)組的表頭,以備其他申請者申請。同樣,釋放內存塊時也是通過結構數(shù)組快速定位到具體結構數(shù)組,然后檢查該結構數(shù)組內存塊鏈表中是否有和要釋放的內存塊地址連續(xù)的內存塊。若有,則合并兩內存塊并掛到后一個結構數(shù)組,并檢查地址是否連續(xù),直至沒有為止;若無,則將該內存塊掛到該內存塊鏈表的表尾。改進后的內存管理組織結構如圖3所示。

4.2 具體改進措施

① 改進函數(shù)OS_MemInit(void)。此函數(shù)原來是初始化空閑內存控制塊鏈表,改進后此函數(shù)用于初始化OS_MEM結構數(shù)組即可,根據(jù)OS_CFG.H文件中宏OS_MAX_MEM_PART來決定數(shù)組元素個數(shù)。

② 改進函數(shù)OSMemCreate(void *addr, INT32U nblks, INT32U granularity , INT8U *err)。根據(jù)Buddy的規(guī)則橫向創(chuàng)建內存塊,每創(chuàng)建一個內存塊就鏈到相應的結構體數(shù)組上,如圖3的Create Direction所示,這樣能保證每個結構數(shù)組上的相同大小的內存塊地址不連續(xù),從而避免了所有內存塊合并的現(xiàn)象。創(chuàng)建出來的內存塊組織結構如圖3所示。

③ 改進函數(shù)OSMemGet(INT32U size, INT32U granularity, INT8U *err)。因為結構體數(shù)組名是在OS_CFG.H文件中宏定義的,所以本函數(shù)的參數(shù)只包括需求的內存塊大小及內存塊粒度即可。用內存塊大小除以內存塊粒度,首先判斷所得值是否為2的冪次,若是直接取對數(shù)即得結構數(shù)組的下標;若不是則取對數(shù)后向上取整。得到指定數(shù)組元素后若有內存塊,取下一內存塊然后指針下移,若無內存塊則繼續(xù)搜索下一個結構數(shù)組。若該數(shù)組有空閑內存塊則取將其平分為兩塊,一塊分配出去,一塊掛到前面結構數(shù)組鏈表。這樣一直搜索到最后一個結構數(shù)組,若一直無內存塊,則報錯返回。

④ 改進函數(shù)OSMemPut(INT32U size, INT32U granularity)。如何取得結構數(shù)組下標值同OSMemGet()函數(shù)。在找到所要回收的結構數(shù)組后,判斷該數(shù)組內存塊鏈表上是否有與要回收的內存塊連續(xù)的地址。若有合并且掛到下一內存塊結構數(shù)組內存塊鏈表,這樣一直到最后一個結構數(shù)組,目的是為了保證有更大的內存塊可滿足應用程序的申請,提高了內存管理的可靠性。

在改進以上函數(shù)的基礎上,還可以在申請內存塊之前有選擇地使用OSMemQuery()查詢內存中是否有滿足需要的內存塊。如果沒有則作好相應的規(guī)避措施,進一步提高內存管理的可靠性,使系統(tǒng)更穩(wěn)定。

5 實驗結果及性能分析

針對改進前后μC/OSII內存管理策略的特點,設計一組具有代表性的測試用例來分析μC/OSII系統(tǒng)在改進前后內存管理的可靠性和靈活性。實驗環(huán)境為ARM Develop Suit V1. 2及三星公司S3C2440微控制器,由于S3C2440片內包含MMU模塊,所以需要將協(xié)處理器CP15的C1寄存器0位置0,以禁用MMU功能。

假設兩種方案內存初始化都創(chuàng)建了5個分區(qū),每個分區(qū)中所含內存塊為10個,且這5個內存分區(qū)中的內存塊大小依次為16 B、32 B、64 B、128 B、256 B。原方案創(chuàng)建分區(qū)時要調用5次OSMemCreate()函數(shù),而改進方案只需調用一次。表1是申請內存塊大小與兩種方案可以滿足的次數(shù)之間的關系。

表1 申請內存塊大小與兩種方案可以滿足的次數(shù)比較

由表1的數(shù)據(jù)及圖4的對比曲線可看出,改進方案與原方案在可用內存完全相同的情況下,使內存的利用率大大提高。因為可靠性與可滿足次數(shù)正相關,而可滿足次數(shù)與曲線與坐標軸圍成的面積成正比,所以該面積與可靠性正相關。新方案曲線所圍圖形面積為12960, 而原方案曲線所圍成的圖形面積為2400。所以新方案的可靠性將比原來方案提高大約4倍,而且申請內存塊越小,可滿足次數(shù)越多,提高了內存分配的靈活性。

圖4 兩種方案可滿足次數(shù)對比曲線

6 結語

本文的創(chuàng)新之處在于針對μC/OSII在內存管理可靠性不高、內存塊分配不夠靈活的特點,借鑒Buddy算法思想,對其進行改進,形成了一種基于Buddy算法思想、高可靠性的內存管理策略。實驗表明,新方案一次創(chuàng)建內存區(qū),即可滿足內存塊大小需求不均勻的場合,既提高內存分配的靈活性,避免了大量內碎片的產生,又增強了內存分配的可靠性。因此,新方案在可靠性要求高的嵌入式系統(tǒng)中可以得到更好的應用。


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

    關注

    0

    文章

    59

    瀏覽量

    28857
  • MMU
    MMU
    +關注

    關注

    0

    文章

    92

    瀏覽量

    19232
  • Buddy
    +關注

    關注

    0

    文章

    5

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    探秘DS2731:緩存內存電池備份管理IC的卓越性能與應用

    探秘DS2731:緩存內存電池備份管理IC的卓越性能與應用 在電子設備的設計中,電源管理是一個至關重要的環(huán)節(jié),尤其是對于需要可靠備份電源的應用場景。今天,我們就來深入探討一款功能強大的
    的頭像 發(fā)表于 02-24 16:40 ?324次閱讀

    Linux內核伙伴系統(tǒng)內存申請函數(shù)詳解:從原理到實戰(zhàn)

    在 Linux 內核中,內存管理是整個系統(tǒng)穩(wěn)定運行的基石,而伙伴系統(tǒng)(Buddy System) 作為內核物理內存分配的核心機制,更是驅動開發(fā)、內核模塊開發(fā)的必備知識點。它通過 "2
    的頭像 發(fā)表于 02-10 16:58 ?3636次閱讀
    Linux內核伙伴系統(tǒng)<b class='flag-5'>內存</b>申請函數(shù)詳解:從原理到實戰(zhàn)

    Cadence推出高可靠性LPDDR5X 9600Mbps內存IP系統(tǒng)解決方案

    楷登電子(美國 Cadence 公司,NASDAQ:CDNS)近日宣布,推出業(yè)界首款專為企業(yè)與數(shù)據(jù)中心應用設計的高可靠性 LPDDR5X 9600Mbps 內存 IP 系統(tǒng)解決方案。該創(chuàng)新方案
    的頭像 發(fā)表于 01-21 15:00 ?541次閱讀

    構建可靠的數(shù)據(jù)中心零配置帶外管理體系

    數(shù)據(jù)中心帶外管理網(wǎng)傳統(tǒng)需手動配置靜態(tài)IP與VLAN,現(xiàn)可通過基于SONiC的交換機運行DHCP與TFTP服務,實現(xiàn)設備“即插即用”零配置上線。方案支持按物理位置自動分配IP,并具備雙活DHCP服務器保障高可靠性。
    的頭像 發(fā)表于 12-31 09:21 ?1366次閱讀
    構建<b class='flag-5'>高</b><b class='flag-5'>可靠</b>的數(shù)據(jù)中心零配置帶外<b class='flag-5'>管理</b>體系

    CW32F030C8T7永磁同步電機無感FOC控制的方案

    12bit高精度ADC,轉換速度快,精度。芯片可靠、強抗靜電,強抗干擾等特點,為系統(tǒng)提供了很好的保護功能,能確保系統(tǒng)在惡劣的電磁干擾環(huán)境下安全運行。 永磁同步電機無感FOC控制方案
    發(fā)表于 12-03 06:34

    C語言的常見算法

    # C語言常見算法 C語言中常用的算法可以分為以下幾大類: ## 1. 排序算法 ### 冒泡排序 (Bubble Sort) ```
    發(fā)表于 11-24 08:29

    尋求集成度電池驅動方案?剖析SiLM2661CA-DG的獨立雙使能與邊保護架構

    你是否正在為電池管理系統(tǒng)尋找一款緊湊可靠邊驅動方案?SiLM2661CA-DG,采用SOP8封裝的邊NMOS驅動器,以低功耗、
    發(fā)表于 09-02 08:26

    靈活高效ZBUFF — C內存數(shù)據(jù)操作庫:優(yōu)化內存管理的利器

    C語言開發(fā)中,高效的內存管理是提升程序性能的關鍵。ZBUFF作為一款靈活高效的內存數(shù)據(jù)操作庫,通過優(yōu)化內存分配與釋放機制,為開發(fā)者提供了更
    的頭像 發(fā)表于 08-14 18:01 ?697次閱讀
    靈活高效ZBUFF — <b class='flag-5'>C</b><b class='flag-5'>內存</b>數(shù)據(jù)操作庫:優(yōu)化<b class='flag-5'>內存</b><b class='flag-5'>管理</b>的利器

    SiLM2660CD-DG 邊NMOS電池管理驅動芯片的革新設計

    一、核心優(yōu)勢:SiLM2660CD-DG專為電池充放電管理設計,采用邊NMOS驅動架構,徹底解決傳統(tǒng)方案中\(zhòng)"接地引腳斷開導致通信中斷\"的風險,確保電池組與主機系統(tǒng)持續(xù)穩(wěn)定
    發(fā)表于 07-25 09:13

    可靠功率保護方案來了!穩(wěn)先微 WINSEMI E-fuse 系列產品震撼發(fā)布

    先進的半導體解決方案,今日正式推出E-fuse系列產品—— 以?“精密保護、智能控制”?為核心設計理念,集成高精度保護、浪涌管理、故障診斷于一體,為汽車配電、電池管理系統(tǒng)(BMS)、工業(yè)電源等場景提供高
    發(fā)表于 06-30 16:21 ?5202次閱讀
    <b class='flag-5'>高</b><b class='flag-5'>可靠</b>功率保護<b class='flag-5'>方案</b>來了!穩(wěn)先微 WINSEMI E-fuse 系列產品震撼發(fā)布

    AWK6943ABTER:車規(guī)級可靠電源解決方案

    ?AWK6943ABTER以車規(guī)級可靠性+極簡設計成為工業(yè)/汽車電源首選,其寬壓輸入、納米級響應及打嗝式保護技術,為可靠系統(tǒng)提供國產化高性能替代方案
    的頭像 發(fā)表于 06-16 17:12 ?1052次閱讀
    AWK6943ABTER:車規(guī)級<b class='flag-5'>高</b><b class='flag-5'>可靠</b>電源解決<b class='flag-5'>方案</b>

    ?數(shù)字孿生熱管理:NTC熱敏電阻陣列與熱場重構算法的動態(tài)適配

    場重構誤差<±0.5℃、響應時間<10ms,并結合某車企電池熱管理系統(tǒng)與電機控制單元的實測案例,展現(xiàn)其在復雜工況下的精準溫控與能效優(yōu)化能力,為智能汽車熱管理提供高可靠性解決方案。
    的頭像 發(fā)表于 06-06 17:59 ?849次閱讀
    ?數(shù)字孿生熱<b class='flag-5'>管理</b>:NTC熱敏電阻陣列與熱場重構<b class='flag-5'>算法</b>的動態(tài)適配

    BMS管理方案NRF52833

    電池的智能化管理,同時提高電池使用壽命。通過 BMS 管理方案,結合手機APP、服務器數(shù)據(jù)統(tǒng)計分析,實現(xiàn)對電池系統(tǒng)的高效、安全和可靠管理,為
    發(fā)表于 04-22 14:26

    BMS 管理方案 NRF52833

    電池的智能化管理,同時提高電池使用壽命。通過 BMS 管理方案,結合手機APP、服務器數(shù)據(jù)統(tǒng)計分析,實現(xiàn)對電池系統(tǒng)的高效、安全和可靠管理,為
    發(fā)表于 04-09 16:06

    快速搞懂C語言程序內存分區(qū)!

    在程序運行過程中,操作系統(tǒng)會根據(jù)程序的需要,將內存劃分為多個功能不同的區(qū)段,以便更高效地管理內存資源和確保程序的穩(wěn)定運行。不同的內存區(qū)段負責存儲不同類型的數(shù)據(jù)和代碼,涵蓋了從程序指令、
    的頭像 發(fā)表于 03-14 17:37 ?1591次閱讀
    快速搞懂<b class='flag-5'>C</b>語言程序<b class='flag-5'>內存</b>分區(qū)!