自我接触软件编程以来,在嵌入式方面编程所花的时间应该算是最长的吧,一直忍受着不能动态分配内存的困扰。懒惰促使我抓破脑袋去避免使用动态非内存即使可能移植性不好,可能存在隐患,谁叫我大部分都是在作比赛呢。终于在去年11月份写一个大型算法实在忍无可忍,花了一下午时间了解了多年来的夙愿。实现了大部分在标准C的动态内存分配函数(C代码见附件),下面主要实现的函数:
/** @addtogroup System_Exported_Macros
* @{
*/
#define MEM_BLOCK_SIZE 16 ///< 内存块大小为16字节
#define MAX_MEM_SIZE (10*1024) ///< 最大管理内存 10K
/**
* @}
*/
/** @addtogroup System_Exported_Functions
* @{
*/
void atgMemDevInit(void);
void *atgMalloc(uint32_t nSize);
void *atgRealloc(void *pAddr,uint32_t nSize);
float atgMemPerused(void);
void atgMemFree(void *pAddr);
void atgMemcpy(void *pDst, const void *pSrc, uint32_t nSize);
void atgMemset(void *pAddr, uint8_t val, uint32_t nSize);
/**
* @}
*/
还是简单描述一下用法和调用流程吧:使用本模块首先需要在atgManagementLib.h中设定宏MAX_MEM_SIZE和MEM_BLOCK_SIZE定义自由分配内存的大小和内存块的大小。然后调用初始化函数atgMemDevInit初始化整个模块,接下来的使用就和C语言默认的内存分配函数类似了。还是给一个使用实例吧:
int main(void)
{
int *p = NULL;
atgMemDevInit(); ///< 初始化内存管理模块
......
p = (int *)atgMalloc(sizeof(int) * 10); ///< 分配空间
......
atgMemFree(p); ///< 释放空间
......
return 0;
}
好了就到这儿吧,希望对有需求的盆友有帮助。虽然代码是经过严格的测试,但鉴于鄙人才疏学浅,如果BUG还希望大家原谅并给与指正啊,呵呵……
附件下载地址