????????由于項目需要用到內存管理進行動態申請和釋放,今天又重新學習了一下正點原子的內存管理實驗,溫習了一下內存管理的實質。首先先上正點原子內存管理的源代碼:
malloc.c文件:
#include "./MALLOC/malloc.h"#if !(__ARMCC_VERSION >= 6010050) /* 不是AC6編譯器,即使用AC5編譯器時 *//* 內存池(32字節對齊) */
static __align(32) uint8_t mem1base[MEM1_MAX_SIZE]; /* 內部SRAM內存池 */
static __align(32) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0X10000000))); /* 內部CCM內存池 */
static __align(32) uint8_t mem3base[MEM3_MAX_SIZE] __attribute__((at(0XC01F4000))); /* 外部SDRAM內存池,前面2M給LTDC用了(1280*800*2) *//* 內存管理表 */
static MT_TYPE mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; /* 內部SRAM內存池MAP */
static MT_TYPE mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X10000000 + MEM2_MAX_SIZE))); /* 內部CCM內存池MAP */
static MT_TYPE mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0XC01F4000 + MEM3_MAX_SIZE))); /* 外部SRAM內存池MAP */#else /* 使用AC6編譯器時 *//* 內存池(32字節對齊) */
static __ALIGNED(32) uint8_t mem1base[MEM1_MAX_SIZE]; /* 內部SRAM內存池 */
static __ALIGNED(32) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((section(".bss.ARM.__at_0X10000000"))); /* 內部CCM內存池 */
static __ALIGNED(32) uint8_t mem3base[MEM3_MAX_SIZE] __attribute__((section(".bss.ARM.__at_0XC01F4000"))); /* 外部SDRAM內存池,前面2M給LTDC用了(1280*800*2) *//* 內存管理表 */
static MT_TYPE mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; /* 內部SRAM內存池MAP */
static MT_TYPE mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((section(".bss.ARM.__at_0X1000F000"))); /* 內部CCM內存池MAP */
static MT_TYPE mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((section(".bss.ARM.__at_0XC1E30000"))); /* 外部SRAM內存池MAP */#endif/* 內存管理參數 */
const uint32_t memtblsize[SRAMBANK] = {MEM1_ALLOC_TABLE_SIZE, MEM2_ALLOC_TABLE_SIZE, MEM3_ALLOC_TABLE_SIZE}; /* 內存表大小 */
const uint32_t memblksize[SRAMBANK] = {MEM1_BLOCK_SIZE, MEM2_BLOCK_SIZE, MEM3_BLOCK_SIZE}; /* 內存分塊大小 */
const uint32_t memsize[SRAMBANK] = {MEM1_MAX_SIZE, MEM2_MAX_SIZE, MEM3_MAX_SIZE}; /* 內存總大小 *//* 內存管理控制器 */
struct _m_mallco_dev mallco_dev=
{my_mem_init, /* 內存初始化 */my_mem_perused, /* 內存使用率 */mem1base, mem2base, mem3base, /* 內存池 */mem1mapbase, mem2mapbase, mem3mapbase, /* 內存管理狀態表 */0, 0, 0, /* 內存管理未就緒 */
};/*** @brief 復制內存* @param *des : 目的地址* @param *src : 源地址* @param n : 需要復制的內存長度(字節為單位)* @retval 無*/
void my_mem_copy(void *des, void *src, uint32_t n)
{ uint8_t *xdes = des;uint8_t *xsrc = src; while (n--)*xdes++ = *xsrc++;
} /*** @brief 設置內存值* @param *s : 內存首地址* @param c : 要設置的值* @param count : 需要設置的內存大小(字節為單位)* @retval 無*/
void my_mem_set(void *s, uint8_t c, uint32_t count)
{ uint8_t *xs = s; while (count--)*xs++ = c;
} /*** @brief 內存管理初始化* @param memx : 所屬內存塊* @retval 無*/
void my_mem_init(uint8_t memx)
{ my_mem_set(mallco_dev.memmap[memx], 0, memtblsize[memx] * 4); /* 內存狀態表數據清零 */mallco_dev.memrdy[memx] = 1; /* 內存管理初始化OK */
}/*** @brief 獲取內存使用率* @param memx : 所屬內存塊* @retval 使用率(擴大了10倍,0~1000,代表0.0%~100.0%)*/
uint16_t my_mem_perused(uint8_t memx)
{ uint32_t used = 0; uint32_t i;for (i = 0; i < memtblsize[memx]; i++) {if (mallco_dev.memmap[memx][i]){used++;}}return (used * 1000) / (memtblsize[memx]);
}/*** @brief 內存分配(內部調用)* @param memx : 所屬內存塊* @param size : 要分配的內存大小(字節)* @retval 內存偏移地址* @arg 0 ~ 0xFFFFFFFE : 有效的內存偏移地址* @arg 0xFFFFFFFF : 無效的內存偏移地址*/
uint32_t my_mem_malloc(uint8_t memx, uint32_t size)
{ signed long offset = 0; uint32_t nmemb; /* 需要的內存塊數 */uint32_t cmemb = 0; /* 連續空內存塊數 */uint32_t i;if (!mallco_dev.memrdy[memx]){mallco_dev.init(memx); /* 未初始化,先執行初始化 */}if (size == 0) {return 0XFFFFFFFF; /* 不需要分配 */}nmemb = size / memblksize[memx]; /* 獲取需要分配的連續內存塊數 */if (size % memblksize[memx]){nmemb++;}for (offset = memtblsize[memx] - 1; offset >= 0; offset--) /* 搜索整個內存控制區 */{if (!mallco_dev.memmap[memx][offset]){cmemb++; /* 連續空內存塊數增加 */}else {cmemb = 0; /* 連續內存塊清零 */}if (cmemb == nmemb) /* 找到了連續nmemb個空內存塊 */{for (i = 0;i < nmemb; i++) /* 標注內存塊非空 */{ mallco_dev.memmap[memx][offset + i] = nmemb; }return (offset * memblksize[memx]); /* 返回偏移地址 */}}return 0XFFFFFFFF; /* 未找到符合分配條件的內存塊 */
}/*** @brief 釋放內存(內部調用)* @param memx : 所屬內存塊* @param offset : 內存地址偏移* @retval 釋放結果* @arg 0, 釋放成功;* @arg 1, 釋放失敗;* @arg 2, 超區域了(失敗);*/
uint8_t my_mem_free(uint8_t memx, uint32_t offset)
{int i;if (!mallco_dev.memrdy[memx]) /* 未初始化,先執行初始化 */{mallco_dev.init(memx);return 1; /* 未初始化 */}if (offset < memsize[memx]) /* 偏移在內存池內. */{int index = offset / memblksize[memx]; /* 偏移所在內存塊號碼 */int nmemb = mallco_dev.memmap[memx][index]; /* 內存塊數量 */for (i = 0; i < nmemb; i++) /* 內存塊清零 */{mallco_dev.memmap[memx][index + i] = 0;}return 0;}else{return 2; /* 偏移超區了. */}
}/*** @brief 釋放內存(外部調用)* @param memx : 所屬內存塊* @param ptr : 內存首地址* @retval 無*/
void myfree(uint8_t memx, void *ptr)
{uint32_t offset;if (ptr == NULL)return; /* 地址為0. */offset = (uint32_t)ptr - (uint32_t)mallco_dev.membase[memx];my_mem_free(memx, offset); /* 釋放內存 */
}/*** @brief 分配內存(外部調用)* @param memx : 所屬內存塊* @param size : 要分配的內存大小(字節)* @retval 分配到的內存首地址.*/
void *mymalloc(uint8_t memx, uint32_t size)
{uint32_t offset;offset = my_mem_malloc(memx, size);if (offset == 0xFFFFFFFF) /* 申請出錯 */{return NULL; /* 返回空(0) */}else /* 申請沒問題, 返回首地址 */{return (void *)((uint32_t)mallco_dev.membase[memx] + offset);}
}/*** @brief 重新分配內存(外部調用)* @param memx : 所屬內存塊* @param *ptr : 舊內存首地址* @param size : 要分配的內存大小(字節)* @retval 新分配到的內存首地址.*/
void *myrealloc(uint8_t memx, void *ptr, uint32_t size)
{uint32_t offset;offset = my_mem_malloc(memx, size);if (offset == 0xFFFFFFFF) /* 申請出錯 */{return NULL; /* 返回空(0) */}else /* 申請沒問題, 返回首地址 */{my_mem_copy((void *)((uint32_t)mallco_dev.membase[memx] + offset), ptr, size); /* 拷貝舊內存內容到新內存 */myfree(memx, ptr); /* 釋放舊內存 */return (void *)((uint32_t)mallco_dev.membase[memx] + offset); /* 返回新內存首地址 */}
}
malloc.h文件:
#ifndef __MALLOC_H
#define __MALLOC_H#include "./SYSTEM/sys/sys.h"#ifndef NULL
#define NULL 0
#endif/* 定義三個內存池 */
#define SRAMIN 0 /* 內部內存池 */
#define SRAMCCM 1 /* CCM內存池(此部分SRAM僅僅CPU可以訪問!!!) */
#define SRAMEX 2 /* 外部內存池(SDRAM) *//* 定義內存管理表類型,當外擴SDRAM的時候,必須使用uint32_t類型,否則可以定義成uint16_t,以節省內存占用 */
#define MT_TYPE uint32_t#define SRAMBANK 3 /* 定義支持的SRAM塊數. *//* mem1內存參數設定.mem1完全處于內部SRAM里面. */
#define MEM1_BLOCK_SIZE 64 /* 內存塊大小為64字節 */
#define MEM1_MAX_SIZE 160 * 1024 /* 最大管理內存 160K */
#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE /* 內存表大小 *//* mem2內存參數設定.mem2處于CCM,用于管理CCM(特別注意,這部分SRAM,僅CPU可以訪問!!) */
#define MEM2_BLOCK_SIZE 64 /* 內存塊大小為64字節 */
#define MEM2_MAX_SIZE 60 * 1024 /* 最大管理內存60K */
#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE /* 內存表大小 *//* mem3內存參數設定.mem3的內存池處于外部SDRAM里面 */
#define MEM3_BLOCK_SIZE 64 /* 內存塊大小為64字節 */
#define MEM3_MAX_SIZE 28912 * 1024 /* 最大管理內存28912K */
#define MEM3_ALLOC_TABLE_SIZE MEM3_MAX_SIZE / MEM3_BLOCK_SIZE /* 內存表大小 *//* 內存管理控制器 */
struct _m_mallco_dev
{void (*init)(uint8_t); /* 初始化 */uint16_t (*perused)(uint8_t); /* 內存使用率 */uint8_t *membase[SRAMBANK]; /* 內存池 管理SRAMBANK個區域的內存 */uint32_t *memmap[SRAMBANK]; /* 內存管理狀態表 */uint8_t memrdy[SRAMBANK]; /* 內存管理是否就緒 */
};extern struct _m_mallco_dev mallco_dev; /* 在mallco.c里面定義 *//******************************************************************************************/void my_mem_set(void *s, uint8_t c, uint32_t count); /* 設置內存 */
void my_mem_copy(void *des, void *src, uint32_t n); /* 復制內存 */
void my_mem_init(uint8_t memx); /* 內存管理初始化函數(外/內部調用) */
uint32_t my_mem_malloc(uint8_t memx, uint32_t size); /* 內存分配(內部調用) */
uint8_t my_mem_free(uint8_t memx, uint32_t offset); /* 內存釋放(內部調用) */
uint16_t my_mem_perused(uint8_t memx) ; /* 獲得內存使用率(外/內部調用) *//* 用戶調用函數 */
void myfree(uint8_t memx, void *ptr); /* 內存釋放(外部調用) */
void *mymalloc(uint8_t memx, uint32_t size); /* 內存分配(外部調用) */
void *myrealloc(uint8_t memx, void *ptr, uint32_t size); /* 重新分配內存(外部調用) */#endif
對于單個內存池來說在移植的時候只需要修改以下內容:
????????malloc.h文件中的:內存塊大小宏定義(MEMx_BLOCK_SIZE)、內存池大小宏定義(MEMx_MAX_SIZE)、內存管理表單個元素的大小(MT_TYPE),通過這三個參即可得到內存管理表元素的個數。
????????malloc.c文件中需要修改的是:內存池的對其方式[__align(32)]、內存池的指定地址[__attribute__((at(0XC0000000)))],修改了這兩個參數就能保證內存池的定義不會出錯。
????????對于內存管理的移植除了需要修改單個內存池的定義信息外還需要修改內存池的數量(SRAMBANK)、內存池的編號(#define SRAMIN? ? ? 0 ;#define SRAMCCM? ? ? 1? ;#define SRAMEX? ? ?2 ? ?),同時還需要修改內存管理控制器結構體的參數(mallco_dev)。
從上面可以看出正點原子這份代碼是基于“保證內存池的大小”的角度進行定義的,換句話說我是指定了了內存池的大小,但是沒有指定整個內存池和內存管理表的大小,所以可以換一種方式進行定義:指定單個內存池全部的大小,然后自己程序自己去計算block的數量,這樣就可以保證單個內存池所占用的內存不會超過指定的大小,修改如下:
/* mem1內存參數設定.mem1完全處于內部SRAM里面. */
#define MEM1_TOTAL_SIZE 64*1024 /* 內部SRAM大小為64K字節 */
#define MEM1_BLOCK_SIZE 64 /* 內存塊大小為64字節 */
#define MEM1_ALLOC_TABLE_NUM MEM1_TOTAL_SIZE/(MEM1_BLOCK_SIZE+sizeof(MT_TYPE)) /* block的數量=內存管理表的數量*/
#define MEM1_MAX_SIZE MEM1_ALLOC_TABLE_NUM*MEM1_BLOCK_SIZE /* 內存池的大小為:block的大小*數量 *//* mem2內存參數設定.mem2處于CCM,用于管理CCM(特別注意,這部分SRAM,僅CPU可以訪問!!) */
#define MEM2_TOTAL_SIZE 64*1024 /* CCM大小為64K字節 */
#define MEM2_BLOCK_SIZE 64 /* 內存塊大小為64字節 */
#define MEM2_ALLOC_TABLE_NUM MEM2_TOTAL_SIZE/(MEM2_BLOCK_SIZE+sizeof(MT_TYPE)) /* block的數量=內存管理表的數量*/
#define MEM2_MAX_SIZE MEM2_ALLOC_TABLE_NUM*MEM2_BLOCK_SIZE /* 內存池的大小為:block的大小*數量 *//* mem3內存參數設定.mem3的內存池處于外部SDRAM里面 */
#define MEM3_TOTAL_SIZE 32*1024*1024 /* SDRAM大小為32M字節 */
#define MEM3_BLOCK_SIZE 64 /* 內存塊大小為64字節 */
#define MEM3_ALLOC_TABLE_NUM MEM3_TOTAL_SIZE/(MEM3_BLOCK_SIZE+sizeof(MT_TYPE)) /* block的數量=內存管理表的數量*/
#define MEM3_MAX_SIZE MEM3_ALLOC_TABLE_NUM*MEM3_BLOCK_SIZE /* 內存池的大小為:block的大小*數量 */
最后再附上單獨管理SDRAM的測試代碼:
malloc.c源代碼#include "malloc.h"/* 內存池(32字節對齊) */
static __align(32) uint8_t mem3base[MEM3_MAX_SIZE] __attribute__((at(0XC0000000))); /* 外部SDRAM內存池 SDRAM起始地址:0XC0000000*//* 內存管理表 */
static MT_TYPE mem3mapbase[MEM3_ALLOC_TABLE_NUM] __attribute__((at(0XC0000000 + MEM3_MAX_SIZE))); /* 外部SRAM內存池MAP *//* 內存管理參數 */
const uint32_t memtblsize[SRAMBANK] = {MEM3_ALLOC_TABLE_NUM}; /* 內存表數量 */
const uint32_t memblksize[SRAMBANK] = {MEM3_BLOCK_SIZE}; /* 單個block大小 */
const uint32_t memsize[SRAMBANK] = {MEM3_MAX_SIZE}; /* 每個內存池的大小 *//* 內存管理控制器 */
struct _m_mallco_dev mallco_dev=
{my_mem_init, /* 內存初始化 */my_mem_perused, /* 內存使用率 */mem3base, /* 內存池 */mem3mapbase, /* 內存管理狀態表 */0, /* 內存管理未就緒 */
};/*** @brief 復制內存* @param *des : 目的地址* @param *src : 源地址* @param n : 需要復制的內存長度(字節為單位)* @retval 無*/
void my_mem_copy(void *des, void *src, uint32_t n)
{ uint8_t *xdes = des;uint8_t *xsrc = src; while (n--)*xdes++ = *xsrc++;
} /*** @brief 設置內存值* @param *s : 內存首地址* @param c : 要設置的值* @param count : 需要設置的內存大小(字節為單位)* @retval 無*/
void my_mem_set(void *s, uint8_t c, uint32_t count)
{ uint8_t *xs = s; while (count--)*xs++ = c;
} /*** @brief 內存管理初始化* @param memx : 所屬內存塊* @retval 無*/
void my_mem_init(uint8_t memx)
{ my_mem_set(mallco_dev.memmap[memx], 0, memtblsize[memx] * 4); /* 內存狀態表數據清零 */mallco_dev.memrdy[memx] = 1; /* 內存管理初始化OK */
}/*** @brief 獲取內存使用率* @param memx : 所屬內存塊* @retval 使用率(擴大了10倍,0~1000,代表0.0%~100.0%)*/
uint16_t my_mem_perused(uint8_t memx)
{ uint32_t used = 0; uint32_t i;for (i = 0; i < memtblsize[memx]; i++) {if (mallco_dev.memmap[memx][i]){used++;}}return (used * 1000) / (memtblsize[memx]);
}/*** @brief 內存分配(內部調用)* @param memx : 所屬內存塊* @param size : 要分配的內存大小(字節)* @retval 內存偏移地址* @arg 0 ~ 0xFFFFFFFE : 有效的內存偏移地址* @arg 0xFFFFFFFF : 無效的內存偏移地址*/
uint32_t my_mem_malloc(uint8_t memx, uint32_t size)
{ signed long offset = 0; uint32_t nmemb; /* 需要的內存塊數 */uint32_t cmemb = 0; /* 連續空內存塊數 */uint32_t i;if (!mallco_dev.memrdy[memx]){mallco_dev.init(memx); /* 未初始化,先執行初始化 */}if (size == 0) {return 0XFFFFFFFF; /* 不需要分配 */}nmemb = size / memblksize[memx]; /* 獲取需要分配的連續內存塊數 */if (size % memblksize[memx]){nmemb++;}for (offset = memtblsize[memx] - 1; offset >= 0; offset--) /* 搜索整個內存控制區 */{if (!mallco_dev.memmap[memx][offset]){cmemb++; /* 連續空內存塊數增加 */}else {cmemb = 0; /* 連續內存塊清零 */}if (cmemb == nmemb) /* 找到了連續nmemb個空內存塊 */{for (i = 0;i < nmemb; i++) /* 標注內存塊非空 */{ mallco_dev.memmap[memx][offset + i] = nmemb; }return (offset * memblksize[memx]); /* 返回偏移地址 */}}return 0XFFFFFFFF; /* 未找到符合分配條件的內存塊 */
}/*** @brief 釋放內存(內部調用)* @param memx : 所屬內存塊* @param offset : 內存地址偏移* @retval 釋放結果* @arg 0, 釋放成功;* @arg 1, 釋放失敗;* @arg 2, 超區域了(失敗);*/
uint8_t my_mem_free(uint8_t memx, uint32_t offset)
{int i;if (!mallco_dev.memrdy[memx]) /* 未初始化,先執行初始化 */{mallco_dev.init(memx);return 1; /* 未初始化 */}if (offset < memsize[memx]) /* 偏移在內存池內. */{int index = offset / memblksize[memx]; /* 偏移所在內存塊號碼 */int nmemb = mallco_dev.memmap[memx][index]; /* 內存塊數量 */for (i = 0; i < nmemb; i++) /* 內存塊清零 */{mallco_dev.memmap[memx][index + i] = 0;}return 0;}else{return 2; /* 偏移超區了. */}
}/*** @brief 釋放內存(外部調用)* @param memx : 所屬內存塊* @param ptr : 內存首地址* @retval 無*/
void myfree(uint8_t memx, void *ptr)
{uint32_t offset;if (ptr == NULL)return; /* 地址為0. */offset = (uint32_t)ptr - (uint32_t)mallco_dev.membase[memx];my_mem_free(memx, offset); /* 釋放內存 */
}/*** @brief 分配內存(外部調用)* @param memx : 所屬內存塊* @param size : 要分配的內存大小(字節)* @retval 分配到的內存首地址.*/
void *mymalloc(uint8_t memx, uint32_t size)
{uint32_t offset;offset = my_mem_malloc(memx, size);if (offset == 0xFFFFFFFF) /* 申請出錯 */{return NULL; /* 返回空(0) */}else /* 申請沒問題, 返回首地址 */{return (void *)((uint32_t)mallco_dev.membase[memx] + offset);}
}/*** @brief 重新分配內存(外部調用)* @param memx : 所屬內存塊* @param *ptr : 舊內存首地址* @param size : 要分配的內存大小(字節)* @retval 新分配到的內存首地址.*/
void *myrealloc(uint8_t memx, void *ptr, uint32_t size)
{uint32_t offset;offset = my_mem_malloc(memx, size);if (offset == 0xFFFFFFFF) /* 申請出錯 */{return NULL; /* 返回空(0) */}else /* 申請沒問題, 返回首地址 */{my_mem_copy((void *)((uint32_t)mallco_dev.membase[memx] + offset), ptr, size); /* 拷貝舊內存內容到新內存 */myfree(memx, ptr); /* 釋放舊內存 */return (void *)((uint32_t)mallco_dev.membase[memx] + offset); /* 返回新內存首地址 */}
}malloc.h源代碼#ifndef __MALLOC_H
#define __MALLOC_H#include "main.h"#ifndef NULL
#define NULL 0
#endif/* 定義三個內存池 */
#define SRAMEX 0 /* 外部內存池(SDRAM) *//* 定義內存管理表類型,當外擴SDRAM的時候,必須使用uint32_t類型,否則可以定義成uint16_t,以節省內存占用 */
#define MT_TYPE uint32_t#define SRAMBANK 1 /* 定義支持的SRAM塊數. */#define MEM3_TOTAL_SIZE 32*1024*1024 /* SDRAM大小為32M字節 */
#define MEM3_BLOCK_SIZE 64 /* 內存塊大小為64字節 */
#define MEM3_ALLOC_TABLE_NUM MEM3_TOTAL_SIZE/(MEM3_BLOCK_SIZE+sizeof(MT_TYPE)) /* block的數量=內存管理表的數量*/
#define MEM3_MAX_SIZE MEM3_ALLOC_TABLE_NUM*MEM3_BLOCK_SIZE /* 內存池的大小為:block的大小*數量 *//* 內存管理控制器 */
struct _m_mallco_dev
{void (*init)(uint8_t); /* 初始化 */uint16_t (*perused)(uint8_t); /* 內存使用率 */uint8_t *membase[SRAMBANK]; /* 內存池 管理SRAMBANK個區域的內存 */uint32_t *memmap[SRAMBANK]; /* 內存管理狀態表 */uint8_t memrdy[SRAMBANK]; /* 內存管理是否就緒 */
};extern struct _m_mallco_dev mallco_dev; /* 在mallco.c里面定義 *//******************************************************************************************/void my_mem_set(void *s, uint8_t c, uint32_t count); /* 設置內存 */
void my_mem_copy(void *des, void *src, uint32_t n); /* 復制內存 */
void my_mem_init(uint8_t memx); /* 內存管理初始化函數(外/內部調用) */
uint32_t my_mem_malloc(uint8_t memx, uint32_t size); /* 內存分配(內部調用) */
uint8_t my_mem_free(uint8_t memx, uint32_t offset); /* 內存釋放(內部調用) */
uint16_t my_mem_perused(uint8_t memx) ; /* 獲得內存使用率(外/內部調用) *//* 用戶調用函數 */
void myfree(uint8_t memx, void *ptr); /* 內存釋放(外部調用) */
void *mymalloc(uint8_t memx, uint32_t size); /* 內存分配(外部調用) */
void *myrealloc(uint8_t memx, void *ptr, uint32_t size); /* 重新分配內存(外部調用) */#endifmain函數添加測試代碼char *str = 0;
mallco_dev.init(SRAMEX);
str = mymalloc(SRAMEX, 50);
if(str)
{sprintf(str, "012345678900123456789001234567890");HAL_Delay(10);//這里因為SDRAM的讀寫需要時間所以一定需要插入一點延時,不然串口無打印信息printf("%s\n",str);myfree(SRAMEX,str);
}
測試結果如下: