RT-Thread-01-动态内存

启动过程

在裸机当中,程序的启动顺序是

在RT-Thread当中程序的启动顺序是
RT-Thread-01-动态内存_第1张图片

动态内存堆的使用

我们经常会听到堆栈的提法,那堆栈简单来说:
栈(stack):由编译器自动分配和释放的内存空间;
堆(heap):由程序员在程序中分配和释放的内存空间;

int a1 = 10;//全局初始化区域
char *ptr1; //全局未初始化区
main()
{
	int a2;//栈
	char str[] = "abc";//栈
	char *ptr2 ; //栈
	char *ptr3 = "123456";//123456\0在常数区,ptr2在栈区
	static int c = 0;//在全局静态初始化区
	ptr1 = (char*)malloc(10);//堆区
	ptr2 = (char*)malloc(20);//堆区
}

STM32的一款启动文件中包含堆栈大小
RT-Thread-01-动态内存_第2张图片
有了这些就可以进行堆的操作

char* p;
p = (char*)malloc(10);
free(p);

在board.c中

rt_system_heap_init((void *)HEAP_BEGIN,(void *)HEAP_END);
其中,
HEAP_BEGIN = (void *)&Image$$RW_IRAM1$$ZI$$Limit
HEAP = 0x20000000 + STM32_SRAM_SIZE * 1024
Image$$RW_IRAM1$$ZI$$Limit是链接器导出的符号,代表ZI段的结束,也就是程序执行区在RAM中结束的地址,也可以说是执行区在RAM中未使用区域的起始地址。
Total RW + heap size = MCU total RAM size
-----------------------------------------------
这时可以使用:
char* p;
p = (char*)rt_malloc(10);
rt_free(p);

官方示例代码:

/* 
 * Copyright (c) 2006-2018, RT-Thread Development Team 
 * 
 * SPDX-License-Identifier: Apache-2.0 
 * 
 * Change Logs: 
 * Date           Author       Notes 
 * 2018-08-24     yangjie      the first version 
 */ 
 
/*
 * 程序清单:动态内存管理例程
 *
 * 这个程序会创建一个动态的线程,这个线程会动态申请内存并释放
 * 每次申请更大的内存,当申请不到的时候就结束
 */
#include <rtthread.h>

#define THREAD_PRIORITY      25 //线程优先级
#define THREAD_STACK_SIZE    512 //栈空间大小
#define THREAD_TIMESLICE     5 //时间片运行(系统)时间的大小

/* 线程入口 */
void thread1_entry(void *parameter)
{
    int i;
    char *ptr = RT_NULL; /* 内存块的指针 */

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

        /* 如果分配成功 */
        if (ptr != RT_NULL)
        {
            rt_kprintf("get memory :%d byte\n", (1 << i));
            /* 释放内存块 */
            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;
        }
    }
}

int dynmem_sample(void)
{
    rt_thread_t tid;

    /* 创建线程1 */
    tid = rt_thread_create("thread1",
                           thread1_entry, RT_NULL,
                           THREAD_STACK_SIZE,
                           THREAD_PRIORITY,
                           THREAD_TIMESLICE);
    if (tid != RT_NULL) //判断线程是否创建成功
        rt_thread_startup(tid); //创建成功后,启动对应线程

    return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(dynmem_sample, dynmem sample);

补充:
void * rt_realloc(void *rmem , rt_size_t newsize);
在已分配的内存块的基础上重新分配内存,小于原来的部分截断,共同的部分中数据不变
void *rt_calloc(rt_size_t count , rt_size_t size);
从内存堆中分配多个连续内存地址的内存块

你可能感兴趣的:(mcu)