IAR下如何同时指定section的LMA和VMA

目的:

简要介绍IAR下如何同时指定section的LMA(加载地址,ROM)和VMA(运行地址,RAM)。

操作说明:

修改 icf文件,新增 my_test_section 、my_test_section_init 布局。

1, 使用编译器自动生成的拷贝方法:

icf文件修改前后对比:

通过这种方式可手动指定section的存放地址(如这里的ROM_region_2)和 运行地址 (如这里的RAM2_region_2)

测试代码示例:

cpp 复制代码
...

__attribute__(( section( "my_test_section"))) uint8_t test_arr[4] = {0x11, 0x22, 0x33, 0x44};

int main(void)
{
    ...
    
    for(uint8_t i = 0; i < 4; i++)
    {
      INFO("0x%X\n", test_arr[i]);
    }
    
    ...
}

2,使用手动拷贝:

icf文件修改前后对比:

cpp 复制代码
...

__attribute__(( section( "my_test_section"))) uint8_t test_arr[4] = {0x11, 0x22, 0x33, 0x44};

#pragma section = "my_test_section"
#pragma section = "my_test_section_init"

int main(void)
{
    ...
    
    // 从LMA拷贝到VMA
    memcpy((uint8_t*)__section_begin("my_test_section"), 
    (uint8_t*)__section_begin("my_test_section_init"), 
    __section_size("my_test_section_init"));
    
    for(uint8_t i = 0; i < 4; i++)
    {
      INFO("0x%X\n", test_arr[i]);
    }
    
    ...
}

原理解释:

《EWARM_DevelopmentGuide.ENU.pdf》

从上可知,默认情况下,在链接阶段,一个section(如这里的my_test_section)会被分成两个section来进行初始化,原名称的section(如这里的my_test_section)按照之前设定的初始化方式进行初始化,新创建一个section,名称为原名称+_init后缀(如这里的my_test_section_init)用来存放初始值,放在ROM区域。

如上针对运行在RAM上保存在ROM上的section才有意义,对于存放和使用都在ROM没有意义(如const 类型数据)。

前面的示例就是显式的指定了section同名+_init 的 section的存储布局来指定在ROM上存放位置的方式。

参考:

《EWARM_DevelopmentGuide.ENU.pdf》

相关推荐
LuminousCPP2 小时前
嵌入式-51单片机入门(三)-数码管驱动:从单管点亮、多位扫描到动态刷新与消隐原理
笔记·单片机·嵌入式硬件·51单片机
小柯博客2 小时前
01 · 点亮 STM32MP25 的硬件视频编解码:VPU 与那些“安静“的坑
c语言·笔记·stm32·单片机·嵌入式硬件·嵌入式·视频编解码
自小吃多2 小时前
Capture软件原理图PDF输出笔记
笔记·嵌入式硬件
花月mmc3 小时前
Arduino UNO R4 ——电压电流数据显示
嵌入式硬件·mcu·物联网
恒锐丰小瑞16 小时前
率能SS8841T 40V/2.5A/双通道H桥驱动芯片,PWM控制接口与低导通电阻(350mΩ),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·机器人
zcmodeltech16 小时前
钢铁冶金沙盘模型控制系统设计与实现:高炉-连铸-热轧多工序联动方案
分布式·stm32·单片机·嵌入式硬件·交互
徽京人18 小时前
VS Code 接入Esp 32步骤
vscode·单片机·嵌入式硬件
QH1392923188019 小时前
Keysight N5183B N5183B 微波模拟信号发生器
网络·单片机·嵌入式硬件·集成测试·信息与通信
笨笨饿19 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim