物联网操作系统学习笔记——内存管理

本文探讨了STM32程序的编译过程,解析了.map和.hex等文件,强调了内存管理的重要性。文章详细介绍了静态与动态内存的区别,并分析了C标准库动态内存分配的不足。在STM32系统中,由于缺乏虚拟内存机制和有限的RAM,内存管理成为关键。FreeRTOS提供了多种内存管理方案,如heap_1到heap_5,其中heap_4支持分配、释放和内存碎片管理。文章最后讨论了heap_4内存管理的实现细节和实验需求。
摘要由CSDN通过智能技术生成

FreeRTOS内存管理

STM32编译过程及程序组成

在这里插入图片描述
source code(源代码)的c文件和汇编S文件通过Keil中的armcc/armasm生成.o文件(Object code),然后再通过armlink工具生成.axf文件(镜像文件,可通过ST-link进行烧录)再通过fromelf生成.bin/.hex文件
程序的组成、存储与运行
在这里插入图片描述
左边是C程序组成,右边是STM32程序组成
text:是的代码段:RAM.以上是数据段:ROM

程序存储
在这里插入图片描述
生成反汇编指令 fromelf --text -c --output LedTask\LedTask.text LedTask\LedTask.axf

在这里插入图片描述
MDK生成的主要文件分析
map文件分析
在这里插入图片描述
SCT文件分析
在这里插入图片描述
hex文件分析
在这里插入图片描述
bin文件分析
生成bin文件 fromelf --bin --output LedTask\LedTask.bin LedTask\LedTask.axf
在这里插入图片描述

内存管理概念及其应用

静态内存和动态内存的区别
静态内存:
静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。
程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会
自动释放所占用的内存空间。
变量的分配与释放,都无须程序员自行考虑。
在这里插入图片描述
动态内存:
动态内存分配是按输入信息的大小分配所需要的内存单元,他的特点是按需分配,内存分配在堆区。
用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配。
在这里插入图片描述
区别
时间不同:
静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。
空间不同:
堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数malloc进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。

C标准库-动态内存分配接口

#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);

C标准库动态内存的缺陷
1、这些函数在小型嵌入式系统中并不总是可用的,小型嵌入式设备中的 RAM 不足。
2、它们的实现可能非常的大,占据了相当大的一块代码空间。
他们几乎都不是安全的。
3、它们并不是确定的,每次调用这些函数执行的时间可能都不一样。
4、它们有可能产生碎片。
5、这两个函数会使得链接器配置得复杂。
6、如果允许堆空间的生长方向覆盖其他变量占据的内存,它们会成为 debug 的灾难。

STM32系统内存分配需求
没有虚拟内存机制,需要用户亲自管理。
对内存的分配时间要求更为苛刻,分配内存的时间必须是确定的
RAM比较小,需要比较好的内存分配算法解决内存碎片问题

在这里插入图片描述
FreeRTOS动态内存分配
在这里插入图片描述
heap_1:只能分配,不能释放

在这里插入图片描述
heap_2:支持分配也支持释放,但没有内存碎片管理
在这里插入图片描述
heap_3:封装C库的malloc和free。添加了线程保护
heap_4:有分配有释放有管理。
在这里插入图片描述
heap_5:可以扩展外部ram

内存管理函数应用

实验需求
在这里插入图片描述
API
在这里插入图片描述

void Delay_Task(void const * argument)
{
   
  /* USER CODE BEGIN Delay_Task */
	EventBits_t KeyEventBits;
	uint8_t *HeapBuf = NULL;
  /* Infinite loop */
  for(;;)
  {
   
	  /*
		1、修改事件标志组等待状态为 触发后清除标志
		2、检测按键,处理相关功能	  
	  */
	  KeyEventBits = xEventGroupWaitBits(KeyEventGroup,
								KEY3_EVENT_BIT|KEY4_EVENT_BIT|KEY5_EVENT_BIT|KEY6_EVENT_BIT,
								pdTRUE,
								pdFALSE,
								portMAX_DELAY);
	  printf("Key is Down Key Event Bit is %x\r\n",KeyEventBits);
	  switch(KeyEventBits){
   
		  case KEY3_EVENT_BIT:
			  if(HeapBuf == NULL){
   
				HeapBuf = pvPortMalloc(100);
			  }
			  else{
   
				printf("plese press K4 free!\r\n");
			  }				
			break;
		  case KEY4_EVENT_BIT:
			  if(HeapBuf != NULL){
   
				vPortFree
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值