在使用arm芯片進行裸機開發的時候,不少時候都須要內存管理的功能,咱們能夠使用本身寫的內存管理程序,也能夠直接使用標準庫,不過我通常比較喜歡標準庫,速度快,今天就來講說在C語言環境下怎麼樣進行內存的動態使用函數
首先,應該初始化C堆,初始化代碼以下spa
#include "malloc.h" #pragma import (__use_realtime_heap) //這個函數在rt_heap.h中聲明,須要用戶本身去實現,返回任意值 unsigned __rt_heap_extend(unsigned size, void **block) { return 0; } void MallocInit(void) { _init_alloc(MALLOC_HEAP_ADDRESS_START,MALLOC_HEAP_ADDRESS_END); //初始化堆的範圍 }
這裏面主要是幾個工做,一個是導入運行庫,第二是初始化C堆,其中定義了兩個宏MALLOC_HEAP_ADDRESS_START和MALLOC_HEAP_ADDRESS_ENDcode
指示的是咱們管理的堆的開始地址和結束地址,個人使用是這樣(根據實際狀況來)blog
#define MALLOC_HEAP_ADDRESS_START SDRAM_BASE_ADDR #define MALLOC_HEAP_ADDRESS_END SDRAM_BASE_ADDR+SDRAM_LENGTH unsigned __rt_heap_extend(unsigned size, void **block); void MallocInit(void);
這時候通常還不能編譯過去,由於還須要一個錯誤報告函數,也就是庫出現問題的時候把錯誤信息反饋出來的方式,通常能夠選擇串口打印,以下內存
//加入如下代碼,支持printf函數,而不須要選擇use MicroLIB #pragma import(__use_no_semihosting) //標準庫須要的支持函數 struct __FILE { int handle; }; FILE __stdout; //定義_sys_exit()以免使用半主機模式 _sys_exit(int x) { x = x; } _ttywrch(int ch)//這裏就是咱們要實現 { ch = ch; } //重定義fputc函數 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循環發送,直到發送完畢 USART1->DR = (u8) ch; return ch; }
這樣就可以同時支持printf和動態內存管理了,開發
到這裏,malloc和free函數就可以正常使用了,記得包含stdlib.h文件哦it