STM32减少RAM的占用
STM32减少RAM的占用
在STM32开发中减少RAM占用是优化资源的关键目标。以下是针对性的中文优化策略(附代码示例):
1. 精简数据类型
优先使用小尺寸数据类型:
// 避免:
int counter; // 默认32位(4字节)
// 推荐:
uint8_t counter; // 1字节(范围0-255)
uint16_t buffer_size; // 2字节(范围0-65535)
2. 启用编译器优化
在IDE(如Keil)中:
- 启用 -Os(优化尺寸)
- 关闭调试信息(Release模式)
3. 常量数据存Flash
使用 const 强制存Flash:
const uint8_t FONT_DATA[1024] = { ... }; // 存在Flash(节省1KB RAM)
4. 优化全局变量
- 减少全局变量数量
- 使用局部变量(栈内存自动回收)
- 静态变量只在必需时使用
5. 结构体优化
对齐优化(节省填充字节)
// 优化前(占用12字节):
struct {
uint32_t a; // 4B
uint8_t b; // 1B → +3B填充
uint32_t c; // 4B
} BadStruct;
// 优化后(占用8字节):
struct __attribute__((packed)) { // 取消填充
uint32_t a; // 4B
uint8_t b; // 1B
uint32_t c; // 4B
} GoodStruct;
位域压缩布尔值
struct {
uint8_t flag1 : 1; // 1位
uint8_t flag2 : 1; // 1位
} flags; // 总大小1字节(代替8个bool)
6. 栈与堆配置
修改启动文件(如 startup_stm32fxxx.s):
Heap_Size EQU 0x200 ; 原1KB堆 → 改为512字节
Stack_Size EQU 0x400 ; 原2KB栈 → 改为1KB
7. 复用缓冲区
避免冗余内存分配:
static uint8_t shared_buffer[128]; // 静态共享缓冲区
void Task1() {
memset(shared_buffer, 0, 128);
// 使用缓冲区...
}
void Task2() {
// 同一缓冲区被复用
memcpy(shared_buffer, data, 128);
}
8. 动态内存替代方案
避免 malloc:
- 静态预分配池(减少碎片)
- 环形缓冲代替动态队列
9. 链接脚本优化
自定义 STM32Fxxx_FLASH.ld:
MEMORY {
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K /* 明确RAM边界 */
}
/* 将不常用的段移到特定区域 */
.slow_section (NOLOAD) : {
*(.slow_data)
} > RAM
10. 关键工具
- Map文件分析:查看
projectname.map文件,定位RAM占用最高的模块。 - STM32CubeIDE 内存分析器:实时监控RAM使用。
11. 禁用未使用外设
在 CubeMX 配置中:
- 关闭不需要的外设(UART/I2C等)
- 减少自动生成的DMA/中断相关RAM开销
12. 算法优化
- 改用迭代替代递归(避免栈溢出)
- 使用查表法代替实时计算(用Flash换RAM)
执行顺序建议:
- 用Map文件定位RAM消耗大户
- 优先优化全局数组和结构体
- 调整栈/堆尺寸
- 启用编译器优化
- 复用缓冲区
? 注意:优化后需严格测试栈溢出(通过填充
0xAA模式并监测溢出标记)。
如何显著减少PCB占用空间
要监视更多的传感器。本文将讨论如何显著减少PCB占用空间,增加通道密度以及最大限度地发挥其他组件和功能与TI微型数据转换器高度集成的优势,从而以更小的尺寸创造更多的价值。第一个优点:PCB
STM32:查看程序占用ROM和RAM
) Total RW Size (RW Data + ZI Data) 14120 ( 13.79kB) **-->RAM**Total RO...
资料下载
佚名
2021-12-20 19:17:24
stm32 FATFS文件系统如何减少Flash和RAM占用,FATFS移除中文文件名,FATFS移除动态内存
FATFS减少flash和ram的占用
资料下载
微风挽雨
2021-12-08 14:21:10
IAR for STM8 如何查看程序占用flash和RAM的大小
,这款mcu的Flash为8K字节,RAM为1K字节。IAR for STM如何查看占用空间大小在Build窗口右击,选择“All”。编程链接后,出现如图的信息。其中,7306 字节的readonly code me
资料下载
48674
2021-12-02 09:21:09
如何计算STM32程序占用的内存容量
STM32中程序占用内存容量Keil MDK下Code, RO-data,RW-data,ZI-data这几个段:Code存储程序代码。RO-data存储const常量和指令。RW-data存储
如何显著减少PCB占用空间?
随着系统尺寸越来越小,每平方毫米的印刷电路板(PCB)面积都至关重要。与此同时,随着对数据需求的增加,则需要监视更多的传感器。 本文将讨论如何显著减少PCB占用空间,增加通道密度以及最大限度地发挥其他组件和功能与TI
FreeRTOS如何减少RAM占用空间并加快执行速度?
之前分享了《FreeRTOS V10.4.0更新了哪些功能?》,今天就来详细讲述其中的一个知识点:FreeRTOS的直接任务(消息)通知,这样做的目的就是减少RAM
2020-10-14 14:52:49
请问邮箱什么时候占用RAM和释放RAM?
ucosii启动两个任务分别在不同的.c中,两个任务通过邮箱传递数据,uCOSII消息邮箱的变量为.c局部静态变量,求教邮箱什么时候占用RAM和释放RAM
怎么去掉程序里的外部RAM让程序占用的RAM减小?
编绎显示占用了接近400K的RAM,关于动态内存管理我不怎么明白,程序里初始化了三块RAM,但好像外部的内存池在程序里没用到我现在要把原子的例程
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机