概述
本文简单探讨了ROM/RAM的的组成和一般优化的方法,通过本文可以快速建立ROM和RAM的基本认识,并了解ROM/RAM优化的基本方向和注意点。
背景
项目中需要降本增效,因而需要选择同系列更有性价比的MCU型号,但不可避免带来的问题就是更加有限的硬件资源,ROM由原来的1MB变为500KB, RAM大小由原来的124KB变为512KB。在上述硬件资源的约束条件下,需要将原来的AutoSar平台迁移到新的硬件平台上。而实际上原有平台ROM已经使用了600KB, RAM已经使用了100KB,看起来似乎是不太可能完成的任务。
ROM/RAM的组成
参照之前一篇文章如何评估软件模块的堆栈大小概述的第一张图,ROM (Flash)主要由中断向量表、代码区和常量区(这里是值,变量在data段)组成,而RAM主要由初始化的全局变量(data段)、未初始化的全局变量(bss段)、堆区和栈区。
ROM | RAM |
---|---|
中断向量表、代码区、常量区 | data区、bss区、堆栈 |
基本上所有的MCU内存分区都由上述几个方面组成,不同的芯片或者编译器可能叫法会有些许差异。
以S32K146为例,其内存分布如下:
MEMORY
{
/* Flash */
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x000FFBF0
/* SRAM_L */
m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000
/* SRAM_U */
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x0000F000
}
/* Define output sections */
SECTIONS
{
/* The startup code goes first into internal flash */
.interrupts :
{
__VECTOR_TABLE = .;
__interrupts_start__ = .;
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
__interrupts_end__ = .;
. = ALIGN(4);
} > m_interrupts
.flash_config :
{
. = ALIGN(4);
KEEP(*(.FlashConfig)