凌阳科技大学计划论坛

首页 » 16位u'nSP平台技术讨论区 » 新手上路 » 常见错误及分析,精彩不容错过
脚踏实地 - 2006-4-24 13:54:00
<;P>笔者根据学习使用061的经验,总结了和061编程有关的常见错误</P>
<;P>在此贴出,希望大家共同进步::))</P>

论坛改版之后所有的附件数据无法移植到新论坛,所以下面的帖子里的图片都看不到,敬请见谅。

可以去下面的地址查看本帖的完整版:

http://www.unsp.com/dvbbs/dispbbs.asp?BoardID=24&ID=17324
脚踏实地 - 2006-4-24 13:56:00
1,  新建一个文件,而没有新建一个工程,导致程序无法编译、链接、下载。




[upload=jpg]UploadFile/2006-4/2006424135513796.jpg[/upload]



病毒指数:7


愚蠢指数:10


经验指数:0



解决办法:


新建工程,然后将这个写好的文件加入到工程中去。



本错误还有一个更高级的变种:在保存工程时,由于移动了工程文件夹,或者改变了文件属性,导致body信息丢失,导致编译、连接、下载按钮失效。



解决办法:重新选择body既可




脚踏实地 - 2006-4-24 14:00:00
1,  在使用IDE版本没有注意IDE的不同版本带来的不兼容现象,导致程序出错。例如使用IDE1.8.4重新编译由IDE1.16.1及其以上版本(IDE2.0.0)创建的程序,或者有IDE1.16.1及其以上版本重新编译由IDE1.8.4及其一下版本(IDE1.8.0)创建的程序。




[upload=jpg]UploadFile/2006-4/2006424135826953.jpg[/upload]




[upload=jpg]UploadFile/2006-4/2006424135836571.jpg[/upload]




[upload=jpg]UploadFile/2006-4/2006424135846430.jpg[/upload]



病毒指数:7


愚蠢指数:2


经验指数:3



解决方法:



在工程设置中进行正确设置:



[upload=jpg]UploadFile/2006-4/200642413594568.jpg[/upload]
sean_zhang - 2006-4-24 14:01:00

[em01][em01][em01]版主真是太牛了!!!!这也能想到!!哈哈

好!!!

脚踏实地 - 2006-4-24 14:01:00

[upload=bmp]UploadFile/2006-4/200642414045713.bmp[/upload]



[upload=jpg]UploadFile/2006-4/20064241410956.jpg[/upload]
脚踏实地 - 2006-4-24 14:03:00
1,  工程文件夹存放在具有中文等全角字符的路径下,导致在下载过程中出现无法定位程序入口的现象。



[upload=jpg]UploadFile/2006-4/200642414245811.jpg[/upload]
[upload=jpg]UploadFile/2006-4/200642414257512.jpg[/upload]

病毒指数:7


愚蠢指数:4


经验指数:3



解决办法:无论选择是  还是 否,程序都会正确执行,但是无法单步调试。只要将工程中的中文路径去掉既可。


脚踏实地 - 2006-4-24 14:05:00
1,  工程中没有程序入口_main




[upload=jpg]UploadFile/2006-4/200642414445656.jpg[/upload]


病毒指数:7


愚蠢指数:5


经验指数:3



解决方法:每个工程必须有且只要一个程序入口,在汇编中为_main,在c语言中为main()


值得注意的是,这里的程序入口严格区分大小写!!


脚踏实地 - 2006-4-24 14:06:00

本错误还有二个病毒变种:

1,  在一个工程中打开了其他的文件包含程序入口,但是这个文件没有隶属于本工程,导致提示没有程序入口的错误。

2,  在一个工程中同时使用了汇编语言与c语言,而且都具有程序入口,导致程序入口的重复定义

脚踏实地 - 2006-4-24 14:07:00
1,  Download fail



[upload=jpg]UploadFile/2006-4/200642414635272.jpg[/upload]
[upload=jpg]UploadFile/2006-4/200642414645637.jpg[/upload]


造成出现这种错误的原因有很多



1,  程序本身又错误,但是编译器没有识别,在中途停止了编译连接工作,但前面并没有出现错误,这样给出0 error 0 warning ,但是没有生成目标下载文件,导致无法下载


2,  目标板与probe(ez-probe)连接出现问题,没有连好。包括条线设置问题等等


3,  目标板供电不足,尤其是以电池盒供电的比较严重,这个问题比较难以发现,需要较多的经验


4,  Probe坏掉,这种情况的概率较小,但是笔者遇到过一回


5,  计算机主板paralell port设置有问题,最好设置为ECP模式,值得是printer probe


6,  在xp系统下,USB probe需要安装驱动,如果驱动没有装好,也有可能出现问题


7,  IDE没有装好,这种情况比较少见




脚踏实地 - 2006-4-24 14:11:00
程序运行后,没有现象。


[upload=jpg]UploadFile/2006-4/200642414951582.jpg[/upload]
[upload=jpg]UploadFile/2006-4/200642414100689.jpg[/upload]


病毒指数:8


愚蠢指数:9


经验指数:1



本来需要硬件上看的现象,现在却选择了软件仿真,当然看不到现象


解决办法:再下载前选择硬件ICE模式


[upload=jpg]UploadFile/2006-4/2006424141032126.jpg[/upload]
脚踏实地 - 2006-4-24 14:12:00
7,汇编语言的语法错误



[upload=jpg]UploadFile/2006-4/200642414115764.jpg[/upload]



[upload=rar]viewFile.asp?ID=3130[/upload]



病毒指数:9


愚蠢指数:5


经验指数:4



在编写程序的时候,不可避免的会出现语法错误,但是由于这些错误IDE可以很好的给出提示,改正起来并不困难。



针对上面的程序错误如下:


1,  行号1,伪指令的格式是需要在前面加上一个“点”的


2,  行号2,程序的函数入口声明被屏蔽掉了,函数必须声明为.PUBLIC


3,  行号4,程序代码需要切换到.CODE段,但是,在刚刚切换后,又被切换到.RAM段,导致程序出错(逻辑错,语法上没有错误)


4,  行号8与行号13,局部标号大小写错误


5,  行号9,不支持的寻址方式


6,  行号12与行号14,局部标号与全局标号汇合使用,不合理,出现语法错误


7,  行号19与行号1定义的不一致,这是区分大小写的


8,  行号20,特殊操作符需要特殊寄存器,*操作需要r3,r4,mr作为目的寄存器


9,  行号21,在使用立即数移位时要在0~4之间,属于特殊操作需要特殊对待,可以使用寄存器作为移位位数,没有此限制


10,              行号25,段使用错误,在该段定义,无法为变量初始化,需要定义在.IRAM段




脚踏实地 - 2006-4-24 14:14:00
1,  程序中出现了全角字符(汉字),尤其是全角的空格,不注意还以为是table(制表符)



[upload=jpg]UploadFile/2006-4/2006424141336174.jpg[/upload]


病毒指数:9


愚蠢指数:4


经验指数:8



解决方法:从第一个错误找起,注意观察,全角字符比半角字符占的宽度大




脚踏实地 - 2006-4-24 14:15:00

斑竹也不例外

每天只能上传20个附件

今天就到这里

明天接着贴

:)

脚踏实地 - 2006-4-24 19:46:00

接着来

谢谢coolqianz

我又可以上传附件了

脚踏实地 - 2006-4-24 19:47:00

[upload=rar]viewFile.asp?ID=3135[/upload]



这个是上面错误的工程文件

脚踏实地 - 2006-4-24 19:49:00

宏等出现错误,编译器提示出现不认识字符


[upload=jpg]UploadFile/2006-4/200642419475822.jpg[/upload]

病毒指数:9


愚蠢指数:2


经验指数:7



如果编译器提示出现这样的错误,那么多半是由于程序开始的几行定义有问题


解决方法:到程序的开头去找



错误的工程文件参考:


[upload=rar]viewFile.asp?ID=3137[/upload]
脚踏实地 - 2006-4-24 19:50:00
1,  关于c语言出现的错误,无论是逻辑错误,还是语法错误,大家可以参考谭浩强的c语言程序设计一章,讲的比较好。


脚踏实地 - 2006-4-24 19:51:00

在需要清看门狗的地方没有清看门狗,导致程序复位



[upload=jpg]UploadFile/2006-4/2006424195036384.jpg[/upload]
错误代码工程参考


[upload=rar]viewFile.asp?ID=3139[/upload]
脚踏实地 - 2006-4-24 19:52:00
病毒指数:10

愚蠢指数:8

经验指数9

解决办法:

在需要清看门狗的地方清狗
lxp928 - 2006-4-24 19:53:00

请问我在61上作led的闪烁实验,在延时时间用软件延时一切正常,但改用定时器A作延时为什么整个程序执行后LED无任何反应,请问是怎么回事?其源程序如下:


.DEFINE P_IOA_Data    0x7000;       
.DEFINE P_IOA_Buffer        0x7001;       


.DEFINE P_IOA_Dir          0x7002;       


.DEFINE P_IOA_Attrib        0x7003;       


.DEFINE P_IOA_Latch        0x7004;       


.DEFINE P_IOB_Data          0x7005;     


.DEFINE P_IOB_Buffer        0x7006;       



.DEFINE P_IOB_Dir          0x7007;       


.DEFINE P_IOB_Attrib        0x7008;
.DEFINE P_TimerA_Data      0x700A;       
.DEFINE P_TimerA_Ctrl      0x700B;         
.DEFINE P_Watchdog_Clear    0x7012; 
  .ram
  .var R_LedControl       


  .code
  .public _main


_main:
  r1 = 0x00FF      //设置A0~A7口为同相低电平输出
  [P_IOA_Dir] = r1       
  [P_IOA_Attrib] = r1
  r1 = 0x0000     
  [P_IOA_Data] = r1
  r1=0x0040
  [P_IOB_Dir]=r1
  [P_IOB_Attrib]=r1
  [P_IOB_Data]=r1    //B6输出高电平,保证LED阴极接地
  r1=0x0001 
  [R_LedControl] = r1    //LED点亮控制初值
  L_MainLoop:
  r1 = [R_LedControl] 
  [P_IOA_Data] = r1    //送数据到A口
        call F_Delay
        r1 = [R_LedControl]    //延时
  r1=r1 LSL 1      //修改LED点亮控制参数
  cmp r1,0x0100    //只有8个LED,保证输出数据在8位以内
  jne NoOver
  r1 = 0x0001
NoOver:
  [R_LedControl] = r1 
  jmp L_MainLoop    //跳转到L_MainLoop循环,点亮LED



//=============================================================
// 函数名称:  F_Delay
// 功能描述:  实现延时
//=============================================================
F_Delay:

  r1=0x0001                   


  [P_Watchdog_Clear] = r1
  r1 = 0x0005


[P_TimerA_Ctrl]=r1


r1=0xfbff


[P_TimerA_Data]=r1
      retf 


脚踏实地 - 2006-4-24 19:54:00

程序在执行完主要程序后,退出了程序控制


[upload=jpg]UploadFile/2006-4/20064241953179.jpg[/upload]

病毒指数:10


愚蠢指数:6


经验指数:1





程序在执行完主要的运算后,程序失去了控制,导致复位



我们通常设计单片机程序与PC机不同,因为大部分都是没有操作系统的,所以只要单片机上电工作,那么都需要在我们的控制之中。而带操作系统的,比如PC机程序设计,我们程序执行后,可以交操作系统管理。



所以,如果程序是在没有任务可作,就死循环清看门狗即可。



错误的工程代码参考:


[upload=rar]viewFile.asp?ID=3141[/upload]
脚踏实地 - 2006-4-24 19:55:00
[upload=jpg]UploadFile/2006-4/2006424195437825.jpg[/upload]

病毒指数:10


愚蠢指数:5


经验指数:7



十六进制与十进制数弄错了,看似简单的错误,在不经意简中下祸患,在几千行的程序代码中,改正错误,无异于大海捞针,切忌!!切忌!!



错误的工程代码参考:


[upload=rar]viewFile.asp?ID=3144[/upload]
脚踏实地 - 2006-4-24 19:57:00

没有使用系统保留的中断函数入口


[upload=jpg]UploadFile/2006-4/2006424195634497.jpg[/upload]

明明开的是2Hz中断,中断服务函数却写在IRQ中,导致IRQ5没有服务函数,导致程序复位



病毒指数:10


愚蠢指数:3


经验指数:9



错误的工程代码:


[upload=rar]viewFile.asp?ID=3147[/upload]
脚踏实地 - 2006-4-24 19:59:00

没有中断服务函数,导致程序复位


[upload=jpg]UploadFile/2006-4/2006424195758303.jpg[/upload]


病毒升级:


在无意之间多开了一个中断,但是没有写这部分服务代码,导致程序出错


错误的工程代码:


[upload=rar]viewFile.asp?ID=3149[/upload]
脚踏实地 - 2006-4-24 20:00:00

在中断程序返回时,忘记了reti指令,导致程序异常(有时复位,有时即不复位也不知道跑哪去了)


[upload=jpg]UploadFile/2006-4/2006424195942661.jpg[/upload]



解决方法:在退出中断服务函数的时候不要忘记reti


其实正常在写程序的时候,一般是不会忘记的,但是有的时候中断服务函数具有多个出口,就是要进行判断,从而决定哪些程序代码执行,哪些程序代码不执行,导致忘记reti的书写


错误的工程代码:


[upload=rar]viewFile.asp?ID=3151[/upload]
脚踏实地 - 2006-4-24 20:02:00

没有清楚中断请求标志位,导致重复进入中断。或者清除错误


[upload=jpg]UploadFile/2006-4/20064242014795.jpg[/upload]


没有清除中断复位标志位,或者清除错误,比如,本来应该写P_INT_Clear单元,但是确错误的写P_INT_Clear单元,造成异常现象,包括复位



病毒指数:10


愚蠢指数:3


经验指数:7


错误的工程代码:


[upload=rar]viewFile.asp?ID=3153[/upload]
脚踏实地 - 2006-4-24 20:05:00

:没有对堆栈进行保护或者说保护不好


[upload=jpg]UploadFile/2006-4/200642420259409.jpg[/upload]


病毒指数:10


愚蠢指数:1


经验指数:7



表面上看好像看门狗也清除了,但是其中暗藏玄机。如果刚好在执行完r1 = 1这条指令后产生中断,而中断确改变了r1的值,这样看门狗就没有及时清除,导致异常(复位)



解决方法:对破坏的寄存器进行保护



病毒升级:


[upload=jpg]UploadFile/2006-4/200642420328628.jpg[/upload]



表面上看对破坏的寄存器r1进行了保护,其实没有注意到这个调用的库函数对寄存器(r1,r4)进行了破坏,这个错误比较难于发现



主要有2点:库函数写的不好,在开发作为库函数使用的函数,尽量不要破坏寄存器;


使用者没有注意,在参考别人的程序的时候,没有充分明白压站(push r1,r5 to [sp])的意义



错误的工程代码:


[upload=rar]viewFile.asp?ID=3156[/upload]
[upload=rar]viewFile.asp?ID=3157[/upload]
脚踏实地 - 2006-4-24 20:07:00

压栈与弹栈出现错位,导致堆栈崩溃


[upload=jpg]UploadFile/2006-4/200642420610698.jpg[/upload]
[upload=jpg]UploadFile/2006-4/200642420622424.jpg[/upload]



光压不弹,只弹不压,都得不到正确的结果!!


错误的工程代码:


[upload=rar]viewFile.asp?ID=3161[/upload]
脚踏实地 - 2006-4-24 20:08:00

进不去中断



[upload=jpg]UploadFile/2006-4/200642420733341.jpg[/upload]
由于当前单片机,为了满足嵌入式操作系统的设计,对中断加入了指令控制,所以需要使用IRQ ON等指令打开中断,这样才可以进入中断


[upload=rar]viewFile.asp?ID=3163[/upload]
脚踏实地 - 2006-4-24 20:10:00

指计算结果超过了变量的存储范围


[upload=jpg]UploadFile/2006-4/200642420922729.jpg[/upload]
运算结果超出了变量的存储范围,导致a溢出,得不到正确的结果

 1  2  3  4 
查看完整版本: 常见错误及分析,精彩不容错过