iccavr编译时出现的错误解决办法

合集下载

UCOSIIAVR移植全过程及心得

UCOSIIAVR移植全过程及心得

UCOSII AVR移植全过程及心得经过近一个星期的战斗,现在的ucosii终于成功的移植到了AVR单片机上,我发过帖子,觉得还是有很多朋友对这个比较感兴趣的,所以我把我记录的移植全过程及一些心得写出来与大家分享。

出于兴趣,本人也想再A VR单片机上跑个操作系统玩玩,大家都知道,对于这样的单片机而言,ucosii 当然是首选。

听说网上有现成的范例,偶用力搜搜搜,嘿嘿,结果搜到了两个例子,一个是8515的,另一个是103的,陶醉中…赶紧打开ICCAvr,编译…. Faint,出了一大堆错误,修改了半天也没弄好,没办法,还是自己移植吧。

先是买了邵贝贝翻译的那本第二版的书,躲在宿舍看了整整两天,先是完整的看一遍,从封面到封底,除80 86移植范例外一字不漏,嘿嘿,发现我看得时候基本都明白,看完了好像都忘的差不多了:(,不过没关系,关键是移植嘛,对操作系统的运行原理有一些感性认识就可以了;好,现在开始专攻移植部分,又仔细的看了一遍第13章。

准备工作做好了接下来开始动手!ucos的任务调度机制网上有很多“专著”,我就不罗嗦了,其移植原理也比较简单,主要就是寄存器的保护合恢复。

需要改写的有4个文件,OS_CPU.h,OS_CPU.c,OS_CPU_asm.s,OS_ CFG.h, 再这里合理的设计这些contex的结构是很关键的一步。

需要修改的函数主要有一个C函数OSTaskStkInit();和4个汇编函数,OSStartHighRdy();OSCtxSw();OSIntCtxS w();OSTickISR();一、误入歧途这是我开始设计的contex结构:OSTCB->SP——> |_________| SREG| R0| R1………….| R27| R30|___ R31____根据这样的结构,相应的移植程序如下:OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt){INT8U *stk;INT8U i;INT16U temp;opt = opt; /* 'opt' is not used, prevent warning */stk = (INT8U *)ptos; /* Load stack pointer */temp=(unsigned int)task;temp=*(const unsigned int*)temp; //////////////////////////////*stk-- =(unsigned char)(temp&0xff); //save PC low*stk--=(unsigned char)(temp>>8); //Pc highfor(i=0;i<12;i++) //32 General Purpose Registers{ //Form R31R30,R27 to R18*stk-- = 0;}*stk-- =(unsigned char)((unsigned int )pdata>>8); //pdata saves in R6,R17*stk-- =(unsigned char)((unsigned int)pdata&0xff);for(i=0;i<16;i++){*stk--=0; //From R15 to R0}*stk-- = 0x80; //SREG initial value,Interrupt opened.return ((OS_STK *)stk);}#define PUSH_R() asm("PUSH R31"); asm("PUSH R30"); asm("PUSH R27"); asm("PUSH R26"); asm("PUS H R25"); asm("PUSH R24"); asm("PUSH R23"); asm("PUSH R22"); asm("PUSH R21"); asm("PUSH R20"); asm("PUSH R19"); asm("PUSH R18"); asm("PUSH R17"); asm("PUSH R16"); asm("PUSH R15"); asm("P USH R14"); asm("PUSH R13"); asm("PUSH R12"); asm("PUSH R11"); asm("PUSH R10"); asm("PUSH R9 "); asm("PUSH R8"); asm("PUSH R7"); asm("PUSH R6"); asm("PUSH R5"); asm("PUSH R4"); asm("PUSH R3"); asm("PUSH R2"); asm("PUSH R1"); asm("PUSH R0")#define POP_R() asm("POP R0"); asm("POP R1"); asm("POP R2"); asm("POP R3"); asm("POP R4"); asm(" POP R5"); asm("POP R6"); asm("POP R7"); asm("POP R8"); asm("POP R9"); asm("POP R10"); asm("POP R11"); asm("POP R12"); asm("POP R13"); asm("POP R14"); asm("POP R15"); asm("POP R16"); asm("POP R17"); asm("POP R18"); asm("POP R19"); asm("POP R20"); asm("POP R21"); asm("POP R22"); asm("POP R23"); asm("POP R24"); asm("POP R25"); asm("POP R26"); asm("POP R27"); asm("POP R30"); asm("PO P R31")void OSStartHighRdy(void){unsigned char *stk_temp,*pdest;//The Middle SP V ariableunsigned char s0,s1;OSTaskSwHook();OSRunning=1; //set flagstk_temp=OSTCBHighRdy->OSTCBStkPtr;s0=(unsigned char)((unsigned int)stk_temp&0xff); //sp low 8bits1=(unsigned char)((unsigned int)stk_temp>>8); //sp high 8bitasm("OUT 0x3d, %s0\n""OUT 0x3e, %s1");asm("POP R0\n" //Restore SREG"OUT 0x3f, R0");POP_R(); //Restore R0--R31}/***************************************************/void OSCtxSw(void){unsigned char i,j;unsigned char *psrc,*next_sp;unsigned int temp;PUSH_R(); //save R31--R0asm("IN R0, 0x3f\n""PUSH R0"); //save SREGasm("IN %i, 0x3d\n""IN %j, 0x3e");temp=(j<<8)+i;OSTCBCur->OSTCBStkPtr=(unsigned char*)temp; //SA VE current task sp in TCBcur OSTaskSwHook();OSTCBCur=OSTCBHighRdy;OSPrioCur=OSPrioHighRdy;next_sp=OSTCBHighRdy->OSTCBStkPtr;i=(unsigned char)((unsigned int)next_sp&0xff);j=(unsigned char)((unsigned int)next_sp>>8);asm("OUT 0x3d, %i\n"//Get sp"OUT 0x3e,%j" );asm("POP %i \n" /////////Restore SREG"OUT 0x3f,%i" );POP_R(); ///////////Restore R}void OSIntCtxSw(void){unsigned char i,j;unsigned char*next_sp;OSTaskSwHook();OSTCBCur=OSTCBHighRdy;OSPrioCur=OSPrioHighRdy;next_sp=OSTCBHighRdy->OSTCBStkPtr;i=(unsigned char)((unsigned int)next_sp&0xff);j=(unsigned char)((unsigned int)next_sp>>8);asm("OUT 0x3d, %i\n"//Get sp"OUT 0x3e,%j" );asm("POP %i \n" /////////Restore SREG"OUT 0x3f,%i" );POP_R(); ///////////Restore R}/*************************************************/#pragma interrupt_handler OSTickISR:TIMER_INT_VECTOR#pragma ctask OSTickISRvoid OSTickISR(void){unsigned char i,j;unsigned int sptemp;PUSH_R(); //save R31--R0TCNT0 = 0xb2; //reload counter valueasm("IN R0, 0x3f\n""PUSH R0"); //save SREG///i=j=0; This is used ONLY TO AVOID THE W ARNING.OSIntNesting++;asm("IN %i,0x3d\n" //Get SP V alue"IN %j,0x3e");sptemp=(j<<8)+i;if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=(unsigned char*)sptemp;}OSTimeTick();OSIntExit();asm("POP %i\n" //Restore SREG"OUT 0x3f, %i");POP_R(); //Restore R0--R31}我写了个测试程序:其中自己建立了两个任务,LED()用于控制数码管的亮与暗,key_scan()用与判断是否按下了PA0,为了调试程序的方便,没有用OS提供的通讯机制,直接用了一个全局变量key_press;再任务k ey_scan里,当检测到按键按下时设置key_press=1,否则设置为0;而任务LED()则根据key_press的值控制L ED的亮与暗。

C语言keil编译器提示错误的解决方法

C语言keil编译器提示错误的解决方法

C编译器错误与解决方法1. Warning 280:’i’:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:’Music3’:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can’t open file ‘beep.h’说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:’LedOn’:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:’DelayX1ms’: missing function-prototypeC:\8051\INPUT.CError 267 :’DelayX1ms ‘:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调用8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接 解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享10.***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1CALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_SPI_SEND_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。

AVR单片机无法进入编程模式

AVR单片机无法进入编程模式

做项目用到了A VR单片机A Tmega16,学习的过程中编辑编译环境是ICCA VR,采用并口下载器和PonyProg2000软件下载程序。

项目做的差不多的时候,考虑到如果要去现场调试程序并且还用并口下载器,那就要带个台式电脑或者买个EXPRESSCARD了,这样就很不方便,那就考虑笔记本电脑吧。

后来就买了个深圳市研学电子有限公司的A VR二合一工具。

照着光盘资料安装了USB驱动和A VR Studio软件后,将A VR二合一工具和计算机USB 口以及目标板相连后,打开A VR Studio软件,单击工具栏上的按钮,出现如下对话框:
单击Connect按钮,出现如下对话框:
然后单击Flash组中的Program按钮,出现如下对话框:
可以看到在历史操作窗口中显示Entering programming mode.. FALILED!,提示我们进入编程模式失败。

然后就上网找原因,看看有没有遇到我同样问题的童鞋们,哎,我所看到的帖子里面只有提问的,没有解决问题的。

然后上深圳市研学电子有限公司的网站找找吧!发现了很关键的一句话,呵呵。

下载线需要操作复位脚来实现同步,所以大家在设计目标板的时候不要做外置的复位及看门狗电路,AVR内部已经带有硬件看门狗,直接一个上拉电阻即可。

然后我把复位电容去掉,问题就解决了。

后来发现把复位电容换成100uf/16V也不会出现上述问题。

ICC AVR编译时常见的错误报告

ICC AVR编译时常见的错误报告

ICC AVR编译时常见的错误报告新手用ICC编程的时候,经常会出现一些错误,现在将常见的错误报告整理如下:一、正常编译通过CODE:C:\icc\bin\imakew -f main.makiccavr -c -IC:\icc\include\ -e -DATMEGA -DATMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.ciccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmegaDevice 1% full.Done.[Copy to clipboard]这是我们最想看到的了,万事大吉。

二、工程中未加入.C文件CODE:C:\icc\bin\imakew -f main.makiccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmegaunknown file type @main.lk, passed to linker!ERROR unknown file type '@main.lk'C:\icc\bin\imakew.exe: Error code 1Done: there are error(s). Exit code: 1[Copy to clipboard]解决办法:将你的程序加入工程中,可以右键程序区>>ADD to project三、程序没有后缀名,或者后缀名不正确。

编译器常见警告与错误信息的解决办法

编译器常见警告与错误信息的解决办法

KEIL C编译器常见警告与错误信息的解决办法1. Warning 280:‟i‟:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:‟Music3‟:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can‟t open file …beep.h‟说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#include “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:‟LedOn‟:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:‟DelayX1ms‟: missing function-prototypeC:\8051\INPUT.CError 267 :‟DelayX1ms …:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义--------------------------------------------------------------------------------------------------keil c编译器错误与解决方法2008-05-27 20:191. Warning 280:‟i‟:unreferenced local variable 说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:‟Music3‟:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can‟t open file …beep.h‟说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:‟LedOn‟:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:‟DelayX1ms‟: missing function-prototypeC:\8051\INPUT.CError 267 :‟DelayX1ms …:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调用8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享10.***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1CALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_SPI_SEND_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。

ICCAVR编译器中文使用说明

ICCAVR编译器中文使用说明

ICCAVR编译器中⽂使⽤说明ImageCraft ICCAVR的中⽂使⽤说明翻译詹卫前⼀ 运⾏光盘上的SETUP.EXE程序进⾏安装a?òµ?µ打开光盘驱动器所对应的盘符c SETUP.EXE按照屏幕提⽰a?aê?在对话框中填⼊注意drive对应你的机器中的光盘驱动器盘符cè·?¨其余同⽅法⼀注意 按上述⽅法进⾏安装后对正式版⽤户还要进⾏第⼆步的注册在标准版中有⼀些功能限制代码的压缩2éòaù×¢2áa IDEb Unlock Diskc Help Importing a License from a Floppy Disk2¢?ò??DDµ¥?÷ ICCAVR软件⾃动进⾏注册当你确定并再次重新启动ICCAVR后对不是⾸次安装或使⽤时间已超过30天的⽤户 对这类⽤户在程序启动时已不能进⼊IDE环境你应该选择按钮 这时会出现⼀个注册对话框Importing a License froma Floppy Diskc Unlock Diskµ¥?÷é?ò?2??Dìáµ?µ?°′?¥ ICCAVR软件⾃动进⾏注册当你确定并再次重新启动ICCAVR后注意 软盘在注册时应打开写保护软盘成为⼀张空盘安装和注册 当你需要在不同的电脑中使⽤ICCAVR或在同⼀台电脑中将ICCAVR重新安装在与原来不同的⽬录位置时Help TransferringYour License to a Floppy Diskµ?×¢2át′??íµ?òèí?ìé?t ImageCraft 的ICCAVR介绍ImageCraft 的ICCAVR是⼀种使⽤符合ANSI标准的C语⾔来开发微控制器程序的⼀个⼯具ICCAVR是⼀个综合了编辑器和⼯程管理器的集成⼯作环境源⽂件全部被组织到⼯程之中编译错误显⽰在状态窗⼝中光标会⾃动跳转到编辑窗⼝中引起错误的那⼀⾏INTEL HEX格式⽂件可被⼤多数的编程器所⽀持ICCAVR是⼀个32位的程序出于篇幅考虑仅介绍使⽤ICC AVR所必须具备的知识应对C语⾔有了⼀定程度的理解ICCAVR中的⽂件类型及其扩展名⽂件类型是由它们的扩展名决定的输⼊⽂件这个⽂件保存由IDE所创建和修改的⼀个⼯程的有关信息它可以由⼏个库封装在⼀起如果库被引⽤您也可以创建或修改⼀个符合你需要的库.s 对应每个C语⾔源⽂件.o 由汇编⽂件汇编产⽣的⽬标⽂件.hex INTEL HEX格式⽂件.eep INTEL HEX格式⽂件.cof COFF 格式输出⽂件.lst 列表⽂件.mp 内存映象⽂件.cmd NoICE 2.xx 调试命令⽂件.dbg ImageCraft 调试命令⽂件3编译附注#pragma interrupt_handler : : ...这个附注必须在函数之前定义func2是中断操作函数并且保存和恢复函数所使⽤的全部寄存器#pragma ctask ...这个附注指定了函数不⽣成挥发寄存器来保存和恢复代码#pragma text:改变代码段名称#pragma data:改变数据段名称这个附注在分配全局变量⾄EEPROM 中时必须被使⽤#pragma abs_address:函数与全局数据不使⽤浮动定位这在访问中断向量和其它硬件项⽬时特别有⽤使⽬标程序使⽤正常浮动定位你可以在你的源代码中使⽤C ++的 // 类型的注释你可以使⽤0b<1|0>* 来指定⼆进制常数0b10101等于⼗进制数21áé2ú±à代码转换IAR或其它ANSI C编译系统的代码转换IAR C编译器作为应⽤于AVR的第⼀个C编译器当你从IAR 编译系统转换到ImageCraft编译系统时IAR C中IO寄存器的定义与ICCAVR也是相同的ICCAVR使⽤pragma附注描述中断操作函数interrupt关键字下⾯是⼀个对照#pragma interrupt_handler func:4// 4 是这个中断的向量号ICCAVR可以使多个中断向量共⽤⼀个中断处理函数interrupt [vector_name] func() // vector_name是某⼀个中断向量的名称以增加程序的可读性FLASH存贮器ICCAVR使⽤const关键字来达到相同的⽬的过程调⽤转换在两个编译系统之间函数参数传递使⽤的寄存器是不同的在线汇编IAR不⽀持在线汇编符号三起步⾃你启动IDE后进⼊\icc\examples.avr⽬录并且选择并打开⼯程然后从Project菜单中选择Options命令打开⼯程编译选项然后从Project菜单中选择Make Project命令并且在状态窗⼝中显⽰所有的信息在与源⽂件同⼀个⽬录中输出⼀个⽂件led.hex′ó?àêy?ü?§3?AVR MCU的编程器和模拟器都⽀持这种格式这样就完成了⼀个程序的构筑⽐如AVR Studioú±àò±êCOFF输出⽂件格式你也可使⽤⼯具条或⿏标右键弹出菜单你可以在⼯程窗⼝单击⿏标右键选择编译选项IDE将使⽤编辑器打开这个⽂件作为试验可设置⼀些错误IDE⾸先⾃动保存已经改变的⽂件这时在状态窗⼝中会显⽰错误信息或单击其左边的错误符号基本上所有C编译器都是这样开始⼀个新的⼯程从Project菜单中选择New命令输出⽂件的名称取决于你的⼯程⽂件名称如果你创建⼀个名称为foo.prj的⼯程⾃从创建你⾃⼰的⼯程后并且将这个⽂件加⼊到⼯程⽂件排列中Build?éò?oüèYò×µ?11?t?a??1¤3ìéò?ê1ó?ATMEL的AVR Studio来调试你的代码你可以使⽤应⽤程序向导来⽣成⼀些使⽤有关硬件的初始化代码C程序的剖析⼀个C程序必须定义⼀个main调⽤函数可执⾏因此你也可以在你的⽬标系统中执⾏它⼀个C程序需要设定⽬标环境通常然后是⽆限循环地运⾏让我们看 \icc\examples⽬录中的⽂件led.c/* 为使能够看清LED的变化图案对应LED熄灭*/while (1){/*LED向前步进 */for (i = 0; i < 8; i++)LED_On(i);/* LED向后步进 */for (i = 8; i > 0; i--)LED_On(i);/* LED跳跃*/for (i = 0; i < 8; i += 2)LED_On(i);for (i = 7; i > 0; i -= 2)LED_On(i);}}这个main例程是很简单的它运⾏在⼀个⽆限循环中LED是在LED_On例程中被改变的因为CPU运⾏很快因为延时的实际延时值不能被确定如果这个实际定时时间是重要的其它的例⼦但同样清楚地显⽰了如何⽤C写⼀个中断处理过程四 编译⼀个单独的⽂件正常建⽴⼀个输出⽂件的次序是然⽽这时可以这样操作File Compile File...à′?′DD和中的任意⼀个⽂件应该是打开的编译⼀个⽂件为⽬标⽂件编译⼀个⽂件为输出⽂件注意2′ó2?µ¥中选择命令在对话框中你可以指定⼯程的名称如果你使⽤⼀些已经建⽴的源⽂件Project AddFile(s)áííaFile Newéò??ú2?µ¥中选择或命令来保存⽂件AddFile(s)ò2?é?úµ±?°±à?-′°?ú?Dµ¥?÷êó±êóò?ü将⽂件加⼊已打开的⼯程列表中但也可不作这样要求Project Options3ò?¨ò??ü??µ?±àò??µ±??′|àí1¤3ì11?tê±è?1?òí·t×÷á?DT??IDE会⾃动重新编译已经改变的头⽂件C⽂件必须使⽤扩展名.séòè?òat·??ú1¤3ìáD±í?D1¤3ì1üàí?÷?ú11?t1¤3ìê±′tò?íaµ?t2?óèàí2?éòú±àòDéèóD12êyê1óè?µ?±àò??ò2?é?è?±àò??×°èóD1¤3ì?D为避免你的⼯程⽬录混乱通常这个⽬录是你的⼯程⽬录的⼀个⼦⽬录 编辑窗⼝编辑窗⼝是你与IDE交流信息的主要区域当编译存在错误时编辑器会⾃动将光标定位在错误⾏的位置对C源⽂件中缺少分号编辑器定位于其下⾯⼀⾏ 应⽤构筑向导应⽤构筑向导是⽤于创建外围设备初始化代码的⼀个图形界⾯Wizard Tools ApplicationBuilderó|ó?11?t?òµ?ê1ó?±àòD???¨µ???±êMCU来产⽣相应的选项和代码它的使⽤是很显⽽易见的在这⾥你可以设置MCU的所具有的中断定时器UART2¢2úéú?àó|µ?′ú1?é2úéúmain( )函数 状态窗⼝状态窗⼝显⽰IDE的状态信息 终端仿真IDE有⼀个内置的终端仿真器在系统编程但它可以作为⼀个简单的终端也可下载⼀个ASC从6.20版本开始五弹出菜单在ICCAVR环境中单击右键2新建⼀个⽂件ReopenóD1?àúê·t??ê?µ?óò±?µ?×ó2?µ¥?D打开⼀个已以经存在的⽂件⽤于编辑Reload …form Disk′ó′??ì?D??D?×°??µ±?°t从最后⼀次的备份⽂件中装载当前⽂件保存当前⽂件则将原⽂件以.~形式保存将当前⽂件⽤另外⼀个名称来保存关闭当前⽂件系统会进⾏提⽰编译当前⽂件成⽬标⽂件其主要⽤于为创建新的启动⽂件或库产⽣⽬标⽂件编译当前⽂件成输出⽂件Save AllCloss Allí??ù?ü?áìáê±£′?ò??-DT??µt打印当前⽂件退出ICCAVR的IDE环境Edit Menu编辑菜单UndoRedoCutCopyPasteDeleteSelect AllBlock Indent对选择的整块内容左移4Find…在编辑窗⼝中寻找⼀个⽂本Match Case – 区分⼤⼩写Whole Word – 全字匹配Up/Down –往上或往下Find in Files... –在当前打开的⽂件中或在当前⼯程的所有⽂件中或当前⽬录中的⽂件中寻找⼀段⽂本Case Sensitive –⼤⼩写敏感Whole Word - 全字匹配Regular Expression – 寻找规则的表达式Replace... – 在编辑器中替换⽂本Goto Line Number – 转到指定⾏号Delete Bookmark – 删除书签Goto Bookmark – 跳转到指定的书签View Menu视图菜单Status Window – 如果选中Project Makefile – 以只读⽅式打开makefile ⽂件Output Listing File – 以只读⽅式打开列表⽂件6Open –打开⼀个已经存在的⼯程⽂件Close All Files – 关闭全部打开的⽂件Make Project –解释和编译已经修改的⽂件为输出⽂件注意在版本升级后对原有⼯程最好全部重新构筑这个⽂件可以是⾮源⽂件Option... – 打开⼯程编译选项对话框7UART的波特率éò⽣成硬件的初始化代码Compiler Options 编译选项编译选项总共有三个页⾯Compiler和Target在Paths页⾯中有Include Path(s) –你可以指定包含⽂件的路径Assembler Include Path(s) – 指定汇编包含⽂件的路径Library Path – 链接器所使⽤的库⽂件的路径Strict ANSI C Checking – 严格的ANSI C语法检查Accept Extensions – 接受C++类型语法扩充Macro Define(s) – 定义宏宏定义形式如下DEBUG:1;PRINT=printf等价于#define DEBUG 1#define PRINT printfMacro Undefine(s) –同上Output File Format – 输出⽂件格式COFF/HEXOptimizations – 代码优化Default – 基本优化共⽤相同的⼦例程等Maximize Code Size Reduction – 只有专业版才可使⽤去除了⽆⽤的碎⽚代码Device Configuration – 选择⽬标MCUMemory Sizes – 要选择"Custom" 时指定内存⼤⼩SRAM和EEPROM Text Address – 通常代码地址开始于中断向量区域后⾯通常为0x60Enhanced Core – 指定硬件⽀持增强核指令例如, 8515的SRAM 起始于0x60, 在IO寄存器空间后⾯延伸了512字节因此SRAM也是从0开始的注意这个选项需要很⼤的内存AVR Studio的终端模拟仿真被⽀持Return Stack Size – 指定编译器使⽤的硬件堆栈的⼤⼩Non Default Startup –允许你指定⼀个启动⽂件的位置这样IDE可以使⽤多个启动⽂件六 启动⽂件这个链接器会⾃动将启动⽂件连接到您的程序之前启动⽂件根据⽬标MCU的不同在crtavr.o 和 crtatmega.o 中间任意选择⼀个它也是您的程序的起点12345è?1µ??÷o¯êymain( )⼀旦退出启动⽂件也定义了复位向量具体可参考中断操作部分cd \icc\libsrc.avr; 进⼊你安装的编译器路径; 编辑修改crtavr.s⽂件; ⽤IDE打开crtavr.s⽂件Object">;选择编译到⽬标⽂件你应该⽤"crtatmega" 代替"crtavr"word⽽⾮Mega芯⽚每⼀个中断⼊⼝地址使⽤⼀个字.你也可以有多个启动⽂件注意2è±ê??·ac:\icc\libsrc.avr\libsrc.zipéò?′ó?¥á?í?é?è?òaò???UNZIP程序进⾏解压缩密码显⽰在"About"对话框中unzip -s libsrc.zip; unzip 提⽰输⼊密码2AVR特殊函数----- ICCAVR有许多访问UARTì2éo¯êy???ì2a????ê?·?ò?3?oüóDó?3io*.h (io2313.h, io8515.h, iom603.h, ... 等.)这些⽂件中是从ATMEL官⽅公开的定义IO寄存器的源⽂件经过修改得到的PORTB = 1;uc = PORTA;4macros.h这个⽂件包含了许多有⽤的宏和定义如果你的程序使⽤了头⽂件所列出的函数在使⽤浮点数和长整型数的程序中必须⽤#include预编译指令包含这些包含了这些函数原形的头⽂件assert.h - assert(), 声明宏ctype.h – 字符类型函数float.h – 浮点数原形limits.h – 数据类型的⼤⼩和范围math.h – 浮点运算函数stdarg.h – 变量参数表.stddef.h – 标准定义stdio.h – 标准输⼊输出函数stdlib.h – 包含内存分配函数的标准库string.h – 字符串处理函数3ê1ó??aD?o¯êy°ó|µ±ó?"#include "包含否则返回零int isalpha(int c)如果c是字母返回⾮零数值如FF, BELL, LF ..等否则返回零int isdigit(int c)如果c是数字返回⾮零数值否则返回零int islower(int c)如果c是⼩写字母返回⾮零数值否则返回零int ispunct(int c)如果c是⼀个可打印字符⽽不是空格否则返回零int isspace(int c)如果c是⼀个空格字符返回⾮零数值否则返回零int isupper(int c)如果c是⼤写字母返回⾮零数值否则返回零int tolower(int c)如果c是⼤写字母则返回c对应的⼩写字母int toupper(int c)如果c是⼩写字母则返回c对应的⼤写字母 浮点运算库下列函数⽀持浮点数运算#include·§?ú-之间float ceil(float x)返回对应x的⼀个整型数float cos(float x)返回以弧度形式表⽰的x的余弦值float cosh(float x)返回x的双曲余弦函数值float exp(float x)返回以e为底的x的幂即10xfloat fabs(float x)返回x的绝对值float floor(float x)返回不⼤于x的最⼤整数float fmod(float x, float y)返回x/y的余数float frexp(float x, int *pexp)把浮点数x分解成数字部分yoíò?2为底的指数n两个部分2n y y值被函数返回float fround(float x)返回最接近x的整型数float ldexp(float x, int exp)返回xêy2?·?′?·?µ?pint指向的变量并且作为函数返回值返回float sqrt(float x)返回x的平⽅根float sin(float x)返回以弧度形式表⽰的x的正弦值float sinh(float x)返回x的双曲正弦函数值float tan(float x)返回以弧度形式表⽰的x的正切值float tanh(float x)返回x的双曲正切函数值5MCU±ê×?stdio.h的许多内容不可以使⽤同样使⽤之前应⽤"#include "预处理最低层的IO程序是单字符的输⼊(getchar)和输出(putchar)程序例如⽤printf输出LCD为在ATMEL的AVR Studio模拟器使⽤标准IO函数注意单字符输出函数putchar是输出到UART装置没有修改'\n' 字符必须被映射为成对的回车和换⾏格式说明符是标准格式的⼀个⼦集同 %x%u - 输出⽆符号⼗进制整数%s – 输出⼀个以C中空字符NULL结束的字符串%c – 以 ASCII 字符形式输出取决于你的特别需要和代码的⼤⼩代码越⼤基本形: 只有 %c, %d, %x, %u, 和 %s 格式说明符是承认的长整形: 针对长整形数的修改 %ld, %lu, %lx被⽀持, 以适⽤于精度要求较⾼的领域浮点形: 全部格式包括%f 被⽀持你使⽤编译选项对话框来选择版本int putchar(int c)输出单个字符注意输出’\n’字符⾄程序终端窗⼝int sprintf(char *buf, char *fmt)按照格式说明符输出格式化⽂本frm字符串到⼀个缓冲区⽀持功能"const char *" cprintf 和csprintf 是将FLASH中的格式字符串分别以prinf和sprinf形式输出 标准库和内存分配函数标准库头⽂件定义了宏NULL和RAND_MAX和新定义的类型size_t×¢òa?ú??µ÷ó?è?òa?ú′?·3ìDòmalloc和realloc)之前int abs(int i)返回i的绝对值int atoi(char *s)转换字符串s为整型数并返回它否则返回0 double atof(const char *s)转换转换字符串s为双精度浮点数并返回它long atol(char *s)转换字符串s为长整型数并返回它否则返回0void *calloc(size_t nelem, size_t size)分配"nelem"个数据项的内存连续空间如果分配成功返回分配内存单元的⾸地址void exit(status)终⽌程序运⾏它是担任⽤户main函数的返回点如果分配成功则返回内存区地址void _NewHeap(void *start, void *end)初始化内存分配程序的堆符号_bss_end定义为编译器⽤来存放全局变量和字符串的数据内存的结束这个结束值不能被放⼊堆栈中void *realloc(void *ptr, size_t size)重新分配ptr所指向内存区的⼤⼩为size字节返回指向该内存区的地址指针long strtol(char *s, char **endptr, int base)按照"base."的格式转换"s"中起始字符为长整型数* endptr将设定"s"中转换结束的位置除了返回类型为⽆符号长整型数外 字符串函数⽤"#include "预处理后定义了NULLvoid *memchr(void *s, int c, size_t n)在字符串s中搜索n个字节长度寻找与c相同的字符否则返回NULLè?1??àí??ò·µ??0ò·µ1ò·µ-1但拷贝区不可以重迭返回s1µ±′éòµü它返回s·µ??s1包括结束NULL字符如果没有匹配字符找到int strcmp(char *s1, char *s2)⽐较两个字符串如果s1>s2则返回1char *strcpy(char *s1, char *s2)拷贝字符串s2⾄字符串s1size_t strcspn(char *s1, char *s2)在字符串s1搜索与字符串s2匹配的第⼀个字符其返回s1中找到的匹配字符的索引不包括结束NULL字符不含结束NULL字符如果s2长度⽐n⼩返回s1µ±è???°n个字符但其只拷贝前n个字符但它返回的是在s1匹配字符的地址指针char *strrchr(char *s, int c)在字符串s中搜索最后出现的c·??ò·µ??NULL°üà¨?áê?NULL字符中找到的第⼀个不匹配字符的索引如果成功它返回s1中匹配⼦字符串的地址指针⽀持函数"const char *" 这些函数除了它的操作对象是在FLASH中常数字符串外size_t cstrlen(const char *s)char *cstrcpy(char *dst, const char *src);int cstrcmp(const char *s1, char *s2);8ü¨òá2è·¨µààDíva_list和三个宏分派指定的类型如int ⼩的整型类型如"char"不能被⽀持printf()可以使⽤vfprintf()来实现#includeint printf(char *fmt, ...){va_list ap;va_start(ap, fmt);vfprintf(fmt, ap);va_end(ap);}9ú′?í?è′èí?tµ??úèY???á±???±?ó2?tê?ó?×÷o¯êyµ?·µ??µ??·同样地如果你使⽤动态分配内存警戒线警戒线数据区低端地址警戒线启动代码写了⼀个正确的关于数据区的地址字节和⼀个类似的正确的关于软件堆栈的地址字节作为警戒线如果你使⽤了你⾃⼰的启动⽂件你将需要额外改造为新的启动⽂件如果你使⽤动态分配内存参考内存分配函数如果警戒线字节仍然保持正确的值那么函数检查通过那么警戒线字节将可能被破坏你的程序将可能运⾏不正常或偶然崩溃_StackOverflowed(char c)它调⽤了带⼀个参数的函数那么硬件堆栈有过溢出那么软件堆栈曾经溢出它是两个堆栈都可能溢出的在_StackOverflowed执⾏起作⽤时作为例⼦那么将不能返回_StackCheck函数库会⽤⼀个缺省的_StackOverflowed函数来跳转到0的位置你可能希望⽤⼀个函数来代替它以指⽰更多的错误条件注意⾃堆栈溢出指⽰故障程序以来macros.h.中这两个函数的原型在头⽂件七 访问AVR的低层硬件AVR系列使⽤⾼级语⾔编程时有很⾼的C语⾔密度由于AVR性能偶然情况下⽬标MCU的硬件特点在C语⾔中不能很好地使⽤头⽂件io*.h iom603.h等这些⽂件是从ATMEL官⽅发布的⽂件经过修改⽂件macros.h定义了许多有⽤的宏这个编译器的效率很⾼outsbi等注意尽管io*.h定义了它们的bit 的位置很多时候你将需要使⽤定义在macros.h⽂件中的BIT()宏avr.h:#define SRE0x80// 外部 RAM 使能... (你的C程序)MCUCR |= SRE;io8515.h#define SRE7... (你的C程序)#includeMCUCR |= BIT(SRE);2bit很幸运⽽没有借助于汇编指令或其它⾮标准C结构a |b – 按位或这惯⽤于打开某些位例如这个运算在检查某些位是否置1时有⽤If ((PORTA & 0x81) == 0)// 检查位7和位0注意圆括号需要括在&运算符的周围这是C程序中很多错误的原因之⼀这个运算对⼀个位取反有⽤在下⾯的例⼦中PORTA ^= 0x80;// 翻转位7~a – 按位取反. 在表达式中这个运算执⾏⼀个取反与这个运算组合使⽤尤其有⽤PORTA &= ~0x80;// 关闭位7这个编译器对这些运算能产⽣最理想的机器指令sbic指令可以⽤在根据位的状态进⾏条件分枝的按位与运算中 程序存贮器和常量数据AVR是哈佛结构的MCU?a?ùµ?éè??ê?óDò?D?ó?µ?µ?·??aµ?µ??·êDíAVR装置⽐传统结构访问更多的存贮器Atmega系列允许有超过64K字的程序存贮器和64K字节的数据存贮器⽽程序计数器仍保留在16位上C不是在这种机器上发明的C指针是任意⼀个数据指针或函数指针可是同是哈佛结构的AVR⾮标准C解决了这个问题序存贮器中这个const限定词可以应⽤于不同的场合例如"ptr1"是⼀个项⽬在数据存贮器⽽指向数据的指针在程序存贮器最后在⼤多数的例⼦中"table" 和和"ptr1"是很典型的注意C标准不要求"const"数据是放⼊只读存贮器中除了正确访问就没有要紧的了在承认参数的C标准中使⽤const限定是⾮传统的这样做与标准C函数定义是有⼀定冲突的标准"strcpy"的原型是strcpy(char *dst, const char *src)èúICCAVR下因此这些函数定义设有const限制注意只有常数变量以⽂件存贮类型放⼊FLASH中如果你使⽤有const限制的局部变量4aò3µ÷×·′?×?à§??µ?ê?×?·?′?µ?·oí′|àíè?1?×?·?′?ê?·3ìDò′??ü?÷?Dò×·′?ò2±?D?±?·úêy?Y′??ü?÷?D缺省的字符串分配这个缺省的⽅法是同时分配字符串在数据和程序存贮器中为了确保它们的值是正确的因此只有单⼀的字符串拷贝函数是必须的你能使⽤常量字符型数组来将字符串只分配进程序存贮器中const char hello[] = "Hello World";在这个例⼦中但不能⽤作标准C库中字符串函数的参数另外只分配全部字符串到FLASH存贮器中当对应"Project->Options->Target->Strings In FLASH Only"检查框被选中时这时称必须很⼩⼼地调⽤库函数字符串类型"const char *"是有效的。

如何解决C语言中的编译错误与警告

如何解决C语言中的编译错误与警告

如何解决C语言中的编译错误与警告C语言是一种广泛应用于系统编程和嵌入式开发的编程语言,它的编译过程中常常会出现各种错误和警告。

这些错误和警告可能会导致程序无法正确编译或者在运行时出现问题。

因此,解决C语言中的编译错误与警告是每个程序员都需要掌握的重要技能。

本文将介绍一些常见的编译错误和警告,并提供一些解决方法。

一、理解编译错误和警告的含义在解决编译错误和警告之前,我们首先需要理解它们的含义。

编译错误是指在编译过程中发现的语法错误或者逻辑错误,这些错误会导致程序无法正确编译。

编译警告是指在编译过程中发现的一些潜在的问题,虽然不会导致程序无法编译,但可能会导致程序在运行时出现问题。

二、常见的编译错误和警告1. 语法错误:语法错误是最常见的编译错误之一,它通常是由于编程人员在编写代码时遗漏了分号、括号不匹配等导致的。

解决语法错误的方法是仔细检查代码,确保语法正确。

2. 未声明的标识符:当使用一个未声明的标识符时,编译器会报错。

解决这个问题的方法是在使用标识符之前先进行声明或者引入相应的头文件。

3. 类型不匹配:类型不匹配是指在赋值或者函数调用过程中,变量的类型与期望的类型不一致。

解决这个问题的方法是检查变量的类型,并进行相应的类型转换。

4. 未使用的变量:编译器会对未使用的变量发出警告,这可能是由于代码中存在一些无用的变量。

解决这个问题的方法是删除未使用的变量或者对其进行使用。

5. 未初始化的变量:未初始化的变量可能导致程序在运行时出现未定义的行为。

解决这个问题的方法是在使用变量之前先进行初始化。

6. 函数返回值不匹配:函数的返回值类型与函数定义时声明的返回值类型不一致会导致编译错误。

解决这个问题的方法是检查函数的返回值类型,并进行相应的修改。

7. 潜在的内存泄漏:编译器可能会对未释放的内存发出警告,这可能会导致内存泄漏。

解决这个问题的方法是在使用完内存后及时释放。

三、解决编译错误和警告的方法1. 仔细阅读编译错误和警告信息:编译器通常会提供详细的错误和警告信息,我们应该仔细阅读这些信息,找出问题所在。

如何处理代码中的编译器错误

如何处理代码中的编译器错误

如何处理代码中的编译器错误编写代码时,经常会遇到编译器错误。

这些错误可能是语法错误、类型错误、逻辑错误等。

对于初学者来说,正确处理这些错误是一项重要的技能。

本文将介绍一些处理编译器错误的方法,帮助您更好地解决问题。

处理编译器错误的步骤如下:1.仔细阅读错误信息:当编译器发现错误时,它会生成错误信息,通常包括错误的类型、错误的位置和相关的详细信息。

首先,要仔细阅读错误信息,理解错误的类型和位置。

2.检查错误的代码行:根据错误信息,找到代码中与错误相关的行。

检查这些行,看看是否有明显的错误,比如拼写错误、缺少分号等。

3.阅读文档或向导:如果您遇到不熟悉的错误,可以阅读编程语言的官方文档、教程或向导,寻找错误的解决方案。

这些资源通常提供了常见错误的解释和解决方法。

4.使用搜索引擎:如果您无法找到编程语言的文档或解决方案,可以使用搜索引擎搜索错误信息或相关关键字。

通常会有其他开发者遇到类似的问题,并提供了解决方法。

5.检查变量和函数:编译器错误可能与变量或函数的类型不匹配有关。

检查相关的变量和函数声明,并确保它们的类型正确。

如果类型不匹配,可能需要修改它们的声明或进行类型转换。

6.注释或删除问题代码:如果错误是由于特定代码行引起的,可以尝试注释掉该行或删除它,然后重新编译程序。

如果编译成功,可以逐步恢复修改,找出引起错误的具体原因。

7.检查依赖库或模块:如果错误涉及到使用第三方库或模块,可能是由于缺少依赖项或版本不兼容引起的。

确保已正确安装和配置所需的依赖库,并检查版本是否匹配。

8.请求帮助:如果您尝试了以上方法仍然无法解决错误,可以寻求他人的帮助。

您可以向同事、论坛、开发者社区或在线编程问答网站(如Stack Overflow)提问,并提供尽可能详细的错误信息和相关代码。

9.实验和调试:处理编译器错误通常需要进行反复尝试和实验。

您可以尝试修改代码、引入调试语句、使用调试工具等,来定位和解决问题。

如果可能,尝试在更简化的环境中复现错误,以便更容易找到问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

初学者初用ICCAVR编程的时候,经常会出现一些错误,现在将常见的错误报告整理如下。

这里的一些错误是为了展示说明而故意制造的,欢迎你提供你遇到的错误和解决方法。

一、正常编译通过CODE:C:\icc\bin\imakew -f main.makiccavr -c -IC:\icc\include\ -e -DA TMEGA -DA TMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.ciccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmega Device 1% full.Done.[url="][/url]这是我们最想看到的了,万事大吉。

二、工程中未加入.C文件CODE:C:\icc\bin\imakew -f main.makiccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmega unknown file type @main.lk, passed to linker!ERROR unknown file type '@main.lk'C:\icc\bin\imakew.exe: Error code 1Done: there are error(s). Exit code: 1解决办法:将你的程序加入工程中,可以右键程序区>>ADD to project三、程序没有后缀名,或者后缀名不正确。

CODE:C:\icc\bin\imakew -f main.makC:\icc\bin\imakew.exe: 'main' is up to dateDone.这是一个很难理解的错误,它是由工程中的程序文件没有后缀名造成的。

解决办法:将原有文件移出工程,将文件的后缀名改为.C,然后再加入工程中。

四、没有main函数CODE:C:\icc\bin\imakew -f main.makiccavr -c -IC:\icc\include\ -e -DA TMEGA -DA TMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.ciccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmega!ERROR file 'crtatmega.o': undefined symbol '_main'C:\icc\bin\imakew.exe: Error code 1Done: there are error(s). Exit code: 1解决办法,编写程序主函数MAIN。

五、没有选择目标芯片出现如下错误:CODE:C:\icc\bin\imakew -f main.makiccavr -c -IC:\icc\include\ -e -l -g -Wa-W D:\桌面\实验教程\LED应用\霓虹灯\main.ciccavr -o main -LC:\icc\lib\ -g -Wl-W -bfunc_lit:0.0x2000 -dram_end:0x25f -bdata:0x60.0x25f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk!E C:\icc\lib\crtA VR.o(41): Code address 0 already contains a value!E C:\icc\lib\crtA VR.o(41): Code address 0x1 already contains a valueC:\icc\bin\imakew.exe: Error code 1Done: there are error(s). Exit code: 1解决办法:project>>Options>>target>>device configuration 选择合适的芯片。

六、缺少分号CODE:C:\icc\bin\imakew -f main.makiccavr -c -IC:\icc\include\ -e -DA TMEGA -DA TMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.c!E D:\桌面\实验教程\LED应用\霓虹灯\main.c(52): unrecognized statement!E D:\桌面\实验教程\LED应用\霓虹灯\main.c(53): syntax error; found `}' expecting `;'!E D:\桌面\实验教程\LED应用\霓虹灯\main.c(53): syntax error; found `end of input' expecting `}'C:\icc\bin\imakew.exe: Error code 1C:\icc\bin\imakew.exe: 'main.o' removed.Done: there are error(s). Exit code: 1上面的报告说明了第52行缺少一个分号,预期分号的地方出现了“}”。

解决方法,在52行末尾添加分号。

类似的有:缺少}的报错CODE:C:\icc\bin\imakew -f main.makiccavr -c -IC:\icc\include\ -e -DA TMEGA -DA TMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.c!E D:\桌面\实验教程\LED应用\霓虹灯\main.c(55): illegal statement termination!E D:\桌面\实验教程\LED应用\霓虹灯\main.c(55): skipping `void'!W D:\桌面\实验教程\LED应用\霓虹灯\main.c(55):[warning] calling function without prototype may cause errors!E D:\桌面\实验教程\LED应用\霓虹灯\main.c(56): syntax error; found `{' expecting `;'!E D:\桌面\实验教程\LED应用\霓虹灯\main.c(57): syntax error; found `end of input' expecting `}'C:\icc\bin\imakew.exe: Error code 1C:\icc\bin\imakew.exe: 'main.o' removed.Done: there are error(s). Exit code: 1七:变量没有定义CODE:C:\icc\bin\imakew -f main.makiccavr -c -IC:\icc\include\ -e -DA TMEGA -DA TMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.c!E D:\桌面\实验教程\LED应用\霓虹灯\main.c(48): undeclared identifier `i'C:\icc\bin\imakew.exe: Error code 1C:\icc\bin\imakew.exe: 'main.o' removed.Done: there are error(s). Exit code: 1解决办法:在程序开始前添加变量定义,比如unsigned char i;注意,定义变量要在函数的最前面进行,及在进行计算操作之前定义所有变量。

八:其他错误!E touchpad.c(67): unrecognized statement!E touchpad.c(68): syntax error; found `void' expecting `;'上一行缺少“;”号所致。

!W touchpad.c(325):[warning] calling function without prototype may cause errors没有在头文件中添加调用的函数库!E E:\ICCAVR\icc\user001\main.c(100): undeclared identifier `temp'错误:变量'temp'未声明!E D:\iccavr6.31.A\icc\lib\crtAVR.(41):Codeaddress 0 already contains a value!E D:\iccavr6.31.A\icc\lib\crtAVR.(41):Codeaddress 0x1 already contains a value没有选择芯片型号。

!E library(31) area ' text' not large enough程序空间不够。

?!E _3Q0.AAA(0): area 'data' not large enough内存不足C:/icc/include/iom8v.h(18): D:\icc圆织机程序\8.c(288): Macro redefinition of TW BR重复定义TWBRcalling function without prototype may cause errors没有extern声明!E lianxi.o(103): multiple define: '_main'main函数重复了,应该只能有一个main.[warning] declaring a function without prototype may cause errors函数原型没有声明。

相关文档
最新文档