内存空间分配
系统启动过程
裸机代码启动顺序
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)