【IAR 】MSP430 IAR 编译报错:error

关于转载的说明:原文内容可能会不断更新,要想得到最新的内容请跳到到原文看。

无编号警告类型:

1、Sat Jun 23, 2012 17:41:05: The stack pointer for stack 'Stack' (currently Memory:0xF5336) is
原因:新浪博客

IAR相关设置:Tools->Option->Stack->Warn when stack pointer is out of bounds.

The stack pointer for stack is outside the stack range

( 2012-06-24 20:36:38)

1、

Debugging using IAR Embedded Workbench


Because the IAR debugger is not presently aware of Micrium’s μC/OS-III operating system, the
following error may be reported when the debugger is halted:
Mon Sep 20 16:24:14 2010: The stack pointer for stack 'CSTACK' (currently
0x200023D8) is outside the stack range (0x20000000 to 0x20000400)
Ignore this error message as it does not affect debugging.

原文:http://www.ti.com/lit/ug/spmu164a/spmu164a.pdf

outside the stack range (Memory:0x5400 to Memory:0x5C00)

2、

在使用iar for msp430调试msp430f247的时候,在仿真过程中出现上述的warnning,觉得很奇怪。因为我只是跳入一个子程序而已,不应该占用这么多的堆栈空间。被调用的子程序开头如下:
void spitest()
{
    unsigned char firstdata[128];
    unsigned char seconddata[128];
    unsigned char i;
    Led_Init();
    Led_On();
    Led_Off();
    .........
}
    仔细查看该段代码对应的汇编,如下:
spitest:
    0081E8    8031 0100        sub.w    #0x100,SP
    0081EC    12B0 871C        call    #Led_Init
    0081F0    12B0 8716        call    #Led_On
    0081F4    12B0 8710       call    #Led_Off
    .........
总结:出现该warrning的是编译器的原因,编译器优化初始化数组的方法为占用堆栈,即汇编中的代码“sub.w #100,SP ” ,占用的实在太多,所有导致warrning。同时注意到当spitest子程序跑完后,sp指针会重新恢复正常,所有这个仿真警告是不影响正常程序的。

2、无法查看结构体/共同体/联合体 变量[Syntax error, unexpected $end, expecting COLON2] column 1

  struct drpoint
  {
     uint16 x;
     uint16 y; 
  }drpoint[10];

改成:

  struct  

  {
     uint16 x;
     uint16 y; 
  }drpoint[10];

参考:http://tech.groups.yahoo.com/group/lpc2000/messages/34213?threaded=1&m=e&var=1&tidx=1

UESTC 2012.12

IAR 各版本BUG错误修正历史:ftp://efo-6.ip.peterstar.net/pub/efo-ftp/TMP/pub/atmel/_AVR32_MCUs_32bit/Compilers/IAR/IAR_2.20/Install software/EWAVR32-KS-CD-220A/doc/common/doc/CorrectedProblems.pdf

有编号警告类型:

Error[e16]: Segment XDATA_Z (size: 0x19a1 align: 0) is too long for segment definition. At least 0xe4c more bytes needed. 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 of placement the available memory ranges were "XDATA:f1ff-fd53"

Reserved ranges relevant to this placement:
XDATA:f000-f1fe XSTACK
XDATA:f1ff-fd53 XDATA_N
BIT:0-7 BREG
BIT:80-97 SFR_AN
BIT:a8-af SFR_AN
BIT:b8-c7 SFR_AN
BIT:d8-df SFR_AN
BIT:e8-ef SFR_AN

A:

其实这个问题并不是你的程序本身有问题,主要是因为你编写的程序太大了,超出了芯片本身的定义。今天在群里学习了一招,就是将数组定义到code里,我们看一下例子。我们定义一个5100个元素的数组,有以下两种方法:

mermaid提出的方法是:

typedef unsigned char const __code INT8U;

extern INT8U shuzi[5100];

文晶提出的方法是

INT8U code shuzi[5100];

这两种方法其实效果是一致的,定义完数组之后,调用的部分就是需要用指针来调用数组里面的数值了。

Error[e16]: Segment DATA16_I (size: 0xa80 align: 0x1) is too long for segment definition. At least 0x27f more bytes needed. The
pro××em occurred while processing the segment placement command
"-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,HEAP+_HEAP_SIZE=0200-0A00", where at the moment of placement the ××aila××e
memory ranges were "CODE:200-A00"

经过验证是由于RAM耗尽,程序里估计有很大的数据量,最好使用const定义到FLASH里面,问题基本可以解决。

Error[e16]: Segment DATA16_Z (size: 0x6b9 align: 0x1) is too long for segment definition. At least 0x317 more bytes needed. The problem occurred 
while processing the segment placement command 
"-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I,DATA16_HEAP+_DATA16_HEAP_SIZE=0200-09FF", where at the moment of placement the 
available memory ranges were 
"CODE:5ce-5ff,CODE:602-605,CODE:609-60b,CODE:60d-60d,CODE:60f-61b,CODE:61e-63f,CODE:642-645,CODE:649-64b,CODE:64d-64d,CODE:64
f-65b,CODE:65e-9ff"
   Reserved ranges relevant to this placement:

可能的原因:1、设置的某个数组过大,超过了设置的堆栈。

            2、设置的堆栈不够大

            3、选择的型号不对(编写的程序是用在RAM较大的一个单片机上的,IAR里选择的却是RAM较小的一个型号)

UESTC 2013.3.8 

2Q: 

烧写程序时无法跳入断点
为什么我每次烧程序都出现:The stack plug-in failed to set a breakpoint on "main". The Stack window will not be able to display stack contents. (You can change this setting in the Tool>Options dialog box.)的警告。但是程序能烧进去,只是不能调试。

A:

确认设置没有问题(和好用的工程相比)这是设置不对,请找下面顺序修改:

iar->options->linker->output->format;
选择 Debug information for c-SPY选项

3Q:

错误提示:

Fatal Error[Cp001]: Copy protecTIon check, No valid license found for this product [20]

A:

可以将IAR全部安装上,但是在编译文件时却会报这个错,原因是安装的时候没有把注册机的0x.....字串的小写字母改为大写字母。

4Q:“Error[e16]: Segment CSTACK (size: 0x50 align: 0x1) is too long for segment definition. At least 0x50 more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)CSTACK+_STACK_SIZE#", ”

A:


此错误是所定义的全局变量和数组缓冲区等所占的RAM超出硬件支持所致:size: 0x50为超出的大小。只要减少不不要的全局变量和尽量缩小数组缓冲区就可以了!

5Q:

7Q:

Error[Pe018]: expected a ")" C:\Documents and Settings\Administrator\桌面\Crane\Crane\塔吊防碰撞系统1.1版(SIM908 倾角查询)\5438A塔吊防碰撞1.1\api_function.h 5

1、函数或者语句中有变量名复用:

#define length 50                   // 吊臂长度

extern int dec_to_bcd(int dec_dat, unsigned char *bcd, int length);

将以上的变量名之一换做别的即可解决。

UESTC 2012.3.27

 Error[e27]:(变量没有extern声明外部可调用)  uestc

新浪博客
Error[e27]: Entry "ER_WARN" in module AD (……) redefined in module FINGERPRINT (……)

解决方法是把变量定义在其中一个cpp文件里面,
然后在另一个文件里面用extern来引用。
sample:

文件一:
int a=0;

文件二:
extern int a;  //此处不能使他等于某个数就可以了,如果此处a再赋值extern int a=0;就会报错e27

以为我在x.h文件中定义有变量,然后x.h放入 config.h中,config.h被其他的各个.c文件包含,就造成了,x.h中的变量在各个.c中定义,造成了重复定义。 UESTC 2012.3.27

相关问答:

http://topic.csdn.net/u/20120222/22/c9b258d3-f58e-49dc-bf97-630271a26dfc.html

14Q:Error[e46]:

   Undefined external "__program_start" referred in ?ABS_ENTRY_MOD ( )

A:该问题应该是IAR设置问题,具体设置如下:
Project->Option->Linker->Config 勾选"Override default program"
再选择"Defined by application"

 B、 static  (const)变量是不能被外部文件调用的 ( ? )

 C、只包含了.h文件, .c文件没有添加进工程

从debug切换到release出现错误:release不会自动继承debug的设置,需要自己重新设置:

snprintf、fmax、fmin这些函数都能在IAR帮助中找到,但是却出现下面错误:

Error[e46]: Undefined external "fmax" referred in cacu_protect ( C:\Documents and Settings\Administrator\桌面\塔吊安全监控系统-终版\塔吊安全监控系统-终版\
Release\Obj\cacu_protect.r43 )
Error[e46]: Undefined external "fmin" referred in cacu_protect ( C:\Documents and Settings\Administrator\桌面\塔吊安全监控系统-终版\塔吊安全监控系统-终版\
Release\Obj\cacu_protect.r43 )
Error[e46]: Undefined external "snprintf" referred in gprs_8 ( C:\Documents and Settings\Administrator\桌面\塔吊安全监控系统-终版\塔吊安全监控系统-终版\
Release\Obj\gprs_8.r43 )
Error while running Linker

错误原因:链接库的设置不对:

Error[Pe077]:

this declaration has no storage class or type specifier

   不同的版本,就有不同的写法,就像环境不一样,中断函数的名字也不一样,我遇到过这样的情况(两个不同版本下定时器初始化时寄存器的名称不同).
   如I/O口中断函数的名的两种版本:
 版本1:interrupt[PORT2_VECTOR] void PORT2 (void)
 版本2:#pragma vector=PORT1_VECTOR
        __interrupt void PORT1_ISR (void)

2012.2.x UESTC


8Q:

Error[Pe136]:

     struct "" has no field "SampleApp_Periodic_DstAddr" D:\Program Files\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SampleApp\Source\SampleApp.c 417


//--------------------------------------------//
afAddrType_t dstAddr;
dstAddr.addrMode = afAddrBroadcast;
dstAddr.addr.shortAddr = 0xFFFF; // 广播发送 cdwxl
dstAddr.endpoint = SAMPLEAPP_ENDPOINT; //error所在
//--------------------------------------------//

A:


我们看看afAddrType_t这个结构就明白错在哪里了。

typedef struct
{
union
{
uint16 shortAddr;
} addr;
afAddrMode_taddrMode;
byteendPoint;
} afAddrType_t;

居然是 endPoint 大小写错误,Ω 。

9Q:


我最开始也是IAR仿真时找不到main函数,
显示:
Fri Jun 11 14:37:00 2010: Error (col 1): Unknown or ambiguous symbol. main
Fri Jun 11 14:37:01 2010: Error (col 1): Unknown or ambiguous symbol. main
Fri Jun 11 14:37:01 2010: Couldn't go to 'main'.

之后在project==>options==>linker里面的format设成debug,没有这个问题了,但是
程序又不能通过TI的那个Flash Programmer下载到板子里了,说是Could not open specified HEX file

A:

这个烧录工具只认release code. 而且扩展名必须是.hex。

所以要用这个烧录工具来烧录必须做两件事:

1. output file设为release version
2. output file 扩展名改为.hex, 默认的是.a51

测试学习阶段可以不用.但产品量产就必须生成二进制文件.
同时programmer还有些其它的功能会常用的

 Error[Pe142]: expression must have pointer-to-object type 

表达式两边的类型不一样。2012.2.x uestc

例如:

 “编译的错误是指第一个‘*’的后面应该是指针,却给了是非指针表达式。
如果p是个指针,那么*(p+i)是p后面第i个域或单元的元素,这个域与p所指的变量类型有关,
也就是说'*(p+i)+j'是数,而非指针。与*结合就错了。 ”

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=931945

C++的该错误:

http://efreedom.com/Question/1-4943607/Expression-Must-Pointer-Object-Type-Subscript-Requires-Array-Pointer-Type

Error[Pe148]:

variable "TA1R_OVERFLOW" has already been initialized

"unsigned char TA1R_OVERFLOW=0; " 声明可外部调用需要赋值

Error[Pe159]: declaration is incompatible with previous

  没加头文件,或者主函数内有子函数,而子函数定义在主函数后边而木有在主函数前声明一下。

Error[Pe169]: expected a declaration

错误原因可能性:

1、void read_gprs_return();

{

……

}

定义函数的时候,结尾多了一个分号:;。

Error[Pe852]:

Error[Pe852]:expression must be a pointer to a complete object type

请教关于结构体数组的引用出错

yanzhongwang
2006-02-24, 14:30
定义结构体数组
var.c:
struct StructDisData
{
unsigned int AddrDisData;
unsigned int TypeDisChar;
unsigned int TypeDisUnit;
unsigned char LengthDisData;
};
const struct StructDisData StrDisData[254]={.....};
var.h:
const extern struct StructDisData StrDisData[254];
在Lunxian.c中引用:
#include "var.h"
unsigned int vAdd;
void Sub1(void)
{
unsigned int disptr;
disptr =...;
vAdd =StrDisData[disptr].AddrDisData; //编译时在此处出错 Error[Pe852]: expression must be a pointer to a complete object type
}
各位大虾请帮我分析一下 谢谢!
erlking
2006-02-24, 14:41
改成
vAdd =StrDisData[disptr]->AddrDisData;
试试?
yanzhongwang
2006-02-24, 14:58
谢谢erking这么快的回复!
我改了试了一下 还是一样的错误
好像->是用指针方式调用才用到
li_hai_tao930
2006-02-24, 23:19
声明结构体时用typedef 定义结构类型名试试
iltgcl
2006-02-27, 08:36
将结构定义
struct StructDisData
{
unsigned int AddrDisData;
unsigned int TypeDisChar;
unsigned int TypeDisUnit;
unsigned char LengthDisData;
};
放到头文件中,即.h文件中
yanzhongwang
2006-02-27, 10:59
谢谢楼上的各位!
用iltgcl的方法试了一下 编译没问题了!
yanzhongwang
2006-02-27, 11:22
改正后的文件结构如下
var.c:
var.h:
struct StructDisData
{
unsigned int AddrDisData;
unsigned int TypeDisChar;
unsigned int TypeDisUnit;
unsigned char LengthDisData;
};
Lunxian.c:
#include "var.h"
unsigned int vAdd;
const struct StructDisData StrDisData[254]={.....};
void Sub1(void)
{
unsigned int disptr;
disptr =...;
vAdd =StrDisData[disptr].AddrDisData; 
}
再次谢谢各位工程师的热心指点!
readyaiming
2006-03-03, 15:23
不错不错。

Error[Pe260]:

   explicit type is missing ("int" assumed) C:\Documents and Settings\Administrator\桌面\下位机\塔吊防碰撞系统1.1版(SIM908 倾角查询)\5438A塔吊防碰撞1.1\LCD(SmallFonts).c 898

问题例子1:定义一个函数,落了红字部分声明

void DrawSector(int x,int y,int R1,int R2,float Ds ,float De,int fill,uchar color)
{
    ……

}

11Q:Error[Pe513]:

   a value of type "int (*)(uint8, uint8)" cannot be assigned to an entity of type "halUARTCBack_t" D:\Program Files\Texas Instruments\ZStack-1.4.3-1.2.1\Components\stack\sapi\sapi.c 968

A:估计是一个函数本没有返回值即void类型,而你却将这个函数赋给了一个int型变量了。。

static rxCB( uint8 port,uint8 event )改为
static void rxCB( uint8 port,uint8 event )

12Q:

Fatal Error[e72]: Segment BANK_RELAYS must be defined in a segment definition option (-Z, -b or -P)

A:


使用无线龙的串口互发,发现上述错误,原因是版本太高,具体原因不清,下载一下7.20H就可以了

Fatal Error[e89]: Too much object code produced (more than 0x1000 bytes) for this package

是4K限制版,请使用有非限制版的。

IAR常见错误请先从如下几方面入手:

1序列号是否正确。

2使用版本是否正确,应该使用7.30B打开的工程文件不能使用7.20H打开。

       3尽量不要使用中文路径。

       4ZigBee协议栈文件夹需要放在IAR安装盘根目录下。

       5请确定当前编译文件夹是否具有读写权限。

       6使用的版本是否是限制版

Fatal Error[Pe005]: could not open source file "stdio.h" 这是什么原因?谢谢了

是因为头文件路径不对造成,改正的方法是在设置选项卡的C/C++ Compiler -> Preprocessor选项里,将$TOOLKIT_DIR$\INC\CLIB\添到Include paths中。($TOOLKIT_DIR$指IAR的安装路径,一般用到标准库函数时要将它写入Include paths里面)

Fatal Error[Pe005]: could not open source file "hal.h" C:\Users\user\Desktop\例子程序\无线通信综合测试\Library\cc2430\HAL\source\setTimer34Period.c 7

先检查 C:\Users\user\Desktop\例子程序\无线通信综合测试\Library\cc2430\HAL\source\有无setTimer34Period.c 这个文件,若有,则是因为IAR对中文路径支持不好的缘故,你把这个工程复制到全英文路径下编译应该就不会报错了。

Fatal Error[Pe1696]: cannot open source file "config.h"

注意config.h 存放的位置,最好与main同处于一个文件夹

15Q:

Fatal Error[Cp001]:

   Copy protection check, No valid license found for this product [24]
XP下装的IAR,到了Win7下出来的问题。

A:这个问题是使用注册机带来的,系统换了,本机ID也要改了。

、、单击IARID.EXE得到本机的ID号
、、右键点Key.cmd,选择编辑,打开,将ID修改为本机ID
、、运行KEY.cmd,在key.txt中的含有EW8051-EV的序列号就是7.30的序列号

16Q:

在用iar debug 下载进已有程序板子出现的

A:将核心板与扩展板分开,只烧写核心板。

17Q:



A:自小峰关于协议栈XDATA溢出的小结
(1)减小程序;

(2)把配置文件f8w2430.xcl/f8w2430pm.xcl中的-D_CODE_END改大点:
********************
f8w2430.xcl:
// CODE
//
// These settings determine the size/location of the ROOT segment.
// Increase _CODE_END to increase ROOT memory, i.e. for constants.
-D_CODE_START=0x0000 // Code size = 128k for CC2430-F128
-D_CODE_END=0x4000 // Last address for ROOT bank
********************
f8w2430pm.xcl:
// CODE
//
// These settings determine the size/location of the ROOT segment.
// Increase _CODE_END to increase ROOT memory, i.e. for constants.
-D_CODE_START=0x0000 // Code size = 128k for CC2430-F128
-D_CODE_END=0x29FF //(原0x28FF) Last address for ROOT bank

Warning[Pe001]: last line of file ends without a newline F:\emoTion\IAR\PK升级\CC1110-8\main.c 179
A:

在使用IAR时常常会弹出类似这样一个警告,其实只要在最后一行多加一个回车就不会再有这个警告了.

6Q:

在编写一个串口程序时:编译没有错,但MAKE时就出现下面的错误

undefined external“UART1_ISR”referred in startup

A:

串口1中断向量没有定义,实际上是串口1中断向量定义其他名称,而不是UART1_ISR.

出现这样的调试IAR错误时:Fatal error: Unknown exception in driver (#E1),是因为IAR软件没有跟Texas Instruments文件放在同一个系统盘下

Warnin[w6]: 

   Type conflict for external/entry "_A_PORTD", in module _ultrasonic against external/entry in module _ST7920; class/struct/union types have  
different numbers of fields/bases 

你看看你的源代码里函数是不是这样写:void XXX(void)
而.h代码里这样声明:void XXX();
.h代码应该这样声明:void XXX(void);
 

分析:一般Warnin[w6]:问题出在头文件里头,可能有:

1、声明了外部变量,但是用到那个函数的.c文件没有包含那个头文件

2、源代码函数和.h里声明的函数不一样:.c里 void XXX(void),头文件中:void XXX();或者:笔误.hz中  Wight_warn (); .c中: Weight_warn();
3、在.C中定义了,但是没有extern void clean_uart2_rx_buff();声明外部可调用,然后外部调用了它,就有可能出现。 2012.3.26 UESTC

Warning[Pe009]: nested comment is not allowed    

注释最好不要嵌套
例如注释1后半部*/

就是最好不要这样     uestc

 Warning[Pa082]:

 undefined behavior: the order of volatile accesses is undefined in this statement

运算符两边都是volatile变量的警告

这警告有意义.
volatile 意思是:易变的。
用volatile修饰的变量一般不直接参与运算(在运算中值可能在变化),volatile就以为这个变量在运算过程中有可能已经改变了


例如:想计算a * b 要这样:

 (x * y);
 
     
复制代码

建议使用另外一个变量参与计算:

 xxx * yyy

}
 
     
复制代码
Warning[Pe175]: 

编译错误:Warning[Pe175]: subscript out of range 

          原因: 定义了 float value[6] ; 既我们定义的了 value[0]、 value[1]…… value[5],默认从0开始的,而实际中我们用到了value[6],越界了。

2011年 6月2日 

 Warning[Pe177]:

    function "rxCB" was declared but never referenced D:\Program Files\Texas Instruments\ZStack-1.4.3-1.2.1\Components\stack\sapi\sapi.c 982

A:函数虽定义但从未被引用(使用)。如果你需要使用该函数,就需要检查;否则略过。

13Q:
Fri Jun 11 14:37:00 2010: Error (col 1): Unknown or ambiguous symbol. main
Fri Jun 11 14:37:01 2010: Error (col 1): Unknown or ambiguous symbol. main
Fri Jun 11 14:37:01 2010: Couldn't go to 'main'.

A:project==>options==>linker 看看里面的format是不是设成debug
详见www.feibit.com/bbs/viewthread.php

 Warning[Pe186]: pointless comparison of unsigned integer with zero

无符号整数不可能小于0的……

10Q:Warning[Pe188]:

     enumerated type mixed with another type D:\Program Files\Texas Instruments\ZStack-1.4.3\Projects\zstack\Samples\SampleApp\Source\SampleApp.c 206

A: SampleApp_Periodic_DstAddr.addrMode = Addr16Bit;//(afAddrMode_t)afAddrGroup;
typedef enum
{
afAddrNotPresent = AddrNotPresent,
afAddr16Bit = Addr16Bit,
afAddrGroup = AddrGroup,
afAddrBroadcast = AddrBroadcast
} afAddrMode_t;
问题就在于Addr16Bit未加afAddrMode_t这个套子。

Warning[Pe1072]: a declaration cannot have a label  

在switch case:后直接定义变量了
 switch (check_storce_status())
  {
  case 0:
    break;
  case 1:
  int fash;
   break;
 case 2:
  break;
}
解决方法:
前后加个括号即可。
 switch (check_storce_status())
  {
  case 0:
    break;
  case 1:
  {
    int fash;
   break;
  }
 case 2:
  break;
 }
 UESTC 2012.3.19

Fatal Error[Pe1696]:

Fatal Error[Pe1696]: cannot open source file "time.h" C:\Documents and Settings\Administrator\桌面\塔吊安全监控系统-终版\塔吊安全监控系统-终版\config.h 53 
searched: "C:\Documents and Settings\Administrator\桌面\塔吊安全监控系统-终版\塔吊安全监控系统-终版\"
searched: "C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation_0\430\inc\clib\"
searched: "C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation_0\430\inc\"
Error while running C/C++ compiler

出错原因是编译器在上面列出的路径内的文件夹下面找不到time.h

首先确定是不是真的存在这两个头文件(没有就自行下载或者编写吧)。然后可以采取以下两种解决方法:
1、include时写上完整的路径名。如:
#include "D:\headers\msp430x14x.h"
2、在编译器的默认头文件路径中添加你自定义的头文件存放路径。一般是你所用的IDE的某项功能,这就看你用的是什么IDe了。

3、将头需要的头文件复制到编译器搜索的目录(一般debug能通过,release通不过的时候多是这个原因):

第一步:找头文件所在的地方


第二步:复制(另存为)到IAR 搜索的目录:
searched: "C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation_0\430\inc\clib\"

UESTC 2013.3.11 

18.2 编译警告消息
下表列出了编译警告消息

编号警告消息建议
0 Macro ‘name’ redefined 宏 ‘name’被
重新定义
用#define 定义的符号被用不同的参数
或形式表重新定义


1 Macro formal partameter ‘name’ is
never referenced 宏形式参数 ‘name’
被重新定义
#define 形式参数从未在参数字符串中
出现


2 Macro ‘name’ is already#undef 宏
‘name’被重新定义
#undef 被用于不是宏观的符号


3 Macro ‘name’ called with empty
parameter(s) 用空参数调用宏 ‘name’
用零长度(zero-length)的参数不清调
用在#define 中定义的参数化宏观


4 Macro ‘name’ is called recursively;
not expanded 宏 ‘name’ 被递归调用
不扩展
递归宏调用使预处理器停止该宏的进一
步扩展


5 Undefined symbol ‘name’ in #if or
#elif; assumed zero 在#if 或#elif
中未定义的符号 ‘name’;假设为零
在#if 或#elif 表达式中把非宏符号作
为零来处理被认为是错误的编程实践
使用以下两个中任一个#ifdef symbol
或#if defined(symbol)


6 Unkown escape seguence ‘\c’ ;assume’
c’ 未知的转义序列‘\c’ 假设为’c’
在字符常数中发现反斜杠\ 或字符
文字后随未知的转义字符


7 Nested comment found without using
the’c’ option 发现嵌套的注释未使用’c’
选项
在注释中发现字符序列
无条件转移或返回在一条或多条语名之
前使得这条或多条语句从来不会被执

21 Unreachable statement(s) at
unreachable label ‘name’ 在未卜先知
被引用的标号‘name’处不能到达的语句
例如
Break;
Here:
I=2;
无条件转移或返回在有标号的一条或多
条语句之前但是标号从未被引用所
以这条或多余语句从来不会被执行

22 Non-void function: explicit “return”
; expected 非空函数
显式的 “return”<表达式> 被预期
非空non-void 函数产生隐含返回
这可能是从循环或开关语句中非预期的
退出注意不带default 的开关语句
总是被编译器当作可退出的而不管
case 的结构如何

23 Undeclared function ‘name’; assumed
“extern” “int” 未声明的函数‘name’;
假设为“extern” “int”
对未声明函数的引用导致使用缺省的声
明函数被假设为具有K&R 类型具有
外部存储类别并返回int 整型

24 Static memory option converts local
“auto” or “register” to “static”(静
态存储器选项把局部 “auto”或
“register”转换为 “static”)
用于静态存储器分配的命令行选项使
auto 自动和register 寄存器声
明被当作static 静态来处理

25 Inconsistent use of K&R functionvarying
number of parameters(K&R 函
数的不一致使用-改变了参数的数目)
用改变了的参数类型调用K&R 函数

26 Inconsistent use of K&R functionchanging
type of parameter K&R 函数
用改变了的参数类型调用K&R 函数
MSP430 系列C 编译器编程指南
利尔达电子中国有限公司 TEL 0571-88800000 FAX 0571-88805970 - 116 -
的不一致使用改变了参数的类型
例如
myfunc(34);
myfunc(34.6);

27 Size of “extern” object ‘name’ is
unknown 外部对象‘name’的大小未知
Extern 外部数组应当用size 声明

28 Constant [index] outside array bound
常数[索引]超出数组边界
存在超出已声明数组边界的常数索引

29 Hexadecimal escape sequence larger
than “char” 十六进制转义序列大于
“char”
转义序列被截断以适合于放入char 字
符中

30 Attribute ignored 属性被忽略
例子
因为const 常量或volatile 易失
的是对象的属性所以当它们与
structure 结构,union 联合或
enumeration(枚举)标签定义一起给出
时将被忽略上述定义没有和对象同时
声明而且函数被认为不能返回const
或volatile

31 Incompatible parameters of K&R
functions K&R 函数的参数不兼容在
下列范围之一使用指针
指向函数的指针可能是间接的或K&R
函数声明具有不兼容的参数类型

32 Incompatible numbers parameters of
K&R functions(K&R 函数的参数数目不兼
容)在下列范围之一使用指针
指向函数的指针可能是间接的或K&R
函数声明具有不同数目的参数

33 Local or formal ‘name’ was never 在函数定义中未使用形式参数或局部变
referenced(局部或形式参数‘name’从未被引用)
量对象

34 Non-printable character ‘\xhh’ found
in literal or character constant 在
文字或字符常数中发现不可打印字符号
‘\xhh’
在字符串文字或字符常数中使用不可打
印non-printable 字符被认为是一
种不好的编程习惯为了得到同样的结
果可使用‘\0xhhh’

35 Old-style(K&R) type of function
declarator (老式(K&R)类型的函数声明)
发现老式(K&R)函数声明只有正在使
用-gA 选项时才发出这种警告

36 Floating point constant out of
range(浮点常数超出范围)
浮点值太大或太小以致不能使用目标的
浮点系统来表示

37 Illegal float operation :division by
zero not allowed(非法浮点运算不允
许除以零)
在常数算术运算时发现除零

38 Tag identifier ‘name’ was never
defined(从未定义标签识别符‘name’)

39 Dummy statement. Optimized away! 发现多余的代码这通常表示用户代码
中打印错误或可能产生于使用有点不太
通用的宏时这不是错误
例如
a+b

40 Possible bug! “if” statement
terminated(可能是缺陷if”语句被中
止)
这通常表示用户代码中的打印错误例

if (a= =b);
{
}

41 Possible bug! Unintialized variable
可能是缺陷未初始化的变量
在初始化之前使用变量变量具有随机

例如
void func(p1)
{
short a;
p1+=a;
}

42 止消息被废弃

43 Possible bug! Integer promotion may
cause problems. Use cast to avoid it
可能是缺陷整数提升可能产生问题
使用cast 以避免此问题
例如
整数提升规则指出所有整数运算必须产
生这样的结果当它们具有比int 整
型低的精度时就好像它们是int 整
型一样这有时可能导致未预期的结

MSP430 系列C 编译器编程指南
利尔达电子中国有限公司 TEL 0571-88800000 FAX 0571-88805970 - 118 -
此例将始终返回1 即使对于数值0xff 也是如此其原因是整数提升首先使变量a
变为0x00ff 然后执行位非bit not
整数提升被许多其他C 编译器所忽略因此当用IAR 系统编译器重新编译已有的程
序时可能产生此警告

44 Possible bug! Single ‘=’ instead of ‘=
=’used in “if” statement 可能是缺陷
在 “if”语句中用‘= =’ 代替单个‘=’
这通常表示用户代码中的打印错误
例如
if (a=1)
{
}

45 Redundant expression.
Example:multiply with 1. Add with 0(多
余的表达式例如乘以1 加上0)
这可能表示用户代码中的打印错误但
是它也是可能是由case 工具产生的
错误代码的结果

46 Possible bug! Strange or faulty
expression. Example: division by zero
可能是缺陷奇怪或错误的表达式
例如除以零
这通常表示用户代码中的缺陷

47 Unreachable code deleted by the
global optimizer 由全局优化删除不
能到达的代码
例如除以零
在用户代码中多余的代码块它可能是
bug 缺陷的结果但通常仅是不完
善代码的信号

48 Unreachable returns. The function
will never return 不能到达的返回
函数将永远不返回
函数将永远不能返回到调用的函数这
可能是程序缺陷的结果但通常当在
RTOS 系统中具有永不结束循环时产生

49 Unsigned compare always true/false
无符号的比较总是为真/假
这表示用户代码中的缺陷通常的原因
是遗漏了-c 编译器开关
例如
for (uc=10; uc>=uc--);
{
}
因为无符号的值永远大于或等于零所
以这是永不结束的循环

50 Signed compare always true/false 有
符号的比较总是为真/假
这表示用户代码中的缺陷

更多错误信息查看文档:IAR_编译错误信息表(1).pdf_免费高速下载|百度网盘-分享无限制:

警告:Wed Sep 21 03:16:21 2011: Fatal error: Failed to initialize device.   Session aborted!

原因分析:将仿真器从单片机上拔下来,然后下载出现的警告一样,所以判断是线路出了问题,线路连接没有问题,所以判断驱动出了问题。

将驱动重新安装,重启电脑,正常!

(2011.11.19:以上问题有新判断,现在判断为线路插口接触不好所致。

注意:重新编译的时候,请将记录有错误记忆的“Debug”文件夹删除掉。

2011.11.19:

Warning[w6]: Type conflict for external/entry "MyDangerStatus", in module TurnSendCode against external/entry in module UART0; prototyped function 

你看看你的源代码里函数是不是这样写:void XXX(void)
而.h代码里这样声明:void XXX();
.h代码应该这样声明:void XXX(void);

Error[e16]: Segment INTVEC 错误

 Error[e16]: Segment INTVEC (size: 0xec align: 0x2) is too long for segment definition. At least 0xac more bytes needed.  
The problem occurred while processing the segment placement command "-Z(CODE)INTVEC=00-3F", where at the  
moment of placement the available memory ranges were "CODE:0-3f"
   Reserved ranges relevant to this placement:
   0-3f                 INTVEC
Total number of errors: 1
Total number of warnings: 1

错误原因:系统包含的文件和工程设置不一致。一个是默认的MSP430 149 一个是MSP430 5438。

解决办法:将工程设置按相应的硬件设置。

参考:StmFans.com is for sale | HugeDomains

Warning[Pe550]: variable " " was set but never used 

 IAR编译器一个警告信息-Warning[Pe550]: variable "变量" was set but never used 
2010-12-30 14:55
一般我们开始学习使用一门语言或者一个新的编译器的时候,都会先写的些非常简单的程序去体验一下。比如C语言:
int main(void)
{
  int a=1,b=2;
  int c;
  c=a+b;
  return 0;
}
这样一个简单的程序,在C430里编译的时候却会出现这样的警告信息:
Warning[Pe550]: variable "c" was set but never used
MSP430的编译器是很特别的。如果定义了一个变量,只是赋个值给他,之后再也不使用它了,编译器往往就会认为它没有使用过。这应该是编译器对空间的优化,且对变量C不分配存储空间(你可以软件仿真下,右键“Add to Watch ”,可以看到C的值是unavailable(难以获得 ))因为只是赋个值给他,这样变量确实是没什么用的。我想这个警告只是个提示,对开发者的提醒。如果是一个很大的程序,难免有些变量定义赋值后就再也没有使用过。这样既浪费资源,又影响速度,有这样一个WARNING会好很多~~
在论坛上的发问: 

http://topic.csdn.net/u/20110913/17/8b5581b4-4bf4-4c05-8615-9ab17263ac2c.html

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined...

经典嵌入式笔试题

8. 关键字volatile有什么含意?并给出三个不同的例子。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1) 并行设备的硬件寄存器(如:状态寄存器)

2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3) 多线程应用中被几个任务共享的变量

未证实。

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

见解一:

这警告有意义.
用volatile修饰的变量一般不直接参与运算,volatile 修饰变量,IAR就以为着这个变量在运算过程中有可能会改变导致结果错误,所以警告用户。

(volatile:易变的)

例如:想计算a * b 要这样:
volatile unsigned char a;
volatile unsigned char b;
unsigned char x,y;
x = a;
y = b;
return (x * y);
建议使用另外一个变量参与计算:
volatile char VVV = 9;
char fun()
{
    char xxx;
    char yyy = 9;
    xxx = VVV;
    return xxx * yyy
}

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=823896

见解二:

再会 volatile 关键字——the order of volatile accesses is undefined

作者: 奔跑 日期: 2011 年 08 月 06 日 261 views 发表评论 (0) 查看评论

1.问题描述:
在编译代码时出现以下警告。
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

警告处代码如下:
if ((TAR+CcrCont) > TACCR0)
{
return FALSE;
}

警告的意思大体是说,对 volatile 的访问没有被定义。

2.问题分析:
看到 volatile ,才想起以前看过的关于volatile的资料。由于 TAR 是会随时被硬件改变的,所以在使用TAR时应该先拷贝该值到一个临时变量,然后再使用。
所以代码应该修改如下:
u16 Temp = 0;
Temp = TAR;
if ((Temp+CcrCont) > TACCR0)
{
return FALSE;
}

另外,这个报警还提醒了我,我的有些变量应该加上 volatile 关键字。

嵌入式volatile关键字

   今天在看S3C2440开发板的初始化代码时,对#define A (* (volatile unsigned long *) 0x48000000这种形式的定义方式有困惑,于是求助GOOGLE大神,在网上搜到了一些文章,觉得以下三篇文章对理解这个有些作用:
文章一:
    对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。
    以 #define IOPIN   (*((volatile unsigned long *) 0xE0028000))为例:作为一个宏定义语句,define是定义一个变量或常量的伪指令。首先( volatile unsigned long * )的意思是将后面的那个地址强制转换成 volatile unsigned long * ,unsigned long * 是无符号长整形,volatile 是一个类型限定符,如const一样,当使用volatile限定时,表示这个变量是依赖系统实现的,以为着这个变量会被其他程序或者计算机硬件修改,由于地址依赖于硬件,volatile就表示他的值会依赖于硬件。
    volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端更改了它,现在硬件设备往往也有自己的私有内存地址,比如显存,他们一般是通过映象的方式,反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被改变了。如果不加这个voliatile修饰,程序是利用catch当中的数据,那个可能是过时的了,加了 voliatile,就在需要用的时候,程序重新去那个地址去提取,保证是最新的。归纳起来如下:
1. volatile变量可变 允许除了程序之外的比如硬件来修改他的内容;
2. 访问该数据任何时候都会直接访问该地址处内容,即通过cache提高访问速度的优化被取消;
     对于((volatile unsigned long *) 0xE0028000)为随硬件需要定义的一种地址,前面加上“*”指针,为直接指向该地址,整个定义约定符号IOPIN代替,调用的时候直接对指向的地址寄存器写内容既可。这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。上述表达式拆开来分析,首先(volatile unsigned long *) 0xE0028000的意思是把0xE0028000强制转换成volatile unsigned long类型的指针,暂记为p,那么就是#define A *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作。
    对于(volatile unsigned char *)0x20我们再分析一下,它是由两部分组成: 
1)(unsigned char *)0x20,0x20只是个值,前面加(unsigned char *)表示0x20是个地址,而且这个地址类型是unsigned char ,意思是说读写这个地址时,要写进unsigned char 的值,读出也是unsigned char 。 
2)volatile,关键字volatile 确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值。例如用 while((unsigned char *)0x20)时,有时系统可能不真正去读0x20的值,而是用第一次读出的值,如果这样,那这个循环可能是个死循环。用了volatile 则要求每次都去读0x20的实际值。 那么(volatile unsigned char *)0x20是一个固定的指针,是不可变的,不是变量。而char  *u则是个指针变量。再在前面加"*":*(volatile unsigned char *)0x20则变成了变量(普通的unsigned char变量,不是指针变量),如果#define i (*(volatile unsigned char *)0x20),那么与unsigned char i是一样了,只不过前面的i的地址是固定的。
那么你的问题就可解答了,(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,指向0x20。而0x20只是个常量,不是指针更不是变量。
文章二:
对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。
    举个例子,比如像寄存器A(地址假定为0x48000000)写入数据0x01,那么就可以这样设置了。
#define A (*(volatile unsigned long *) 0x48000000 )
...
     A = 0x01;
...
    这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变。
    volatile 限定编译器不对这个指针的指向的存储单元进行优化, 即不用通用寄存器暂时代替这个指针的指向的存储单元,而是每次取值都直接到指针的指向的存储单元取值.volatile 主要用于变量会异步改变的情况下,主要有三个方面:1.cpu外设寄存器 2.中断和主循环都会用到的全局变量   3.操作系统中的线程间都会用到的公共变量.上述表达式拆开来分析,首先(volatile unsigned long *) 0x48000000的意思是把0x48000000强制转换成volatile unsigned long类型的指针,即对指针的操作的范围是从0x48000000开始的4个字节(long型).暂记为p,那么就是#define A   *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作!
文章三:
理解嵌入式中#define rRTCCON (*(volatile unsigned char *))0x57000043
            #define rRTCCON    (*(volatile unsigned char *)0x57000043) //RTC control
    理解#define rRTCCON (*(volatile unsigned char *)0x57000043) //RTC control 这样的定义,总是感觉很奇怪,今天终于有了一点点心得, 嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。所以,知道要访问的内存地址后,比如0x57000043:
    第一步是要把它强制转换为指针类型(unsigned char *)0x57000043,s3c2410的rRTCCON是单字节访问的,所以0x57000043强制转换为指向unsigned char类型。volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变——意想不到。
     第二步,对指针变量解引用,就能操作指针所指向的地址的内容了;
            *(volatile unsigned char *)0x57000043
     第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯。
    在嵌入式系统中经常使用到Volatile,对于volatile的用法,我根据自己的理解做如下阐述,希望大家可以发表评论:
    在c语言中,volatile关键字是一种类型修饰符, 用它声明的类型变量表示该变量可以被某些编译器未知的外部因素(比如:操作系统、硬件或者其它线程)更改. 遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址(定义的变量在内存中的地址)的稳定访问。
    编译器对代码的优化是指:CPU在执行的过程中,因为访问内存的速度远没有cpu的执行速度快,为了提高效率,引入了高速缓存cache. C编译器在编译时如果不知道变量会被其它外部因素(操作系统、硬件或者其它线程)修改,那么就会对该变量进行标识,即优化.那么这个变量在CPU的执行过程中,就会被放到高速缓存cache去,进而达到对变量的快速访问. 在了解了优化的概念后,试想如果我们事先就知道该变量会被外部因素改变,那么我们就在这个变量定义前加上Volatile,这样编译器就不会对该变量进行优化.这样该变量在cpu处理的过程当中,就不会被放到高速缓存cache中。
     为什么要让变量在执行的过程中不被放到cache中去呢?如果变量是被外部因素改变,那么cpu就无法判断出这个变量已经被改变,那么程序在执行的过程中如果使用到该变量,还会继续使用cache中的变量,但是这个变量其实已经被改变了.需要到内存地址中更新其内容了.还有一个原因,在一些寄存器变量或数据端口的使用中,因为寄存器变量本身也是靠cache来处理,为了避免引起错误,也可以使用volatile修饰符.(简单的说使用volatile的目的就是:让对volatile 变量的存取不能缓存到寄存器,每次使用时需要重新存取。

你可能感兴趣的:(【IAR 】MSP430 IAR 编译报错:error)