IAR icf 理解

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)


你可能感兴趣的:(iar)