不见春山
骑马倚斜桥,满楼红袖招。
Home
Categories
Archives
Tags
About
Home
IAR 分散加载
IAR 分散加载
取消
IAR 分散加载
由
ctaoist
发布于 2019-08-16
·
最后更新:2020-07-13
1
IAR 中的分散加载为 `.icf` 文件,在工程目录的 `config` 文件夹下。 ``` /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20020000; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x200; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; /* 定义一个内存 */ /* 定义两个域 */ define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; /* 添加额外的域 */ define region ROM2 = Mem:[from 0x80000 size 0x20000]; define region ROM2 = Mem:[from 0x80000 size 0x20000] | Mem:[from 0xC0000 size 0x08000]; /* 两片地址合并成一个域 */ /* 定义块 */ define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; define symbol RAM_intvec_start = 0x20000000; initialize by copy { readonly, readwrite }; do not initialize { section .noinit }; /* place sections */ place in ROM {readonly}; /* 将只读段放进 ROM 域 */ place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; /* section 后面的段一般在 .s 文件里定义,将段放到内存的特定地址 */ place at start of ROM {readonly section .vectors}; /* 将段放进域的开头或者结束(last) */ "RAM_intvec_start": place at address mem:RAM_intvec_start { section .intvec_RAM }; "ROM_region": place in ROM_region { readonly }; "RAM_region": place in RAM_region { readwrite, block CSTACK, block HEAP }; ``` ## 声明 Section ``` const short MyVariable @ "MYOWNSECTION" = 0xF0F0; ``` 等价于用汇编语言写: ```asm name createSection section MYOWNSECTION:CONST ; Create a section, dc16 0xF0F0 ; and fill it with dc16 0xF0F0 ; constant bytes. end ``` place section: ``` place in ROM {readonly section MyOwnSection}; ``` ## 初始化:复制 code 到 RAM ``` initialize by copy { rw, section RAMCODE }; /* or */ initialize by copy { readonly, readwrite } except { section .intvec, /* Don’t copy interrupt table */ section .init_array }; /* Don’t copy C++ init table */ ``` 如果想把 `RAMCODE`段放在特定位置,还需要调用 `place` 指令,否则会和别的可读写代码混在一起。 参考资料: 由于 `__low_level_init` 函数(如果存在)在初始化之前被调用,因此它及其所需的任何内容不会从ROM复制到RAM。 `initialize`一般用来初始化变量,但也能用来将代码从ROM拷贝进RAM。 需要初始化的section不受 `initialize by copy` 指令的影响,这包括 `__low_level_init` 函数及其引用的任何内容。 默认认为程序入口标签之后所有内容都被认为是初始化所需的,以 `__iar_init$$done` 开头的标签的section除外。 https://github.com/jameswalmsley/FreeRTOS/blob/master/FreeRTOS/Demo/CORTEX_A9_RZ_R7S72100_IAR_DS-5/IAR/cstartup.s
嵌入式
嵌入式
该博客文章由作者通过
CC BY 4.0
进行授权。
分享
最近更新
群晖升级 ARPL 笔记
本地部署大语言模型
WireGuard 搭建组网教程
LVM 管理
HK1 RBOX X4 电视盒子折腾笔记
热门标签
机器学习
Tensorflow
Linux
VPN
虚拟组网
Router
ROS
嵌入式
C++
C
文章目录
DNSmasq 配置
MDK(Keil) 分散加载