GD32F3開發(fā)進(jìn)階教程 課件 ch06內(nèi)存管理實驗_第1頁
GD32F3開發(fā)進(jìn)階教程 課件 ch06內(nèi)存管理實驗_第2頁
GD32F3開發(fā)進(jìn)階教程 課件 ch06內(nèi)存管理實驗_第3頁
GD32F3開發(fā)進(jìn)階教程 課件 ch06內(nèi)存管理實驗_第4頁
GD32F3開發(fā)進(jìn)階教程 課件 ch06內(nèi)存管理實驗_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

讀寫NAND

Flash實驗“第六章《GD32F3開發(fā)進(jìn)階教程——基于GD32F303ZET6》01實驗內(nèi)容本章的主要內(nèi)容是介紹分塊式內(nèi)存管理的原理,包括內(nèi)存池、內(nèi)存管理表和內(nèi)存的分配釋放原理,掌握動態(tài)內(nèi)存管理方法。最后,基于GD32F3蘋果派開發(fā)板設(shè)計一個內(nèi)存管理實驗,通過LCD屏上的GUI界面實現(xiàn)動態(tài)內(nèi)存管理,并在屏幕上使用文字和波形圖實時顯示內(nèi)存使用率。實驗內(nèi)容02實驗原理內(nèi)存管理是指,在軟件運行時,對內(nèi)存資源的分配和使用,以高效、快速地對內(nèi)存進(jìn)行分配,并且在適當(dāng)?shù)臅r候釋放內(nèi)存資源。在GD32F3蘋果派開發(fā)板上,內(nèi)存的分配與釋放最終由兩個函數(shù)實現(xiàn):malloc函數(shù)用于申請內(nèi)存,ee函數(shù)用于釋放內(nèi)存。雖然C標(biāo)準(zhǔn)庫中已經(jīng)實現(xiàn)了這兩個函數(shù),但是C語言動態(tài)分配的內(nèi)存堆區(qū)分配在內(nèi)部SRAM中為了充分利用外部SRAM,本章編寫了一種內(nèi)存管理機(jī)制,使用“分塊式內(nèi)存管理”技術(shù),在占用盡可能少的內(nèi)存的情況下,實現(xiàn)內(nèi)存動態(tài)管理。分塊式內(nèi)存管理原理分塊式內(nèi)存管理原理如圖6-1所示,分塊式內(nèi)存管理由內(nèi)存池和內(nèi)存管理表兩部分組成。內(nèi)存池被等分為n塊,對應(yīng)的內(nèi)存管理表大小也被分為n項,每一項對應(yīng)內(nèi)存池的一塊內(nèi)存。010203分配原理釋放原理內(nèi)存泄漏分塊式內(nèi)存管理原理04內(nèi)存分配與釋放操作界面分塊式內(nèi)存管理原理本章實驗的LCD顯示模塊的GUI界面布局如圖6-2所示。內(nèi)存分配與釋放流程本實驗內(nèi)存分配與釋放的流程圖如圖6-3所示。首先初始化內(nèi)外部SRAM和GU界面,初始化相應(yīng)的內(nèi)存池。010203進(jìn)入GUI界面后,當(dāng)InSRAM按被按下時,程序?qū)⒄{(diào)用內(nèi)部SRAM申請內(nèi)存的函數(shù)InSramMallcCallback。當(dāng)EXSRAM按鈕被按下時,程序?qū)⒄{(diào)用外部SRAM申請內(nèi)存按鈕回調(diào)函數(shù)ExSramMalleCallback。當(dāng)Free按鈕被按下時,程序?qū)⒄{(diào)用內(nèi)存釋放按回調(diào)函數(shù)FreeCallback。內(nèi)存分配與釋放流程03實驗代碼解析1.Malloc.h文件在Malloc.h文件的“宏定義”區(qū),首先定義了內(nèi)存池及內(nèi)存管理的相關(guān)參數(shù)。下面按照順序解釋說明其中的語句。(1)第2至4行代碼:本實驗需要管理的是內(nèi)部和外部SRAM,因此將內(nèi)部SRAM內(nèi)存池定義為0,外部SRAM內(nèi)存池定義為1,總共支持的SRAM塊數(shù)為2。(2)第6至13行代碼:定義了內(nèi)存管理的相關(guān)參數(shù)其中MEMxBLOCKSIZE為內(nèi)存塊大小,是內(nèi)存分配時的最小單元。MEMxMAXSIZE為最大管理內(nèi)存的大小,取值必須小于當(dāng)前SRAM可用內(nèi)存。MEMxALLOCTABLESIZE為內(nèi)存管理表的大小,計算方式為管理內(nèi)存的大小除以每個內(nèi)存塊的大小。Malloc文件對下面按照順序解釋說明其中的語句。(1)第3行代碼mit為指向內(nèi)存初始化的函數(shù)指針,用于初始化內(nèi)存管理,形參表示需要初始化的內(nèi)存片。(2)第4行代碼:perused為指向內(nèi)存使用率函數(shù)的函數(shù)指針,用于獲取內(nèi)存使用率,形參表示要獲取內(nèi)存使用率的內(nèi)存片。(3)第5行代碼:memoryBase為指向內(nèi)存池的指針,最多有SRAMBANK個內(nèi)存池本實驗定義為2。(4)第6行代碼:memoryMap為指向內(nèi)存管理表的指針。(5)第7行代碼:memoryRdy為內(nèi)存管理表就緒標(biāo)志,用于表示內(nèi)存管理表是否已經(jīng)初始化。Malloc文件對在Malloc.c文件的“內(nèi)部變量定義”區(qū),首先定義了內(nèi)存池、內(nèi)存管理表所在地址,以及內(nèi)存管理的相關(guān)參數(shù)。下面按照順序解釋說明其中的語句。(1)第2至7行代碼:內(nèi)存池中使用了兩部分內(nèi)存池,一部分是開發(fā)板內(nèi)部SRAM內(nèi)存池,由編譯器隨機(jī)分配。另一部分則使用外部擴(kuò)展的SRAM內(nèi)存池,用atribute機(jī)制指定內(nèi)存所在的地址,需要確保內(nèi)存池與內(nèi)存管理表均在外部SRAM中。兩部分內(nèi)存池均需要使用align關(guān)鍵字進(jìn)行32字節(jié)對齊,以提高訪問效率。(2)第10至12行代碼:寫入內(nèi)存管理的相關(guān)參數(shù),包括每個內(nèi)存表的大小,內(nèi)存分塊的大小及需要管理的總內(nèi)存大小。(3)第15至25行代碼:初始化sstructMallocDev結(jié)構(gòu)體,并且按照結(jié)構(gòu)體的順序為結(jié)構(gòu)體成員賦值。Malloc文件對2.Malloc.c文件注意,內(nèi)存釋放并不清除對應(yīng)內(nèi)存池中的內(nèi)容,而是在內(nèi)存管理表中標(biāo)記該內(nèi)存塊為未使用,可以再次對該內(nèi)存塊寫入數(shù)據(jù),寫入數(shù)據(jù)將覆蓋原內(nèi)容。在“API函數(shù)實現(xiàn)”區(qū),首先實現(xiàn)了InitMemory函數(shù)。該函數(shù)用于將參數(shù)memx所指定的內(nèi)存池中的數(shù)據(jù)清零,并將memoryRdy標(biāo)志置為1。在InitMemory函數(shù)后的MemoryPerused函數(shù)用于獲得內(nèi)存使用率。MemoryPerused函數(shù)通過統(tǒng)計其參數(shù)memx所指定的內(nèi)存管理表上項值不為0的塊來獲得總使用率并與內(nèi)存塊總數(shù)相除,在百分比的基礎(chǔ)上再擴(kuò)大10倍,最終返回的數(shù)值為0~1000代表使用率為0.0%~100.0%。Malloc文件對MyMalloc函數(shù)后的MyRealloc函數(shù)用于重新分配內(nèi)存。函數(shù)的參數(shù):memx為所屬內(nèi)存塊;ptr為內(nèi)存首地址;size為內(nèi)存大小,單位為字節(jié)。重新分配內(nèi)存函數(shù)一般是對給定的指針?biāo)赶虻膬?nèi)存空間進(jìn)行擴(kuò)大或縮小,在本實驗中暫未使用。Malloc文件對0102MallocTop.h文件:在MallocTop.h文件的“API函數(shù)聲明”區(qū),聲明了2個API函數(shù)。MallocTop.c文件:在MallocTop.c文件的“宏定義”區(qū),首先定義了每次內(nèi)存申請量。MallocTop文件對下面按照順序解釋說明這兩個函數(shù)中的語句。(1)第4行代碼:調(diào)用MyMalloc函數(shù)來申請內(nèi)部SRAM中的內(nèi)存,并將該內(nèi)存的首地址賦值給指針spMalloc。(2)第5行代碼:更新內(nèi)外部SRAM訪問標(biāo)志sointerPlace,以0標(biāo)識目前指針指向內(nèi)部SRAM。(3)第6行代碼:調(diào)用printf函數(shù),通過串口輸出指針數(shù)值。(4)第9行代碼:調(diào)用updateMamInfoShow函數(shù)更新內(nèi)存顯示信息。(5)第12至21行代碼:將相關(guān)參數(shù)替換為外部SRAM。MallocTop文件對該函數(shù)為內(nèi)存釋放按鈕回調(diào)函數(shù)每次單擊屏幕上的Free按鈕,都會調(diào)用FreeCallback函數(shù)來釋放內(nèi)存。(1)第4行代碼:判斷指針?biāo)幍奈恢檬欠裉幱趦?nèi)部SRAM中。(2)第7行代碼:調(diào)用MyFree函數(shù)對指針?biāo)赶虻倪B續(xù)內(nèi)存塊進(jìn)行釋放。內(nèi)存釋放后spMalloc指針并不會更新,因此只能釋放對應(yīng)上一次申請的內(nèi)存。(3)第10行代碼:調(diào)用updateMamInfoShow函數(shù)更新內(nèi)存顯示信息。(4)第14至21行代碼:將相關(guān)參數(shù)替換為外部SRAM。MallocTop文件對在FreeCallback函數(shù)后的updateMamInfoShow函數(shù)用于更新GUI上方的內(nèi)存信息顯示,包括內(nèi)存用量、剩余內(nèi)存等,參數(shù)mem為內(nèi)部或外部SRAM標(biāo)志。(1)第4行代碼:定義usage和ee變量,分別用于存儲內(nèi)存使用量與剩余量。(2)第7行代碼:判斷需要更新的內(nèi)存塊是否為內(nèi)部SRAM。(3)第10行代碼:調(diào)用MemoryPerused函數(shù)計算使用率,將其返回值賦值給uage變量。MallocTop文件對(4)第13至19行代碼:由于MemoryPerused計算結(jié)果在百分比的基礎(chǔ)上擴(kuò)大了10倍(0~1000,代表0.0%~100.0%),因此將usage除以1000后再與MEM1MAXSIZE相乘得到字節(jié)使用量,并對該運算結(jié)果向上取整。(5)第22行代碼:將所有內(nèi)存的字節(jié)數(shù)減去已使用的字節(jié)數(shù),得到剩余字節(jié)數(shù)。(6)第25行代碼:調(diào)用在GUITopc文件中實現(xiàn)的updateInSRAMInfo函數(shù),可計算得出的內(nèi)存用量及剩余內(nèi)存,更新至GUI上方的文字信息顯示區(qū)域。MallocTop文件對Main.c文件Proc2msTask函數(shù)的實現(xiàn)代碼如程序清單6-24所示,調(diào)用了MallocTopTask函數(shù),該函數(shù)每20ms執(zhí)行一次內(nèi)存管理實驗頂

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論