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》

相关推荐
Code_Solitude2 小时前
开发板点灯实验源码
stm32·单片机·嵌入式硬件
炸膛坦客13 小时前
单片机开发工具篇:(十四)配置输出 .map 文件及其本地路径
c语言·单片机·嵌入式硬件
笨笨饿14 小时前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网
hahaha601616 小时前
色彩恒常性概述
人工智能·嵌入式硬件·数码相机·计算机视觉
我叫洋洋16 小时前
Cadence CIS 元器件库合并实战:3000+ 焊盘、156 个符号零冲突并入自有库
数据库·单片机·嵌入式硬件·oracle·电路
hahaha601617 小时前
Shades-of-Gray (SoG) 算法--白平衡算法
人工智能·嵌入式硬件·算法·计算机视觉
ebiobiz17 小时前
极海 APM32 使用 Nimmake 编译指南
c++·python·单片机·嵌入式硬件·mcu
小神兵18 小时前
对电压源与电流源的的简单理解
单片机·嵌入式硬件·物联网
comyccccc19 小时前
三极管与MOS管工作原理全解析学习笔记
单片机·嵌入式硬件
FPGA小徐20 小时前
运放电路:负载必须接地时,如何做电流采样(浮地负载 vs 接地负载)
单片机·嵌入式硬件