IAR中新建工程中相关配置---最容易出错的地方
IAR 编译错误信息表
编译错误信息表15 ‘,’or’)’expected(预待’,’或‘)’) 编译器发现函数定义头部或宏定义的句法无效16 Identifier expected(期待识别符) 在声明、goto语句或预处理器行中丢失识别符17 Space or tab expected(期待空格或制表符) 必须用制表或空格字符把预处理器参数与伪指令隔开。
18 Macro parameter ‘name’ redefined(宏参数‘name’被重定义) #define语句中符号的形式参数被重复19 Unmatched #else,#endif或#elif(不匹配的# else,#endif 或#elif) 致命错误。
丢失了#if,#ifdef或#ifdef20 No such pre-processor command:’name’(无这样的预处理命令)#后随未知的识别符21 Unexpected token found in pre-processorline(在预处理器行中发现未预期的记号)在读参数部分之后预处理器行不空。
22 Too many nested parameterized macro(maxis50)(嵌套参数化宏太多)致命错误。
预处理器极限被超过。
23 Too many active macro parameters(max is250)(有效宏参数太多(最大为250))致命错误。
预处理器极限被超过。
24 Too deep macro nestiong(max is 100)(宏嵌套太深(最大为100))致命错误。
预处理器极限被超过。
25 Macro ‘name’called with too manyparameters(用太多的参数调用宏‘name’) 致命错误。
用比声明更多的参数调用参数化的#define宏。
26 Actual macro parameter too long(max is512)(实际宏参数太长(最大为512)单个宏参数不能超过源代码行的长度27 macro ‘name’called with too fewpatameters(用太少的参数调用宏‘name’) 用比声明更少的参数调用参数化#define宏28 Missing #endif(遗漏#endif) 致命错误。
IAR编译错误总结之大全12345
IAR编译错误IAR中的error[27](2009-09-23 10:19:05)转载分类:嵌入式_etung标签:嵌入式_etungit发现IAR的链接器不允许在头文件中定义一个全局变量,然后有两个.c文件去引用。
而VC6.0就可以这样做。
所报错误示例为:Error[e27]: Entry "tagData" in module Wmmp ( E:\work\MiniFrame\PRJ\LED200_W4\IAR\Debug_in_flash\Obj\Wmmp.r79) redefined in module app ( E:\work\MiniFrame\PRJ\LED200_W4\IAR\Debug_in_flash\Obj\app.r79 )将头文件中变量前加上extern 后即不再报错。
程序编译时出现以下错误,实在不知道是什么原因,特向大家请教!Error[Pe223]: function "assert_param" declared implicitly E:\涡街流量计\设计\板2\程序\dft02\library\src\stm32f10x_nvic.c 351Error[Pa045]: function "assert_param" has no prototype E:\涡街流量计\设计\板2\程序\dft02\library\src\stm32f10x_rcc.c 500Error[Pe223]: function "assert_param" declared implicitly E:\涡街流量计\设计\板2\程序\dft02\library\src\stm32f10x_rcc.c 530第一你用了中文文件夹第二没有定义assert_param这个函数不太明白,assert_param函数在stm32f10x_conf.h中已经定义了。
IAR常见问题
IAR常见问题
1、关于IAR
(1)、使用IAR时出现这种问题
需要右键选择options---linker,改一下路径就可以了,那个icf 文件为fire_ROM_K60N512,在程序文件夹里有。
即“第十一届飞思卡尔智能车光电组\build\config files”中的fire_ROM_K60N512然后点确定就可以了。
(2)、下载完程序无法设置断点,只需要把这个勾去掉重新编译下载一次,在重新打一次勾进行编译下载即可。
(3)、有时出现这种问题,缺少ADC的文件夹
原因是路径中没有找到,需要添加该文件所在的文件夹路径,解决办法:
添加$PROJ_DIR$\..\..\src\drivers\adc同理,缺少其他文件也是这么解决
(4)、一些常用设置
(5)、使用IAR编译效率快,在IAR中一定要注意各种变量的定义,unsigned char与unsigned
short int的使用界限,如果超过了255,就不要用unsigned
char了,尤其是在图像采集存到数组中时。
正交解码功能用s16型变量,即typedefshortints16;直接读取即可,就能测出正反转。
2、在直道上小车靠一边跑,多半是安装不正,靠右跑把摄像头靠右掰。
3、加权值的选择,这个其实只要是近小远大就可以了,跑的过于切弯或是其他问题,多是中线没提取好或是有效行判断错误或是P大了。
4、如出现这种现象(白赛道变黑了),是摄像头数据口的排线断了。
IAR软件错误调试
使用IAR时遇到的一些Error、Waring/sendoc/blog作为菜虫,在使用IAR的时候编写CC2430、、Z-Stack2006程序会遇到如下一些错误,当然随着学习的深入,我会持续更新。
1Q:Error[e16]: Segment XDATA_Z (size: 0x19a1 align: 0) is too long for segment definition. At least 0xe4c more bytesneeded. The problem occurred while processing the segment placement command"-Z(XDATA)XDATA_N,XDATA_Z,XDATA_I=_XDATA_START-_XDATA_END", where at the moment ofplacement the available memory ranges were "XDATA:f1ff-fd53"Reserved ranges relevant to this placement:XDATA:f000-f1fe XSTACKXDATA:f1ff-fd53 XDATA_NBIT:0-7 BREGBIT:80-97 SFR_ANBIT:a8-af SFR_ANBIT:b8-c7 SFR_ANBIT:d8-df SFR_ANBIT:e8-ef SFR_ANA:其实这个问题并不是你的程序本身有问题,主要是因为你编写的程序太大了,超出了芯片本身的定义。
今天在群里学习了一招,就是将数组定义到code里,我们看一下例子。
我们定义一个5100个元素的数组,有以下两种方法:mermaid提出的方法是:typedef unsigned char const __code INT8U;extern INT8U shuzi[5100];文晶提出的方法是INT8U code shuzi[5100];这两种方法其实效果是一致的,定义完数组之后,调用的部分就是需要用指针来调用数组里面的数值了。
IAR相关问题处理办法,及其注意事项
问题一:IAR中如何做位定义,位操作以前在STVD中,使用如下语句做位定义_Bool L1 @PA_ODR : 6; //数码管个位, 低电平点亮_Bool L2 @PA_ODR : 5; //数码管十位, 低电平点亮_Bool L3 @PA_ODR : 4; //数码管百位, 低电平点亮但是同样的语句在IAR中不能用了,编译时报错。
后来,查看IAR中的头文件 "iostm8s207rb.h",看到如下语句/*-------------------------------------------------------------------------* Port A bit fields*-----------------------------------------------------------------------*/#ifdef __IAR_SYSTEMS_ICC__#define PA_ODR_ODR0 PA_ODR_bit.ODR0#define PA_ODR_ODR1 PA_ODR_bit.ODR1想想看:既然可以用PA_ODR_ODR1来指定某个位,那么我再将某个位用define重新定义为我想要的名字不就可以了吗?心动不如行动,于是写下如下语句:#define Sound_K PA_ODR_ODR6; //语音控制K原本以为十拿九稳,肯定能编译通过,结果现实狠狠地教训了我一下,报错!Error【Pe029】:expected an expression我百思不得其解,以为IAR不支持这种重复定义的方式,于是换用bool,_Bool, _bool, bit ......各种方法尝试,结果均以失败告终,事情似乎走到了尽头。
最后,抱着试一试的想法,我把原头文件中的语句#define PA_ODR_ODR6 PA_ODR_bit.ODR6换成#define Sound PA_ODR_ODR6 //语音控制K结果,编译通过了,我真是泪流满面啊,没想到问题解决了。
IAR编译错误总结
IAR编译错误总结1. 错误:"undefined reference to"(未定义引用错误)解决方法:这种错误通常是由于函数或变量的定义缺失导致的。
可以检查一下函数或变量的定义是否正确,并确认是否包含正确的头文件。
2. 错误:"no such file or directory"(文件或目录不存在错误)解决方法:这种错误通常是由于指定的文件或目录不存在而导致的。
可以检查一下路径是否正确,并确认文件或目录是否存在。
3. 错误:"multiple definition of"(多重定义错误)解决方法:这种错误通常是由于同一个函数或变量在多个源文件中被定义而导致的。
可以通过在定义函数或变量的地方加上关键字 "extern"来解决这个问题。
4. 错误:"expected ';' before"(在之前缺少分号错误)解决方法:这种错误通常是由于在行代码中缺少了分号导致的。
可以检查一下代码,并确保每一行的末尾都有分号。
5. 错误:"syntax error"(语法错误)解决方法:这种错误通常是由于书写的代码有语法错误导致的。
可以仔细检查代码,并确保每个语法元素(如括号、引号等)都是成对出现的。
6. 错误:"cannot open source file"(无法打开源文件错误)解决方法:这种错误通常是由于指定的源文件无法被找到或打开而导致的。
可以检查一下路径是否正确,并确认源文件是否存在。
7. 错误:"too few arguments to function"(函数参数数量过少错误)解决方法:这种错误通常是由于调用函数时传递的参数数量少于函数定义时所需的参数数量导致的。
可以检查一下函数调用处的参数数量,并确保和函数定义处的参数数量一致。
使用_IAR_FOR_AVR_时需要注意的几个地方
在AVR 所有的编译器中,IAR for AVR 是编译效率最高的编译器, 但是相对来说IAR for AVR 的设置项也非常多,如果使用不当反而会出现很多莫名其妙的问题.一. 关于堆栈的设置问题GCC 和IAR 分配堆栈的方式不同,IAR 先分配堆栈空间,相当于定义一个全局数组为堆栈空间,堆栈初始为堆栈空间最高地址;GCC 不用先分配堆栈,自动把RAM 剩余空间作为堆栈空间,堆栈初始为RAM 最高地址。
初学者很容易忽视这个问题,造成程序跑飞而找不到问题的症结,我在用IAR For MSP430 的时候没遇到过这个问题,因为MSP430 的RAM 比较大,IAR 默认是80 字节,足够一般程序使用。
但是使用IAR For SAM8 的时候,有一个比较耗费堆栈的程序运行一段时间后出问题,由于要记录一个24 小时的数组,而数组元素的值是在堆栈里改变的,所以,记录到一定时间以后,出现了堆栈不足的情况,初学者如果没有仿真器,是很难发现这个问题的,还好我用的OPENice i500 仿真器在Debug 的时候出现了堆栈不足的警告,我才意识到是这里问题。
IAR For SAM8 默认堆栈是32 字节,既然不够用,那么就要增大,但是设置到多少合适呢?首先编译你的程序,看程序用了多少自己的RAM,在看看芯片的Datasheet,看看芯片总共有多大的RAM,(原文件名:9428.JPG) 引用图片好了现在你就知道剩余多少RAM 了:208-142=66(Byte)前面说过IAR 的CSTACK,NEAR_HEAP 和RSTACK 是预先分配好的,占用存储空间是固定不变的,相当于定义了一个全局数组,GCC 堆栈策略与IAR 不同,堆栈大小不是预先分配好的,而是把SRAM 里面剩余空间作为堆栈空间。
如果是GCC,那么编译器就会自动设置剩余的RAM 为数据堆栈(和数据返回堆栈RSTACK,NEAR_HEAP 等)。
在IAR 里,STACK 应该设置到多少呢?在工程-》Options-》Linker-》List(不同的IAR 版本会稍有不同),选择生成LIST 文件,并包含stack 选项(原文件名:iar.JPG) 引用图片在./Debug/list 目录下,得到.map(可能是.lst 等其他格式)文件,用记事本打开,找到以下内容:******************************************* CALL GRAPH******************************************* ->Sub-tree of type: Interrupt function tree that does not make: indirect callsCSTACK01Stack used (prev) :int_T0_OV00000000| Stack used (prev) : 00000000 | + function block : 0000000C......(省略N 行)01 main| Stack used (prev) : 0000003A| + function block : 00000000<-Sub-tree of type: Function tree| Stack used : 0000003A找到最大的Stack used,我的就是0000003A,58 个字节,这就是用到的最大的堆栈空间,保守一点,我设置成64 字节,没有超过剩余RAM,再重新编译,运行,仿真器没有堆栈不足警告,程序也能正常运行了。
IAR6.3版本编译出错问题解决
__intrinsic signed long __QDOUBLE( signed long );
__intrinsic int
__QFlag( void );
__intrinsic signed long __SMUL( signed short, signed short );
/* Architecture v6, REV and REVSH are also available in thumb mode */ __intrinsic unsigned long __REV( unsigned long ); __intrinsic signed long __REVSH( short );
#pragma language=save #pragma language=extended
__intrinsic void __no_operation(void);
__intrinsic void __intrinsic void
__disable_interrupt(void); __enable_interrupt(void);
__intrinsic void __STC2L_noidx( __cpid coproc, __cpreg CRn, __ul *dst, unsigned __constrange(0,255) option);
/* Status register access */
__intrinsic unsigned long __get_CPSR( void );
/* Load coprocessor register (noindexed version with coprocessor option). */ __intrinsic void __LDC_noidx( __cpid coproc, __cpreg CRn, __ul const *src,
新建IAR工程文件注意事项
新建IAR工程文件注意事项
1、选择芯片型号
General Options:
Device选择ST STM32F103xC
Library Configuration:
如果要用到像printf一类函数的就需要将Library设置成full,否则选none。
2、头文件与文件路径设置
C/C++ Compiler->Preprocessor:
Additional include directories中设置文件路径,格式如下:
$PROJ_DIR$ :表示在工程文件所在目录
$PROJ_DIR$\..\xxx\incà\... 指从工程文件(.EWP, .EWW文件)所在目录返回上级目录搜索xxx目录,找到后进入搜素inc文件目录.. 在文件系统中表示返回到上级目录。
Defined symbols中设置芯片类型预处理:
USE_STDPERIPH_DRIVER
STM32F10X_HD
3、配置输出文件
在Output Converter 选项中,将产生输出选择上。
并选择输出格式。
Motoroal 是摩托罗拉格式,可以生成.MOT 文件,V6.3 的产生的是.srec 文件。
Intel extended 是英特尔格式。
可以生成HEX 文件
Binary 是二进制格式。
可以生成.bin 文件
摩托罗拉格式和英特尔格式是不一样的。
这和数据格式有关。
一个是小端格式。
一个是大端格式。
具体的请查找数据格式的说明。
4、配置仿真器
在Debugger 下面可以选择多种仿真器。
5、选择SWD模式。
IAR配置问题
配置IAR时遇到的一些问题问题一:器件与代码选型不一致1.Options设置编译结果:2.Options设置编译结果:3.Options设置更换Device,与代码中引用一致;知识点:Big endian machine: It thinks the first byte it reads is the biggest.Little endian machine: It thinks the first byte it reads is the littlest. 举个例子,从内存地址0x0000开始有以下数据0x0000 0x120x0001 0x340x0002 0xab0x0003 0xcd如果我们去读取一个地址为0x0000的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序位little-endian,则读出结果为0xcdab3412.如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为big-endian little-endian0x0000 0x12 0xcd0x0001 0x23 0xab0x0002 0xab 0x340x0003 0xcd 0x12x86系列CPU都是little-endian的字节序.问题二:库文件路径设置1.配置1:文件实际路径:2.配置2:文件实际路径:配置说明:1)$TOOLKIT_DIR$\INC\:表示开发工具系统目录,即:C:\Program Files\IAR Systems\Embedded Workbench 4.0 Kickstart\arm;2)$PROJ_DIR$\:表示用户程序系统目录,即*.ewp文件所在目录;3)配置1中,*.ewp路径为:D:\PLAY\Practise_STM32\Project,作为“$PROJ_DIR$\”的值;*.lib路劲为:D:\PLAY\Practise_STM32\library\inc,作为“$PROJ_DIR$\..\ library\inc”的值;其中“\..\”表示:往上一目录退一层;配置2中,*.ewp路径为:D:\PLAY\USART\Example1,作为“$PROJ_DIR$\”的值;*.lib路劲为:D:\PLAY\USART\Example1\library\inc,作为“$PROJ_DIR$\library\inc\”的值,同层;问题三:编译错误提示:Fatal Error[e72]: Segment IRQ_STACK must be defined in a segment definition option (-Z, -b or -P)解决:低级错误,没有设置元件型号!。
IAR基本选项配置
5.1.1基本选项配置在工作区(Workspace)中选定一个项目,单击Project下拉菜单中的Options…选项,弹出选项配置对话框,从左边Category列表框内选择General Options进入基本选项配置。
图5.1 基本选项配置中的Target选项卡图5.1所示为基本选项配置中的Target选项卡,Processor variant(处理器类型)选项区域中的Core复选框用于设置ARM核,默认为ARM7TDMI,也可以从其左边的下拉列表框中选择其它ARM核,例如ARM9、ARM11或Xscal等。
建议使用时尽可能根据当前所用ARM芯片,选中Device复选框,点击其右边的按钮,从弹出的文本框内选择所用器件,这样IAR EWARM会根据所选芯片自动设置器件描述文件,以便于调试。
如果所选ARM芯片含有浮点数协处理器,可在FPU下拉列表框内选取合适的浮点处理单元。
Endian mode选项区域用于选择大小端模式,默认为Little。
图5.2所示为基本选项配置中的Output选项卡。
Output file选项区域用于设置编译后生成的输出文件类型,可选择Executable(生成执行代码)或Library(生成库文件)。
Output directories选项区域用于设置输出文件目录,默认执行代码文件目录为Debug\Exe,目标文件目录为Debug\Obj,列表文件目录为Debug\List,也可设置其它目录。
图5.2基本选项配置中的Output选项卡图5.3基本选项配置中的Library Configuration选项卡图5.3所示为基本选项配置中的Library Configuration选项卡。
IAR C/C++编译器提供了DLIB库,支持ISO/ANSI C和C++以及IEEE754标准的浮点数。
通过Library下拉列表框选择希望采用的运行库。
选择None表示应用程序不链接运行库;选择Normal表示链接普通运行库,其中没有locale接口和C locale,不支持文件描述符,printf and scanf不支持多字节操作,strtod不支持十六进制浮点数操作。
使用IAR时遇到的一些Error、Waring
使用IAR时遇到的一些Error、Waring/sendoc/blog作为菜虫,在使用IAR的时候编写CC2430、、Z-Stack2006程序会遇到如下一些错误,当然随着学习的深入,我会持续更新。
1Q:Error[e16]: Segment XDATA_Z (size: 0x19a1 align: 0) is too long for segment definition. At least 0xe4c more bytesneeded. The problem occurred while processing the segment placement command"-Z(XDATA)XDATA_N,XDATA_Z,XDATA_I=_XDATA_START-_XDATA_END", where at the moment ofplacement the available memory ranges were "XDATA:f1ff-fd53"Reserved ranges relevant to this placement:XDATA:f000-f1fe XSTACKXDATA:f1ff-fd53 XDATA_NBIT:0-7 BREGBIT:80-97 SFR_ANBIT:a8-af SFR_ANBIT:b8-c7 SFR_ANBIT:d8-df SFR_ANBIT:e8-ef SFR_ANA:其实这个问题并不是你的程序本身有问题,主要是因为你编写的程序太大了,超出了芯片本身的定义。
今天在群里学习了一招,就是将数组定义到code里,我们看一下例子。
我们定义一个5100个元素的数组,有以下两种方法:mermaid提出的方法是:typedef unsigned char const __code INT8U;extern INT8U shuzi[5100];文晶提出的方法是INT8U code shuzi[5100];这两种方法其实效果是一致的,定义完数组之后,调用的部分就是需要用指针来调用数组里面的数值了。
IAR编程注意事项
编程总结1.关于IAR中数据的乘除运算注意事项:在IAR中作乘除法运算时必须注意其数据类型的定义及防止数据的溢出及数据表达式中的隐式的数据类型的转换。
例如:sint get_press(void){uint tmp_data = 0;sint temp_data = 0;sint data = 0;tmp_data = twi_read()+(410-zero_data[3]); //410是压力为0时的偏置值temp_data = tmp_data-410;data = (temp_data * 2590.0) / 3276.0; //将数字量换算成实际的压力值*/ return (data);}其中2590和,否则写成2590和3276则计算的结果错误。
2.整形。
符号型,浮点数的混合运算:注意事项及运算规则:、c语言中允许进行整形、字符型、实型的混合运算,但在实际运算时,要将不同的类型转化成统一的类型再进行运算,运算规则是:1,所有char->int,float->double.2,低级类型服从高级类型:char->int->unsigned->long->float->double.3,赋值运算的最终结果,以左边变量的类型为准。
1.如果位数一样,则有符号转换为无符号(char例外。
不知道为什么)2.如果位数不一样,位数小向位数大的类型转换,例如unsigned int 和char ,char的转换为unsigned int。
unsigned char和long,unsigned char转换为long等等。
2.浮点数的显示以显示浮点数的后两位为例子:3. 1.float press;4.Unsigned int x,y,z,d,w,b;5.Press = 41.235696.X = Press;(利用隐形转换符取读点数的整数部分)Y = X/10;Z = X%10;7. D = (Press – X)*100; (利用隐形转换符取读点数小数的后两位)W = D/10;B = D%10;1.在以I/O口访问LCD时,编写LCD程序时注意读写时序,(EN,RS,RW信号之间必须加延时)例如:PORTG|=EN; //EN=1s_ms(100);PORTG|=RS; //RS=1s_ms(100);PORTG&=~RW; //RW=0s_ms(100);PORTA=WDLCM; //Êä³öÊý¾Ýs_ms(100);PORTG&=~EN; //EN=02.若是以总线的方式访问时,则不必管读写时序,时序由硬件自动完成。
IAR配置
IAR配置IAR编译环境的配置是相当重要的,没配置正确或者不符合自己的习惯的话,使用起来就会很麻烦。
下面我根据网上的经验和资料,以及自己摸索和大家共同探讨下IAR的配置。
我第一次打开IAR环境的时候,发现工作区有明显分层现象。
如图一所示图一这是我郁闷了好久,网上也不知道该如何搜索相关,只有自己慢慢找,最后还是找到了。
点击tools---options就会弹出一个对话框来,如图二所示图二点editor选项卡,可以看到右边有很多选项,这些选项关系到使用的习惯和便捷性。
首先要谈到的是tab size,这个表示tab的字符宽度,默认值为8,indent size表示缩进的字符宽度,默认为2。
有人喜欢缩进为4,有人喜欢缩进为2,根据个人喜好,和程序的复杂度来选择,我一般选择2。
然后紧跟着,下面有个tab key funtion,说得是按下tab键所起到的作用,第一个表示插入制表符,第二个表示插入空格,一般选择插入空着(insert with space)这个选项。
为了解决图一的问题,就在show right margin(显示右边空白),处理方法很多,可以不选中,也可以选择Printing edge(显示到边缘),也可以把Columns(分栏)占的比例修改为100都可以。
另外,根据个人习惯,有人喜欢列出行号,有人不喜欢,这个可以在configure的下面show line numbers的选项,选中即可列出行号。
其他可以根据自己习惯设定,设定好了之后,如图三的效果,就看起来舒服多了。
图三下面一个重点就是进行项目设定了,这个步骤非常重要,如果没有设置好,有可能编译不通过或者出错。
其实我们当初选择empty project模版的时候,配置都是属于默认的,但是有些关键配置还是需要自己手动配置的,虽然配置项目很多,根据网上经验和资料,以及个人理解,列举了几个关键选项来配置即可。
1、IAR EWARM 允许为工作区中的任何一级目录和文件单独设置选项,但是用户必须首先为整个项目设置通用的选项General Option。