自我接觸軟件編程以來,在嵌入式方面編程所花的時間應該算是最長的吧,一直忍受着不能動態分配內存的困擾。懶惰促使我抓破腦袋去避免使用動態非內存即使可能移植性不好,可能存在隱患,誰叫我大部分都是在作比賽呢。終於在去年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還希望大家原諒並給與指正啊,呵呵……
附件下載地址