PIC编译错误信息
- 格式:doc
- 大小:142.00 KB
- 文档页数:8
开发工具ICD2使用方面需要注意的问题1.1 问:为什么我的系统编程或校验失败?答:按照第5 章,故障诊断中所述,检查PGC、PGD 和VPP 连接以及电压,诊断故障。
确保目标PICmicro 单片机已上电。
如果目标PICmicro 单片机有AVSS 和AVPP 引脚,确认这些引脚都已正确连接。
1.2 问:为什么我需要 ICD 转接头?答:对于MPLAB ICD 2 支持的低引脚数器件,如果在线调试引脚被保留,将不能有效地使用这些器件。
试想一下,对于8 个引脚的器件, 6 个I/O 引脚失去其中3 个的情形。
为此,生产了特殊的外合(bond-out) PICmicro 单片机,这种单片机能通过一个转接头来仿真这些低引脚数器件,这使得能在目标应用中使用所有引脚。
外合(bond-out) PICmicro 单片机具有在线通讯引脚与MPLAB ICD 2 接口。
这样做的优点是可以用MPLAB ICD 2 开发低引脚数器件。
缺点是,对于这些器件,为进行在线调试,不能只在目标应用中采用一个ICD 2 连接插座,还要使用外合(bond-out) PICmicro 单片机。
这些外合(bond-out) PICmicro 单片机类似于仿真器芯片,能支持多种器件。
在ICD 转接头电路板上有跳线来配置芯片,以与开发使用的器件相匹配。
这些低引脚数器件可通过通用编程适配器,或者在目标应用上放置一个ICD 2 连接插座来连接这些器件的VPP、PGC 和PGD,来采用MPLAB ICD 2 编程。
1.3 问:无法连接到MPLAB ICD 2 。
我现在该怎么做?答:MPLAB ICD 2 的电源灯亮了吗?这个LED 应该是明亮的。
如果它比较暗,可能只连接了USB,用户可能需要连接一个电源。
PC 的RS-232 口不能为MPLAB ICD 2 提供电源,不过USB 口可以。
注意有些USB 集线器不能提供电源。
请针对当前的故障线索,查看在线帮助。
1. 引言C语言在嵌入式领域应用非常广泛,其主要优点是灵活和高效,但若在使用过程中不加以规范,容易引入各种潜在的代码问题。
先来看一段C代码,这段代码中有多少C语言的使用错误?uint8_t vFunc(void){uint8_t index = 0;for (index = 0; index {if (index == 3){vFunc_1(&index);return true;}}}比较容易发现的问题有:●for循环结束后没有返回值不太容易发现的问题有:●index初值没有使用●index值可能在vFunc_2()内被清零,使得循环一直被执行为了在编码阶段找出这些问题,常用的分析方法有静态代码分析和动态代码分析。
有研究表明,使用动态代码分析找到的问题中的95%都可以用静态代码分析找到。
中小型嵌入式软件项目一般使用静态代码分析工具作为主要分析手段,其中最常见的工具是PClint。
PCLint是GIMPEL SOFTWARE 公司研发的C/C 软件代码静态分析工具,支持几乎所有流行的编辑环境和编译器。
PC-lint不但可以检测单个文件,也可以从整个项目的角度来检测问题。
支持Scott Meyes的名著(Effective C /More Effective C )中说描述的各种提高效率和防止错误的方法。
在我们的项目中,使用C语言作为PIC32单片机的编程语言,开发环境是MPLABX,代码查看工具是source insight。
本文的主要内容就是如何将PCLint 工具集成到上述两种工具中。
集成完成后,可通过快捷键调用lint工具,对目标代码进行静态分析,再根据分析结果优化代码。
2. 配置PCLint2.1. 安装PCLint下载PCLint并安装:升级到最新版本:,下载下列文件:●复制升级包和lpatch到安装路径(C:\lint)●按住shift 右键,打开快捷菜单,选择“在此处打开命令窗口”●输入命令并执行:lpatch l9-a-b.lp, …, 依次类推直到l9-K-L.lp(每次输入一条执行)●输入命令lint-nt -v,完成上述步骤后,显示当前版本是9.00L2.2. 下载xc32编译器共用的文件打开,下载Compiler Options files:●co-cci.lnt●co-xc32.lnt将上述文件存放在lint安装路径下的lnt文件夹中(c:\lint\lnt)。
PCI故障代码1、特殊代码“00”和“FF”及其它起始码有三种情况出现:①已由一系列其它代码之后再出现:“00”或“FF”,则主板OK。
②如果将CMOS中设置无错误,则不严重的故障不会影响BIOS自检的继续,而最终出现“00”或“FF”。
③一开机就出现“00”或“FF”或其它起始代码并且不变化则为板没有运行起来。
2、本表是按代码值从小到大排序,卡中出码顺序不定。
3、未定义的代码表中未列出。
4、对于不同BIOS(常用的AMI、Award、Phoenix)用同一代码所代表的意义有所不同,因此应弄清您所检测的电脑是属于哪一种类型的BIOS,您可查问你的电脑使用手册,或从主板上的BIOS芯片上直接查看,也可以在启动屏幕时直接看到。
5、有少数主板的PCI槽只有前一部分代码出现,但ISA槽则有完整自检代码输出。
且目前已发现有极个别原装机主板的ISA槽无代码输出,而PCI槽则有完整代码输出,故建议您在查看代码不成功时,将本双槽卡换到另一种插槽试一下。
另外,同一块主板的不同PCI槽,有的槽有完整代码送出,如DEL L810主板只有靠近CPU的一个PCI槽有完整的代码显示,一直变化到“00”或“FF”,而其它槽走到“38”则不继续变化。
6、复位信号所需时间ISA与PCI不一定同步,故有可能ISA开始出代码,但PCI的复位灯还不熄,故PCI代码停在起始码上。
代码 Award BIOS Ami BIOS Phoenix BIOS或Tandy 3000 BIOS00 . 已显示系统的配置;即将控制INI19引导装入。
.01 处理器测试1,处理器状态核实,如果测试失败,循环是无限的。
处理器寄存器的测试即将开始,不可屏蔽中断即将停用。
CPU寄存器测试正在进行或者失败。
02 确定诊断的类型(正常或者制造)。
如果键盘缓冲器含有数据就会失效。
停用不可屏蔽中断;通过延迟开始。
CMOS写入/读出正在进行或者失灵。
03 清除8042键盘控制器,发出TESTKBRD命令(AAH)通电延迟已完成。
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该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
PIC 器件具有几个包含配置位或熔丝的存储单元。
这些位指定基本的器件操作,例如振荡器模式、看门狗定时器、编程模式和代码保护。
未正确设置这些位可能导致代码失败或器件无法运行。
对于 PIC18 器件,这些位可以使用配置 pragma 伪指令进行设置。
(在未来版本中,也会对于其他 8 位器件引入 pragma 伪指令。
)该 pragma 伪指令具有以下形式。
#pragma config setting = state|value#pragma config register = value其中, setting 是配置设置描述符(如 WDT), state 是所需状态的文本描述(如OFF)。
value 字段是一个可以优先用于描述符的数值。
* PIC16F1x端口控制实验* 芯片型号:PIC16F1936* 主要特性:增强性中档8位CPU,8K Flash,512字节RAM,最高速度8MIPS,11通道10位 AD,2个比较器,96段LCD控制器,16通道电容触摸模块,3个增强性PWM/捕获模块*/#include/* 配置芯片的工作方式,相当于其他单片机的熔丝位 */// CONFIG1#pragma config FOSC = INTOSC // 使用内部时钟#pragma config WDTE = OFF // 禁止看门狗#pragma config PWRTE = OFF // PWRT disabled#pragma config MCLRE = ON // MCLR/VPP pin function is MCLR#pragma config CP = OFF // 禁止程序代码保护(debug时要关闭代码保护)#pragma config CPD = OFF // 禁止EEPROM的保护#pragma config BOREN = ON // 使能欠压复位#pragma config CLKOUTEN = OFF // 禁止CLKOUT功能#pragma config IESO = ON // Internal/External Switchover mode is enabled#pragma config FCMEN = ON // Fail-Safe Clock Monitor is enabled)// CONFIG2#pragma config WRT = OFF // 禁止代码自编程保护#pragma config VCAPEN = OFF // All VCAP pin functionality is disabled#pragma config PLLEN = OFF // 禁止4x PLL#pragma config STVREN = ON // Stack Overflow or Underflow will cause a // Reset)#pragma config BORV = LO // 欠压复位电压为低档位(低档位为1.9V,高档位为2.5V)#pragma config LVP = OFF // 高压编程模式/* 定义系统时钟,在延时函数中需要这个定义 */#define _XTAL_FREQ 16000000UL#define Close_LED() TB4 = 0 // RB4输出低电平#define Open_LED() TB4 = 1 // RB4输出高电平int main(void){/* 禁止4X PLL,内部16MHz时钟源 */OSCCON = 0B11111000;/* 清除PORTB数据锁存寄存器 */LATB = 0;/* 设置RB4端口为输出口,注意PIC有点特殊,1为输入0为输出 */TRISBbits.TRISB4 = 0;/* RB4输出低电平 */TB4 = 0;/* 设置RB5端口为输入 */TRISBbits.TRISB5 = 1;/* RB5设置为数字端口 */ANSELBbits.ANSB5 = 0;/* 使能RB5内部上拉,作为数字输入端口在设计时要注意并不是所有端口都有内部上拉的 */WPUBbits.WPUB5 = 1;/* 等待按键按下 */while(PORTBbits.RB5 == 1);while (1){__delay_ms(1000);Open_LED();__delay_ms(1000);Close_LED();}}器件配置位可以在Window>Pic Memory Views>Configuration Bits中查询或者直接生成代码。
PIC单片机C语言编程讲义奥科电子工作室(内部资料)2006年元月第一版第1章 PIC 单片机的C 语言编程1.1 PIC 单片机C 语言编程简介用C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C 语言编程在单片机系统设计中已得到越来越广泛的运用。
针对PIC 单片机的软件开发,同样可以用C 语言实现。
但在单片机上用C 语言写程序和在PC 机上写程序绝对不能简单等同。
现在的PC 机资源十分丰富,运算能力强大,因此程序员在写PC 机的应用程序时几乎不用关心编译后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。
写单片机的C 程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实用的C 语言程序。
这就是为什么前面所有章节中的的示范代码全部用基础的汇编指令实现的原因,希望籍此能使读者对PIC 单片机的指令体系和硬件资源有深入了解,在这基础之上再来讨论C 语言编程,就有水到渠成的感觉。
本讲稿围绕中档系列PIC 单片机来展开讨论,Microchip 公司自己没有针对中低档系列PIC单片机的C 语言编译器,但很多专业的第三方公司有众多支持PIC 单片机的C 语言编译器提供,常见的有Hitech、CCS、IAR、Bytecraft 等公司。
其中笔者最常用的是Hitech 公司的PICC 编译器,它稳定可靠,编译生成的代码效率高,在用PIC 单片机进行系统设计和开发的工程师群体中得到广泛认可。
其正式完全版软件需要购置,但在其网站上有限时的试用版供用户评估。
另外,Hitech 公司针对广大PIC 的业余爱好者和初学者还提供了完全免费的学习版PICC-Lite 编译器套件,它的使用方式和完全版相同,只是支持的PIC 单片机型号限制在PIC16F84、PIC16F877 和PIC16F628 等几款。
一、装入编译器:1、启动MPLAB-IDE,如下图所示选择Project-》Install Language2、在弹出的安装语言工具对话框里“Language Suite”选项现在显示的是Microchip,点击后面的箭头来选择语言。
我使用的工具是HI-TECH PICCME,所以选择为“HI-TECH PICC”。
3、接下来在“Tool Name”里选择编译器组件的调用路径,这里有“PICC Compiler”(C编译器)、“PICC Assemble Linker”(链接器)3项都需要设置。
用“Browse”来选择调用路径,把上述3项组件的调用文件都设为PICC.EXE。
点“OK”后完成设置。
二、选用编译器:1、新建一个项目,编辑项目对话框的“Language Tool Suite”栏目默认是“Microchip”,将它改为“HI-TECHPICC”。
2、在项目文件框里点“flasha[.hex]”,这时“Node Properties”(节点属性)按钮将会亮起来。
点击进入。
3、设置节点属性。
由于FLASHA.C还有其他相关连的源程序需要加进来,所以在“Language Tool”栏里应该选择“PICC Linker”(链接器)。
通常我们可以选择:1)Generate debug info:显示debug信息;2)Create map file:选择该项后我们将看到ROM、RAM的使用情况;3)Error file:显示错误信息;4)Compile for MPLAB ICD:如果不使用ICD,就不必选择这个项目了。
4、设置完成之后点“Add Node”来添加节点。
这个项目有两个节点:fla.c和flasha.c,选择节点后点击“Node Properties”或直接双击节点来进入节点属性设置。
5、节点文件的工具这时应该选择为“PICC Compiler”(C编译器),蓝色圈子里的4项依次是:1)显示debug 信息;2)局部优化;3)全局优化;4)ICD编译配件。
C++常见的编译错误中英对应翻译对于刚学编程,刚接触C++的新手来说,编译运行报错是最头疼的一件事,爆出一堆英文,英语差一点的又不知道什么意思,所以也不知道如何去改,在此,我给大家传一份常见错误中英文对照表及简单解释,希望可以帮到大家:fatal error C1003: error count exceeds number; stoppin g compila tion中文对照:(编译错误)错误太多,停止编译分析:修改之前的错误,再次编译fatal error C1004: unexpec ted end of file found中文对照:(编译错误)文件未结束分析:一个函数或者一个结构定义缺少“}”、或者在一个函数调用或表达式中括号没有配对出现、或者注释符“/*…*/”不完整等fatal error C1083: Cannotopen include file: 'xxx': No such file or directo ry中文对照:(编译错误)无法打开头文件x xx:没有这个文件或路径分析:头文件不存在、或者头文件拼写错误、或者文件为只读fatal error C1903: unableto recover from previou s error(s); stoppin g compila tion中文对照:(编译错误)无法从之前的错误中恢复,停止编译分析:引起错误的原因很多,建议先修改之前的错误error C2001: newline in constan t中文对照:(编译错误)常量中创建新行分析:字符串常量多行书写error C2006: #include expecte d a filenam e, found 'identif ier'中文对照:(编译错误)#include命令中需要文件名分析:一般是头文件未用一对双引号或尖括号括起来,例如“#include stdio.h”error C2007: #definesyntax中文对照:(编译错误)#define语法错误分析:例如“#define”后缺少宏名,例如“#define”error C2008: 'xxx' : unexpec ted in macro definit ion中文对照:(编译错误)宏定义时出现了意外的xxx分析:宏定义时宏名与替换串之间应有空格,例如“#defineTRUE"1"”error C2009: reuse of macro formal'identif ier'中文对照:(编译错误)带参宏的形式参数重复使用分析:宏定义如有参数不能重名,例如“#defines(a,a) (a*a)”中参数a重复error C2010: 'charact er' : unexpec ted in macro formalparamet er list中文对照:(编译错误)带参宏的形式参数表中出现未知字符分析:例如“#defines(r|) r*r”中参数多了一个字符‘|’error C2014: preproc essorcommand must start as first nonwhit e space中文对照:(编译错误)预处理命令前面只允许空格分析:每一条预处理命令都应独占一行,不应出现其他非空格字符error C2015: too many charact ers in constan t中文对照:(编译错误)常量中包含多个字符分析:字符型常量的单引号中只能有一个字符,或是以“\”开始的一个转义字符,例如“char error = 'error';”error C2017: illegal escapesequenc e中文对照:(编译错误)转义字符非法分析:一般是转义字符位于' ' 或" " 之外,例如“char error = ' '\n;”error C2018: unknown charact er '0xhh'中文对照:(编译错误)未知的字符0x hh分析:一般是输入了中文标点符号,例如“char error = 'E';”中“;”为中文标点符号error C2019: expecte d preproc essordirecti ve, found 'charact er'中文对照:(编译错误)期待预处理命令,但有无效字符分析:一般是预处理命令的#号后误输入其他无效字符,例如“#!defineTRUE 1”error C2021: expecte d exponen t value, not 'charact er'中文对照:(编译错误)期待指数值,不能是字符分析:一般是浮点数的指数表示形式有误,例如123.456Eerror C2039: 'identif ier1' : is not a memberof 'identif ier2'中文对照:(编译错误)标识符1不是标识符2的成员分析:程序错误地调用或引用结构体、共用体、类的成员error C2041: illegal digit 'x' for base 'n'中文对照:(编译错误)对于n进制来说数字x非法分析:一般是八进制或十六进制数表示错误,例如“int i = 081;”语句中数字‘8’不是八进制的基数error C2048: more than one default中文对照:(编译错误)default语句多于一个分析:switch语句中只能有一个defau l t,删去多余的de faulterror C2050: switchexpress ion not integra l中文对照:(编译错误)switch表达式不是整型的分析:switch表达式必须是整型(或字符型),例如“switch("a")”中表达式为字符串,这是非法的error C2051: case express ion not constan t中文对照:(编译错误)case表达式不是常量分析:case表达式应为常量表达式,例如“case "a"”中“"a"”为字符串,这是非法的error C2052: 'type' : illegal type for case express ion中文对照:(编译错误)case表达式类型非法分析:case表达式必须是一个整型常量(包括字符型)error C2057: expecte d constan t express ion中文对照:(编译错误)期待常量表达式分析:一般是定义数组时数组长度为变量,例如“int n=10; int a[n];”中n为变量,这是非法的error C2058: constan t express ion is not integra l中文对照:(编译错误)常量表达式不是整数分析:一般是定义数组时数组长度不是整型常量error C2059: syntaxerror : 'xxx'中文对照:(编译错误)‘xxx’语法错误分析:引起错误的原因很多,可能多加或少加了符号xxxerror C2064: term does not evaluat e to a functio n中文对照:(编译错误)无法识别函数语言分析:1、函数参数有误,表达式可能不正确,例如“sqrt(s(s-a)(s-b)(s-c));”中表达式不正确2、变量与函数重名或该标识符不是函数,例如“int i,j; j=i();”中i不是函数error C2065: 'xxx' : undecla red identif ier中文对照:(编译错误)未定义的标识符x xx分析:1、如果xxx为c o ut、cin、scanf、printf、sqrt等,则程序中包含头文件有误2、未定义变量、数组、函数原型等,注意拼写错误或区分大小写。
PIC 单片机烧写程序时提示Fuse error 0x2007 错误今天在PIC 单片机烧写程序时提示Fuse error 0x2007 该错误的原因主要是因为配置位的错误没有详细的去研究,大概做个判断一应该是编译器或者编程软件的错误,有两个位不能读出来,也可能是置代码保护的原因。
当把代码保护的配置位关闭后,该错误消失。
所以目前的解决方法是:在code 中关闭代码保护功能。
//********************************************知识补充***********************************************//在PIC 系列单片机里,其芯片内部大都有设置一个特殊的程序存储单元,地址为2007,由单片机的用户自由配置,用来定义一些单片机功能电路单元的性能选项。
我们把这个单元叫做器件配置字(Configuration Bits)。
这种设计给单片机开发工程师带来了很大的灵活性,但是也给初学者带来了一些麻烦。
在编译器里怎么样对配置位编程PIC 单片机正常运行时,是无法对配置位进行存取的,只能在编程模式下存取。
可以通过对配置位编程( 读为0) 或不编程( 读为1) 来选择不同的器件配置。
对配置位编程后,是否能够更改其设置取决于器件的存储工艺和封装形式。
对于只读存储器(ROM) 器件,这些配置位在ROM 代码提交时即被确定,且一旦器件掩膜完成,即无法更改( 若要更改,则需新的掩膜代码)。
对一次可编程(OTP) 器件,一旦这些位被编程( 为0),就无法更改了,而FLASH 的单片机在每次编程下载的时候是可以更改的。
编译器一般都可以采用菜单方式设置,在编译程序时将设置字一并完成,烧写芯片同时完成CONFIG 的烧入。
用PIC 官方编译工具MPLAB IDE7.30 设在编译器里对配置位编程。
点击菜单栏Configure 下的Configuration Bits 出现的对话框)。
VC++6.0常见编译错误中英文对照表fatal error C1003: error count exceeds number; stopping compilation中文对照:(编译错误)错误太多,停止编译分析:修改之前的错误,再次编译fatal error C1004: unexpected end of file found中文对照:(编译错误)文件未结束分析:一个函数或者一个结构定义缺少“}”、或者在一个函数调用或表达式中括号没有配对出现、或者注释符“/*…*/”不完整等fatal error C1083: Cannot open include file: 'xxx': No such file or directory 中文对照:(编译错误)无法打开头文件xxx:没有这个文件或路径分析:头文件不存在、或者头文件拼写错误、或者文件为只读fatal error C1903: unable to recover from previous error(s); stopping compilation 中文对照:(编译错误)无法从之前的错误中恢复,停止编译分析:引起错误的原因很多,建议先修改之前的错误error C2001: newline in constant中文对照:(编译错误)常量中创建新行分析:字符串常量多行书写error C2006: #include expected a filename, found 'identifier'中文对照:(编译错误)#include命令中需要文件名分析:一般是头文件未用一对双引号或尖括号括起来,例如“#include stdio.h”error C2007: #define syntax中文对照:(编译错误)#define语法错误分析:例如“#define”后缺少宏名,例如“#define”error C2008: 'xxx' : unexpected in macro definition中文对照:(编译错误)宏定义时出现了意外的xxx分析:宏定义时宏名与替换串之间应有空格,例如“#define TRUE"1"”error C2009: reuse of macro formal 'identifier'中文对照:(编译错误)带参宏的形式参数重复使用分析:宏定义如有参数不能重名,例如“#define s(a,a) (a*a)”中参数a重复error C2010: 'character' : unexpected in macro formal parameter list中文对照:(编译错误)带参宏的形式参数表中出现未知字符分析:例如“#define s(r|) r*r”中参数多了一个字符‘|’error C2014: preprocessor command must start as first nonwhite space中文对照:(编译错误)预处理命令前面只允许空格分析:每一条预处理命令都应独占一行,不应出现其他非空格字符error C2015: too many characters in constant中文对照:(编译错误)常量中包含多个字符分析:字符型常量的单引号中只能有一个字符,或是以“\”开始的一个转义字符,例如“char error = 'error';”error C2017: illegal escape sequence中文对照:(编译错误)转义字符非法分析:一般是转义字符位于 ' ' 或 " " 之外,例如“char error = ' '\n;”error C2018: unknown character '0xhh'中文对照:(编译错误)未知的字符0xhh分析:一般是输入了中文标点符号,例如“char error = 'E';”中“;”为中文标点符号error C2019: expected preprocessor directive, found 'character'中文对照:(编译错误)期待预处理命令,但有无效字符分析:一般是预处理命令的#号后误输入其他无效字符,例如“#!define TRUE 1”error C2021: expected exponent value, not 'character'中文对照:(编译错误)期待指数值,不能是字符分析:一般是浮点数的指数表示形式有误,例如123.456Eerror C2039: 'identifier1' : is not a member of 'identifier2'中文对照:(编译错误)标识符1不是标识符2的成员分析:程序错误地调用或引用结构体、共用体、类的成员error C2041: illegal digit 'x' for base 'n'中文对照:(编译错误)对于n进制来说数字x非法分析:一般是八进制或十六进制数表示错误,例如“int i = 081;”语句中数字‘8’不是八进制的基数error C2048: more than one default中文对照:(编译错误)default语句多于一个分析:switch语句中只能有一个default,删去多余的defaulterror C2050: switch expression not integral中文对照:(编译错误)switch表达式不是整型的分析:switch表达式必须是整型(或字符型),例如“switch ("a")”中表达式为字符串,这是非法的error C2051: case expression not constant中文对照:(编译错误)case表达式不是常量分析:case表达式应为常量表达式,例如“case "a"”中“"a"”为字符串,这是非法的error C2052: 'type' : illegal type for case expression中文对照:(编译错误)case表达式类型非法分析:case表达式必须是一个整型常量(包括字符型)error C2057: expected constant expression中文对照:(编译错误)期待常量表达式分析:一般是定义数组时数组长度为变量,例如“int n=10; int a[n];”中n为变量,这是非法的error C2058: constant expression is not integral中文对照:(编译错误)常量表达式不是整数分析:一般是定义数组时数组长度不是整型常量error C2059: syntax error : 'xxx'中文对照:(编译错误)‘xxx’语法错误分析:引起错误的原因很多,可能多加或少加了符号xxxerror C2064: term does not evaluate to a function中文对照:(编译错误)无法识别函数语言分析:1、函数参数有误,表达式可能不正确,例如“sqrt(s(s-a)(s-b)(s-c));”中表达式不正确2、变量与函数重名或该标识符不是函数,例如“int i,j; j=i();”中i不是函数error C2065: 'xxx' : undeclared identifier中文对照:(编译错误)未定义的标识符xxx分析:1、如果xxx为cout、cin、scanf、printf、sqrt等,则程序中包含头文件有误2、未定义变量、数组、函数原型等,注意拼写错误或区分大小写。
指令PIC的指令详解伪指令#include p16f877a.inclist p=16f877a,r=dec__config__idlocs(用户利用它存放程序版本或日期等) __idlocs 0x1234errorlevel 0,-302,-305 (编译信息输出显示等级及对对某些信息的单独设定)#define/#undefine #define KEY1 PORTB,7equ w_temp equ 0x20cblock+endc: cblock 0x20 w_temp buffer:8 var1 endcorg 0x00dt(定义表格数据代替retlw)table addwf pcl,fdt 0dt 1,2,'3';retlw 1 ;retlw 2;retlw 0x33('3')dt "abc" ;retlw 'a' ;retlw 'b';retlw 'c'de(源程序中定义片内eeprom的初值其实地址0x2100) org 0x2100de 0,1,2,3de "ABCD";定义8个字节fill(填充程序空间) fill 0x0000,5fill (goto $),next_bloclk-$ (从当前填充至标号next)死循环end宏指令banksel、pagesel、bankisel、clrc、setc、clrz、setz、clrdc、setdc、skpc、skpnc、skpdc、skpndc、bc、bnc、bz、bnz、bdc、bndcmacro自定义宏1.ADD LITERAL TO WADDLW K (W)+K->W加立即数至W ADDLW 0X15W=0X10->0X252.ADD W TO FADDWF F,D ((W)+(F)->W/F)ADDWF REG1,0 ADDWF FSR,13.ADD W AND CARRY D TO F ADDWFC F,DADDWFC FSR,1 (W+FSR+C->FSR)4.AND LITERAL AND WANDLW KANDLW 0x5F((W)并0x5F->W)5.AND W WITH FANDWF F,DANDWF FSR 1 (W并FSR->W/F)6.BIT CLEAR FBCF F,BBCF FLAG_REG,7 将FLAG_REG的D7清0 7.BIT SET FBSF F,BBSF PROTA,0 PROTA的D0置18.BIT TEST,SKIP IF CLEARBTFSC F,BBTFSC FLAG,1 FALSE TRUE位测试 0跳转9.BIT TEST,SKIP IF SETBTFSS F,BBTFSS FLAG,1 FALSE TRUE位测试 1跳转10.BIT TOGGLE FBTG F,BBTG PROTC,4 位取反 PORTC=0111 0101->0110 010111.SUBROUTINE CALLCALL 调用子程序12.CLEAR FCLRF FLAG_REG (F清零置Z=1)13.CLEAR W REGISTERCLRW (W清零置Z=1)14.CLEAR WATCHDOG TIMERCLRWDT(监视定时器清零00h->WDT 0->WDT预定标器1->TO' 1->PD')/doc/945763018.html,PLEMENT FCOMF REG1,0(寄存器内容取反->W/F)/doc/945763018.html,PARE F WITH W,SHIP IF F=WCPFSEQ REG/doc/945763018.html,PARE F WITH W,SHIP IF F>WCPFSGT REG/doc/945763018.html,PARE F WITH W,SHIP IF F<wCPFSLT REG19.DECIMAL ADJUST W REGISTERDAW REG1,0 (对F中内容进行10进制调整->F/W+F)REG1=0XA5 C=0 DC=0->0X05 C=1 DC=020.DECREMENT FDECF CNT,1(寄存器内容减1->W/F)21.DECREMENT F,SHIP IF 0DECFSZ CNT,1GOTO ...CONTINUE ...(减1后为0跳转至CONTINUE)22.DECREMENT F,SHIO IF NOT 0DECFSNZ CNT,0GOTO ...CONTINUE ...(减1后不为0跳转至CONTINUE)23.UNCONDITIONAL BRANCHGOTO 地址24.INCREMENT FINCF CNT,1(指令加1)CNT=0XFF Z=0 ->CNT=0X00 Z=1 C=125.INCREMENT F,SHIP IF 0INCFSZ F,D26.INCREMENT F,SHIP IF NOT 0INCFSNZ F,D27.INCLUSIVE OR LITERAL WITH WIORLW 0X35((W)或0X35->W)28.INCLUSIVE OR W WITH FIORWF RESULT,1 ((W)或RESULT->RESULT)29.LONG CALL 长调用指令和CALL有区别MOVLW HIGH 高位地址MOVPF WREG,PCLATH 存放在PCLATH中LCALL LOW 调用子程序(指令只含低8位地址)30.MOVE FMOVF REG,0 ((REG)->W)</w31.MOVE F TO PMOVFP F,P (F:00H-FFH P:00H-1FH)MOVFP REG1,REG2把数据存储单元传至某外围接口寄存器内容32.MOVE LITERAL TO LOW NIBBLE IN BSRMOVLB 0XA5 BSR=0X22->0X25(传立即数至BSR寄存器低4位高4位为0)33.MOVE LITERAL TO HIGH NIBBLE IN BSRMOVLR 5 BSR=0X22->0X52 (传至高4位低4位为0)34.MOVE LITERAL TO WMOVLW 0X5A W=0X5A (立即数传至W)35.MOVE P TO FMOVPF REG1,REG2 (F:00H-FFH P:00H-1FH)把某外围接口寄存器内容传至数据存储单元36.MOVE W TO FMOVWF REG ((W)->REG)37.NEGATE WNEGW REG 0 (REG取反->F/F+W)取反的规则P25138.NO OPERATIONNOP无操作占用一个指令周期 PC+139.LOAD OPTION REGISTER(W)->OPTION 只为可移植至PIC16C6X 不建议使用40.RETURN FROM INTERRUPTRETFIETOS->PC 1->GIE (中断允许位GIE开放中断)指令周期241.RETURN LITERAL TO WRETLW KK->W TOS->PC(立即数传至W 并返回地址至PC)指令周期2CALL TABLETABLE ADDWF PCRETLW K1RETLW K2...RETLW KN->W=0X07->W=K742.RETURN FROM SUBROUTINERETURN (TOS->PC 指令周期2)43.ROTATE LEFT F THROUGH CARRYRLF F,D/RLCF F,DF(N)->D(N+1) F(7)->C C->D(0)RLF REG1,0REG1=1110 0110->1110 0110 C=0->1 W=1100 110044.ROTATE LEFT F NO CARRYRLNCF F,D无进位循环左移45.ROTATE RIGHT F THROUGH CARRYRRF F,D/RRCF F,DRRF REG1,0REG1=1110 0110->1110 0110 C=1->0 W=0111 001146.ROTATE RIGHT F NO CARRYRRNCF F,D无进位循环右移47.SET FSETF F,SSETF REG,0WREG=0X05->0XFF REG=0XDA->0XFF48.SLEEPOOH->WDT 0->WDT预分频器 1->TO'(定时时间) 0->PD'掉电状态49.SUBTRACT W FROM LITERALSUBLW KK-(W)->WMOVLW 01HSUBLW 02H W=01H C=1结果为正MOVLW 02HSUBLW 02H W=0 C=1结果为0MOVLW 02HSUBLW 01H W=FF C=0结果为负50.SUBTRACT W FROM FSUBWF F,DMOVLW 3MOVWF REG1MOVLW 2SUBWF REG1,0 W=1 C=1MOVLW 2MOVWF REG1MOVLW 2SUBWF REG1,0 W=0 C=1MOVLW 2MOVWF REG1MOVLW 3SUBWF REG1,0 W=FF C=051.SUBTRACT W FROM F WITH BORROW SUBWFB F,D(F)-(W)-C->F/W带借位F-W减法MOVLW 4MOVWF REG1MOVWF REG1MOVLW 2SUBWFB REG1,0 设C初始为1 则W=1 C=152.SWAP FSWAPF F,DSWAPF REG1,1REG1=0XA5->0XA5 W=0X5A REG1=0X5A53.TABLE READTABLRD T,I,FTABLRD 1,1,REGREG=OX53->0XAA TBLATH=0XAA->0X12 TBLATL=0X55->0X34 TBLPTR=0XA356->0XA3567 存储单元=0X1234->0X5678传高字节TBLAT中一个字节传至F T=0传高字节T=1传低字节;TBLPTR 指向的程序存储单元内容传至表锁存器TBLAT;I=1 TBLPTR+1 I=0 TBLPTR不变存储单元的值为何改变周期2 若F=PC则3周期54.TABLE WRITETABWT T,I,FTABWT 0,1,REGREG=0X53->0X53 TBLATH=0XAA->0X53 TBLATL=0X55->0X55TBLPTR=0XA356->0XA357存储单元=0XFFFF->0X5355F值传至16为TBLAT表锁存器 T=0传低字节 T=1传至高字节;TBLAT内容写入TBLPTR指向的程序存储器单元;I=1 TBLPTR+1 I=0 TBLPTR不变指令周期2若F=PC 这周期355.TABLE LATCH READTLRD T,F 表锁存读TBLATH=0X00 TBLATL=0XAF T=0 RAM=0XAF TBLATH=0X00 TBLATL=0XAF56.TABLE LATCH WRITETLWT T,F 表锁存写RAM=0XB7 TBLATH=0X00 TBLATL=0X00 T=0 RAM=0XB7 TBLATH=0X00 TBLATL=0XB757.LOAD TRIS REGISTER I/O 控制寄存器TRIS设置指令不建议使用58.TEST F,SKIP IF 0TSTFSZ CNT F等于0跳转GOTO ...(CNT!=0)ZERO (CNT==0)59.EXCLUSIVE OR LITERAL WITH WXORLW K (W)异或K->WXORLW 0XAFW=0XB5->0X1A60.EXCLUSIVE OR W WITH FXORWF F D (W)异或(F)->(W)(F)XORWF REG1,1W=0XB5->0XB5 REG1=0XAF->0X1A直观助记符:BCF 3,0(进位位C清零)=CLRCBSF 3,0(进位位C置1)=SETCCLRDC BCF 3,1SETDC BSF 3,1CLRZ BCF 3,2SETZ BSF 3,2SKPC(有进位间跳)=BTFSS 3,0SKPNC(无进位间跳)=BTFSC 3,0SKPDC BTFSS 3,1SKPNDC BTFSC 3,1SKPZ BTFSS 3,2SKPNZ BTFSC 3,2 影响ZTSTF F(测试寄存器是否全零)=MOVF F,1 影响ZMOVFW F((F)->W) MOVF F,0 影响ZNEGF F,D取补码 COMF F,1 影响ZADDCF F,D内容加进位 BTFSC 3,0 影响Z 为0跳转INCF F,DSUBCF F,D内容减进位 BTFSC 3,0DECF F,DADDDCF F,D BTFSC 3,1INCF F,DSUBDCF F,D BTFSC 3,1DECF F,DB K 无条件转移 GOTO KBC K 有进位转移 BTFSC 3,0GOTO KBNC K 无进位转移 BTFSS 3,0GOTO KBDC K BTFSC 3,1GOTO KBNDC K BTFSS 3,1GOTO KBZ K BTFSC 3,2GOTO KBNZ K BTFSS 3,2GOTO K清零CLRW CLRF CLRWDT算术运算ADDLW K ADDWF F,D SUBLW K SUBWF F,D DECFF,D INCF F,D逻辑运算ANDLW K ANDWF F,D IORLW K或IORWF F,D XORLW K异或 XORWF F,D RLF F,D RRF F,DMOVLW K MOVF F,D MOVWF F NOP半字节交换指令SWAPF F,D可用于中断现场保护:MOVF W-TEMP SWAPF STATUS,W MOVWF S-TEMP-->SWAPF S-TEMP,W SWAPF STATUS,W SWAPF W-TEMP,W(W置于后一操作数?)子程序调用CALL GOTO跳转(CALL都是无返回值的?CALL的子程序都是无参数?)取反COMF F,DDECFSZ F,D INCFSZ F,D位操作BSF F,B BCF F,B BTFSS F,B BTFSC F,B返回RETLW K RETURN SLEEP RETFIE(RETURN FROM INTERRUPT WITH ENABLE)懒得算延时:3XY+4X+5(x外循环Y内循环)255-->19610020mhz 0.05us T=0.2us1、程序的基本格式先介绍二条伪指令:EQU ——标号赋值伪指令ORG ——地址定义伪指令PIC16C5X在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:PIC16C54/55:1FFHPIC16C56:3FFHPIC16C57/58:7FFH一般来说,PIC的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。
C C 编译错误代码解释C/C++编译错误代码解释表达式(1-9)1.程序在编译时出现如下错误提示信息:(11)error C2106'='left operand must be l-value,…如何根据错误提示信息判断和解决程序中的错误?下面是该问题的源程序:2.使用指针类型后,程序中出现了许多错误,不知如何修改?源程序如下:3.老师,按照你的建议重新修改程序后,编译连接通过,可是运行的结果还是不对?修改后的程序如下:4.求π的近似值程序,编译时出现如下错误:5.我的程序能够完成十进制到二进制和八进制之间的转换,就是不能正确转为十六进制数,即在转换的十六进制结果中看不到十六进制数中的A-F符号,这是为什么?程序如下:6.编译错误:error C2018:unknown character'0xa3'是什么意思?7.一个很简单的程序,一看就能猜出结果。
可是编译时有警告,执行结果更是看不懂,是系统出现了问题吗?程序如下:8.在调试程序时中所有的警告信息不影响目标文件的形成,这样是否可以忽略这些信息?下面的提示信息":0 error(s),1 warning(s)localvariable'm'used without having been initialize",我们应注意什么?9.表达式y=*px++与y=*(px++)意义相同吗?--1.程序在编译时出现如下错误提示信息:(11)error C2106'='left operand must be l-value,…如何根据错误提示信息判断和解决程序中的错误?下面是该问题的源程序:#include iostream.h int main(){int f(int n);int sum,n,m;cout"please input"endl;cin m;sum=f(0)+f(1);for(n=2;n=m;n++){f(n)=f(n-1)+f(n-2);sum=sum+f(n);}cout"sum="sum endl;cout"f(n)="f(n)endl;return 0;}答:从错误信息提示中可以看出,你程序第11行"f(n)=f(n-1)+f(n-2);"语句有错,即系统指出了赋值号左边有逻辑错误。
C语言编译错误信息Turbo C 编译程序检查源程序中三类出错信息:致命错误、一般错误和警告。
致命错误出现很少,它通常是内部编译出错。
在发生致命错误时,编译立即停止,必须采取一些适当的措施并重新编译。
一般错误指程序的语法错误、磁盘或内存存取错误或命令错误等。
编译系统遇到这类错误时,一般也要停止编译。
警告并不阻止编译进行。
它指出一些值得怀疑的情况,而这些情况本身又有可能合理地成为源程序的一部分。
因此,警告信息只是提醒用户注意,编译过程并不停止。
编译系统在发现源程序中的各类错误时,首先显示错误信息,然后显示源文件名和出错的行号。
但必须注意,真正的错误位置不一定准在显示出错的行上,也可能是在前一行或前几行;有时,好象发生了很多错误,而实际上可能是由一个错误造成的。
下面按字母顺序分别列出这三类错误信息。
对每一条信息,提供可能产生的原因和修正的方法。
致命错误1.Bad call of in-lint function内部函数非法调用在使用一个宏定义的内部函数时,没有正确调用。
一个内部函数以双下划线(--)开始和结束。
2.Irreducible expression tree 不可约表达式树这种错误是由于源文件中的某些表达式使得代码生成程序无法为它产生代码。
这种表达式必须避免使用。
3. Registcr allocation failure 存储器分配失效这种错误指的是源文件行中的表达式太复杂,代码生成程序无法为它生成代码。
此时应简化这种复杂的表达式或干脆避免使用它。
一般错误1. #Operator not followed by macro argument name#运算符后无宏变量名。
在宏定义中,#用于标识一宏变量名。
“#”后必须跟一宏变量名。
2. ‘xxxxxxxx’nor an argument‘xxxxxxxx’不是函数参数。
在源程序中将该标识符定义为一个函数参数,但此标识符没有在函数表中出现。