zoukankan      html  css  js  c++  java
  • ARM裸机开发中内存管理库RT_HEAP的使用

        在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动态使用

        首先,应该初始化C堆,初始化代码如下

        

    #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_END

    指示的是我们管理的堆的开始地址和结束地址,我的使用是这样(根据实际情况来)

    #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文件哦

  • 相关阅读:
    Miracast
    linux软中断与硬中断实现原理概述
    入门视频采集与处理(BT656简介)
    emms指令在MMX指令中的作用
    linux进程的地址空间,核心栈,用户栈,内核线程
    linux 线程的内核栈是独立的还是共享父进程的?
    进程内核栈、用户栈及 Linux 进程栈和线程栈的区别
    Gson JsonParser的使用
    封装JDBC事务操作,执行存储过程测试
    Oracle 存储过程,临时表,动态SQL测试
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4438078.html
Copyright © 2011-2022 走看看