不见春山
骑马倚斜桥,满楼红袖招。
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 笔记
本地部署大语言模型
LVM 管理
HK1 RBOX X4 电视盒子折腾笔记
使用usbip网络转发usb设备到远程主机
热门标签
机器学习
Linux
Router
ROS
Tensorflow
VPN
虚拟组网
ARM
Latex
zerotier
文章目录
DNSmasq 配置
MDK(Keil) 分散加载