6.堆(动态内存 heap)的初始化和使用

堆:先进先出 FIFO:First in first out  手动分配、释放
栈:后进先出 FILO:First in last  out  自动分配释放

裸机情况下使用动态内存heap:在启动文件(startup_stm32f103xe.s)中调整:
Heap_Size       EQU     0x00000200
然后用malloc()获取

在RT-Thread中,如果在rtconfig.h中定义了RT_USING_HEAP,在rt_hw_board_init()函数中会有一段初始化代码

#ifdef RT_USING_HEAP
    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif

API:

int *P;
p=rt_malloc(10)
rt_free(p)//rt_malloc,rt_free要配合使用
rt_memset(p,1,1)//给P的前1个字节赋值为1
mem_check(p,1,1)//检查是否赋值成功
rt_realloc(20);//发现获取10字节的内存不够用,重新获取内存块为20字节,此时P为20字节
rt_calloc(10,4)//获取10*4的内存,10块内存区域,每块大小为4
warning:如果使用完动态内存之后不释放(rt_free),那么可能会导致内存泄漏、溢出。
获取系统使用的最大head:在finshshell中输入free指令;
warning:如果使用完动态内存之后不释放(rt_free),那么可能会导致内存泄漏、溢出。

获取系统使用的最大head:在finshshell中输入free指令;

\ | /
- RT -     Thread Operating System
 / | \     3.0.4 build Jun 14 2018
 2006 - 2018 Copyright by rt-thread team
msh >free
total memory: 43040  //总动态内存
used memory : 4872	 //已使用
maximum allocated memory: 7072//运行过程中最多占用内存
msh >
动态内存有什么用呢?静态分配不好吗?

其实静态分配也可以

int table,table2[5];
int * p1,*p2;
p1=&table;
p2=table2;

这种静态分配的方式也可以,但是,如果我的ram只有96K,程序A分配50K静态内存,程序B也需要分配50K内存,那么就出问题了,内存不够用,如果程序A、B使用动态内存分配,即A/B程序在运行时动态申请内存,运行完之后释放掉内存,那么程序就能正常运行了.

附上一个例子:

#include 
/* 线程TCB和栈*/
struct rt_thread thread_malloc;
char thread_malloc_stack[512];

/* 线程入口*/
void thread1_entry(void* parameter)
{
    int i;
    char *ptr[20]; /* 用于放置20个分配内存块的指针*/

    /* 对指针清零*/
    for (i = 0; i < 20; i ++) ptr[i] = RT_NULL;

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

            /* 如果分配不成功*/
					if(RT_NULL==ptr)
					{
						rt_kprintf("memory alloc failed");
						
					}
					 /* 如果分配成功*/
            if (ptr[i] != RT_NULL)
            {
                rt_kprintf("get memory: 0x%x\n", ptr[i]);
								rt_thread_delay(10);
                /* 释放内存块*/
                rt_free(ptr[i]);
                ptr[i] = RT_NULL;
            }
        }
    }
}

extern int rt_application_init1()
{
    rt_err_t result;

    /* 初始化线程对象*/
    result = rt_thread_init(&thread_malloc,
        "thread_malloc_stack",
        thread1_entry, RT_NULL,
        &thread_malloc_stack[0], sizeof(thread_malloc_stack),
        15, 100);

    if (result == RT_EOK)
        rt_thread_startup(&thread_malloc);

    return 0;
}

你可能感兴趣的:(RT-Thread学习笔记)