ARM裸機開發中內存管理庫RT_HEAP的使用

    在使用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

相關文章
相關標籤/搜索