stm32内存管理

1.什么是内存管理

内存管理,是指软件运行时对MCU内存资源分配使用的技术。

其最主要目的是:如何高效,快速的分配,并且在适当的时候释放和回收内存资源。

内存使用三部曲:

(1)内存申请(分配)  (malloc函数用于内存申请)

(2)内存使用

(3)内存释放             (free函数用于内存释放)

2. 分块式内存管理

2.1 基本概念

分块式内存管理由内存池内存管理表两部分组成。 内存池被等分为n块,对应的内存管理表,大小也为n,内存管理表的每一个项对应内存池的一块内存。

内存管理表的项值代表的意义:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。
比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10个内存块给外部的某
个指针。

内存分配方向如上图所示,是从顶→底的分配方向。即首先从最末端开始找空内存。当内
存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。

2.2 分配原理

当指针p调用malloc申请内存时

  1. 先判断p要分配的内存块数(m)

  2. 从第n项开始,向下查找,直到找到m块连续的空内存块(即对应内存管理表项为0)

  3. 将这m个内存管理表项的值都设置为m(标记被占用)

  4. 把最后的这个空内存块的地址返回指针p,完成一次分配

注意:如果当内存不够时(找到最后也没有找到连续m块空闲内存),则返回NULLp,表示分配失败。

2.3 释放原理

指针p申请的内存用完,需要释放的时候,调用free函数实现。

  1. 先判断p指向的内存地址所对应的内存块
  2. 找到对应的内存管理表项目,得到p所占用的内存块数目m
  3. 将这m个内存管理表项目的值都清零,标记释放,完成一次内存释放 

 2.4 分块内存管理需要的参数

  1. 内存池大小
  2. 内存块大小
  3. 内存块数 / 管理表项数目
  4. 管理表项大小

3. 内存管理使用 

  1. 初始化内存      void my_mem_init(uint8_t memx)
  2. 申请内存         void *mymalloc(uint8_t memx, uint32_t size)
  3. 操作内存          sprintf((char *)p, "Memory Malloc Test %3d", i)
  4. 释放内存         void myfree(uint8_t memx, void *ptr)

内存管理控制器     struct _m_malloc_dev 

### STM32G030F6P6 微控制器示例代码与项目例程 对于 STM32G030F6P6 的示例代码和项目例程,可以从多个公开资源获取。以下是几个推荐的资源及其详细介绍: #### 1. TFT LCD ST7735 驱动示例 该项目提供了针对 STM32G030F6P6 和 0.96 英寸 TFT LCD 屏幕(ST7735 控制器)的驱动程序[^1]。它包含了初始化屏幕、绘制图形以及显示文字等功能。 - **项目地址**: [GitCode](https://gitcode.com/open-source-toolkit/17e91) - **特点**: - 支持多种分辨率配置。 - 提供完整的 HAL 库接口函数调用说明。 ```c // 初始化 LCD 并设置背景颜色 void lcd_init(void) { // 初始化 GPIO 及 SPI 接口 LCD_SPI_Init(); // 发送命令到 ST7735 进行硬件复位 LCD_Write_Command(0x01); } ``` --- #### 2. DS18B20 数字温度传感器示例 此项目展示了如何通过 STM32G030F6P6 访问 DS18B20 温度传感器,并实现了单总线通信协议[^3]。整个工程基于 STM32CubeIDE 开发环境构建。 - **项目地址**: [GitCode](https://gitcode.com/open-source-toolkit/3aa5f) - **功能模块**: - 单总线数据读取逻辑。 - 实时温度采集并打印至串口调试工具。 ```c // 获取当前温度值 float get_temperature(void) { uint8_t rom_code[8]; float temp; ds18b20_reset(); // 复位总线 ds18b20_match_rom(rom_code); // 匹配设备 ROM 地址 ds18b20_convert_temp(); // 启动转换 delay_ms(750); // 等待转换完成 temp = ds18b20_read_temp(); // 读取温度值 return temp; } ``` --- #### 3. 小型开发板原理图及相关资料 如果需要了解 STM32G030F6P6 的硬件设计细节,可以参考一份开源的小型系统板设计方案[^4]。该方案模仿了经典的 STM32F103C8T6 核心板布局,适合快速搭建原型电路。 - **文档内容**: - PCB 设计文件。 - 关键元器件选型指南。 ![STM32G030F6P6 原理图](https://example.com/schematic.png) --- #### 4. 官方固件库支持 除了上述第三方资源外,还可以利用官方提供的 STM32CubeMX 工具生成基础框架代码。具体操作如下: 1. 打开 STM32CubeMX 软件。 2. 创建一个新的项目,选择目标芯片型号为 `STM32G030F6P6`。 3. 配置所需的外设(如 UART、SPI 或 I2C),然后导出工程模板。 --- ### 总结 以上列举了多个关于 STM32G030F6P6 的实用案例,涵盖了显示屏控制、温度传感以及硬件设计等方面的应用场景。开发者可以根据实际需求挑选合适的参考资料进行学习或移植。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值