ICF一些参考资料:
1.EWARM_DevelopmentGuide.ENU.pdf iar官网可以下载
2.http://blog.csdn.net/hitxiaya/article/details/6607075
3.http://blog.chinaaet.com/jihceng0622/p/27024
一、基本概念
以上基本解决了各种概念问题,重点的几个关键字重新罗列如下,示例来自kinetisk66的icf
1.可编址的存储空间(memory)
现在一般都是32bit,所以定义为4G,一般不用改
参考定义:
definememory MEM with size = 4G;
2.不同的存储器地址区域(region)
对应数据手册找到ram和rom的总线地址,对应写就好了
参考定义:
defineregion DATA_region = mem:[from 0x1FFF0400 to 0x1FFFFFFF];
3.不同的地址块(block)
block我理解的是memory中的一个地址块,即memory包含了多个block。
参考定义:
define block CSTACK with alignment = 8, size =__size_cstack__ { };
define block HEAP with alignment = 8, size = __size_heap__ { };
4. Section的初始化与否
这个其实就是C程序中需要定义变量,以下会给出示例。
5. Section在存储空间中的放置
可以使用place关键字来定义section具体放在是地方,如下
/*将CSTACKHEAP section放在DATA_region区域*/
place in DATA_region { readwrite, block CSTACK, block HEAP};
二、实例操作
下载了icf文件后,实例demo中已经有了icf。但是此时需要使用外扩的1M*16bit的sram该如何操作呢,sram以总线形式接入MCU,对应地址为0x80000000~ 0x80200000-1
修改思路:
1. 修改icf
2. Main.c中以C语言的形式定义变量
3. Main()执行前要先初始化好硬件部分。
1. 修改icf
/*定义变量*/
define symbol __ICFEDIT_region_BD_RAM_start__ =0x80000000;
define symbol __ICFEDIT_region_BD_RAM_end__ =0x80200000-1;
/*定义外部存储器的区域地址*/
define region BD_RAM_region = mem:[from__ICFEDIT_region_BD_RAM_start__ to __ICFEDIT_region_BD_RAM_end__];
/*定义section的区块存在外部ram*/
place in BD_RAM_region {readwrite section .bdsram};
/*初始化定义在外部ram的数据*/
initialize by copy { readwrite, section .bdsram };
2. main.c中以C语言的形式定义变量
#define SRAM_BD_DATA_SECTION \
SECTION(".bdsram")
SRAM_BD_DATA_SECTION char myString[1024*256] ={1,2,3,4,5,6,7,8,9,0};
int main(void)
{
printf(“%d”,myString[0]);
return0;
}
3. Main()执行前要先初始化好硬件部分。
查看startup.s文件,如下,在init_data_bss()函数的最后部分加入初始化硬件,总线初始化操作语句即可。
Reset_Handler
CPSID I ; Mask interrupts
LDR R0,=_NVIC_ICER0 ; Disable interrupts andclear pending flags
LDR R1, =_NVIC_ICPR0
LDR R2, =0xFFFFFFFF
MOV R3, #8
_irq_clear
CBZ R3,_irq_clear_end
STR R2, [R0],#4 ; NVIC_ICERx - clear enable IRQregister
STR R2, [R1],#4 ; NVIC_ICPRx - clear pendingIRQ register
SUB R3, R3, #1
B _irq_clear
_irq_clear_end
LDR R0, =SystemInit
BLX R0
LDR R0, =init_data_bss
BLX R0
CPSIE I ; Unmask interrupts
LDR R0, =__iar_program_start
BX R0
PUBWEAK NMI_Handler
SECTION.text:CODE:REORDER:NOROOT(1)