RT-Thread的内存空间分配

内存空间分配

系统启动过程

裸机代码启动顺序

SystemInit() --> Main()用户主函数

RT-Thread启动顺序

SystemInit --> $Sub$$main() --> rtthread_startup() --> rt_application_init() --> main_thread_entry --> $Super$$main用户主函数

简述堆栈

栈(stack):由编译器自动分配释放;

堆(heap):一般由程序员分配和释放。

//在C语言中堆栈的使用

int a = 0;	//全局初始化区
char *p1;	//全局未初始化区
main()
{
    int b;	//栈
    char s[] = "abc";	//栈
    char *p2;	//栈
    cahr *p3 = "123456";	//123456\0在常量区,p3在栈上
    static int c = 0;	//全局(静态)初始化区
    p1 = (char *)malloc(10);	//堆
    p2 = (char *)malloc(20);	//堆
}

分配释放空间

在文件夹Drivers下的board.c文件中有STM32初始函数

/**
 * This function will initial STM32 board.
 */
void rt_hw_board_init(void)
{
    HAL_Init();
    SystemClock_Config();
#ifdef RT_USING_HEAP
    //#define HEAP_BEGIN  ((void *)&Image$$RW_IRAM1$$ZI$$Limit)	内存块起始地址
    //#define HEAP_END    STM32_SRAM_END	内存块结束地址
    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
#ifdef RT_USING_CONSOLE
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
}

一个小例子

//按2的阶乘分配释放空间
void thread1_entry(void *parameter)
{
    int i;
    char *ptr = RT_NULL; //内存块的指针

    for (i = 0; ; i++)
    {
        //每次分配 (1 << i) 大小字节数的内存空间
        //rt_malloc()	RT-Thread分配堆空间函数
        ptr = rt_malloc(1 << i);

        /* 如果分配成功 */
        if (ptr != RT_NULL)
        {
            //rt_kprintf()	RT-Thread中的打印语句
            rt_kprintf("get memory :%d byte\n", (1 << i));
            
            //释放内存块
            //rt_free()	RT-Thread中的内存释放函数
            rt_free(ptr);
            rt_kprintf("free memory :%d byte\n", (1 << i));
            ptr = RT_NULL;
        }
        else
        {
            rt_kprintf("try to get %d byte memory failed!\n", (1 << i));
            return;
        }
    }
}

空间分配流程

p =rt_malloc(10);		//分配空间
if(p == RT_NULL):...	//检查是否申请到空间    
//rt_memset()	内存复位函数
//内存分配成功一般会先将内存空间清零(内存复位)
rt_memset(p,0,10);		//内存复位

注:为防止内存泄漏问题产生,一般将rt_malloc()和rt_free()配合使用。

其它空间分配方法

根据不同需求,也有几种不同的空间分配函数rt_realloc()rt_calloc()

//重新申请内存空间,原有基础上增加或截取
void *rt_realloc(void *rmen, rt_size_t newsize)
//生成count个size的连续内存空间    
void *rt_calloc(rt_size_t count, rt_size_t size)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值