启动过程
在裸机当中,程序的启动顺序是
在RT-Thread当中程序的启动顺序是
动态内存堆的使用
我们经常会听到堆栈的提法,那堆栈简单来说:
栈(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的一款启动文件中包含堆栈大小
有了这些就可以进行堆的操作
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);
从内存堆中分配多个连续内存地址的内存块