IAR部分问题

常见问题:

(1)芯片上电后在线调试,能够跑到reset_Handler,但是到不了main函数,在某一地址挂死。

原因:

(1)flash RAM大小不匹配,空间不足。修改icf文件及los_config.h里的mem大小。

         总结:

         遇到能够进到reset_Handler中,但是无法到达main函数的问题时,说明启动是OK的,向量表完成了映射,引导了reset_Handler下,无法跳转到main函数,优先考虑芯片选型、flash、RAM大小等是否匹配,以及是否存在过大的数组导致内存不够。

 

(2)Flash download warning: 386104 out of 386104 bytes from data record CODE:[0x08080020,0x080DE457] will not be flashed

        更换jlink即解决该问题。

 

ICF文件知识

1、IAR默认icf路径

D:\Program Files\IAR Systems\Embedded Workbench 7.5\arm\config\linker\ST

 

2、修改ICF文件

工程 -- options -- linker -- config

 

3、icf文件配置

symbol : 指定某个符号的值。

        例: define symbol RAM_START_ADDRESS = 0x40000000;

               define symbol RAM_END_ADDRESS = 0x4000FFFF;

 

memory: 定义一个可编址的存储地址空间(memory)。

        例: define memory mem with size = 4G;

region:定义一个存储地址区域(region)。一个区域可由一个或多个范围组成,每个范围内地址必须连续,但几个范围之间不必是连续的。

   例:define region ROM = MEM:[from 0x0 size 0x10000];

              define region ROM = MEM:[from 0x0 to 0xFFFF];

 

block:定义一个地址块(block)。它可以是个空块,比如堆栈,也可以包含一系列sections。

        例:define block HEAP with size = 0x1000, alignment = 4 { };

              define block MYBLOCK1 = { section mysection1, section mysection2, readwrite };

              define block MYBLOCK2 = { readonly object myfile2.o };

initialize:初始化sections。

initialize { by copy | manually } [ with paramparam... ]

{

    section-selectors

};

参数:

    by copy 在程序启动时自动执行初始化。

    manually 在程序启动时不自动执行初始化。

    param 可以是: packing = { none | compress1 | compress2 | auto }

    copy routine = functionname

    packing表示是否压缩数据,缺省是auto

    functionname表示是否使用自己的拷贝函数来取代缺省函数。

    section-selector 同上

do not initialize

{

section-selectors

};

作用:

规定在程序启动时不需要初始化的sections。一般用于__no_init声明的变量段(.noinit)。

 

 

place at:把一系列sectionsblocks放置在某个具体的地址,或者一个region的开始或者结束处。

例: place at start of ROM { section .cstart }; 

    place at end of ROM { section .checksum }; 

    place at address MEM:0x0 { section .intvec };

 

place in:把一系列sectionsblocks放置在某个region中。sectionsblocks将按任意顺序放置。

例: place in ROM { readonly }; /* all readonly sections */ 

    place in RAM { readwrite }; /* all readwrite sections */

 

/* Place .data, .bss, and .noinit  and STACK */

place in RAM { readwrite, block STACK };

 

text段:就是放程序代码的,编译时确定,只读,

data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写

就是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常量也存放在这个区域

bss段:定义而没有赋初值的全局变量和静态变量,放在这个区域

 

4、#pragma location

        用于定义绝对地址的单个全局或静态变量或数据对象。变量或数据对象必须声明为__no_init或const。这对于必须位于固定地址的个体数据对象非常有用,例如变量、带有外部或内部接口的数据对象或增加的硬件表项。 

        #pragma location=0xfa00     
        const char a=1; 

        把a存到0xfa00

 

5、将warning设为error

options -- C/C++ Compiler -- Diagnostics -- 勾选Treat all warnings as errors

同时可以在Suppress these diagnostics里将部分需要屏蔽的warning类型进行屏蔽处理。

 

 6、浮点功能打开

 

并在SystemInit()中使能。(此函数在system_stm32f4xx.c文件中)

发布了36 篇原创文章 · 获赞 4 · 访问量 7032

猜你喜欢

转载自blog.csdn.net/wangbotao1990/article/details/98845161
今日推荐