KeilC中的一些ERROR和
Keil C 中的一些ERROR和WARNING
www./doc/2c12606762.html,B100.C(12): error C216: subscript on non-array or too many dimensions 原程序如下:
#include
#include
void delay(int);
unsigned char code dis_code[8]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a}; main()
{int i,j;
P2=0xff;
while(1)
{P2=0x7f;
for(i=0;i<8;i++)
{P0=dis_code[i];
P2=_crol_[j,1];
j=P2;
delay(1);
}
}
}
void delay(int x)
{int i;
for(i=0;i<x;i++);< p="">
}
问题在于P2=_crol_[j,1];
应该改为P2=_crol_(j,1);
2.从网上COPY的程序执行类似的功能,有时候如果现象没出现,或者不明显,可以调整下延迟函数。
3.数码管的扫描显示0—7,延迟函数的延迟时间在1ms左右,是通过人眼的视觉暂留而产生的现象,
如果延迟函数设臵的太大,则看不到持续显示0—7的现象。
4.用KEILC51调试程序时,出现错误提示为?unprintable character 0XA1 skipped?用KEILC51调试程序时,出现错误提示为?unprintable character 0XA1 skipped?的问题。
输入法的问题。在程序行输入中文模式下标点符号,不会显示,但是会出现标题这样的问题。
打上//马上就能看到没有显示的标点符号
5.*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_COMPARE?TESTLCD
说明:程序中有些函数(或片段)以前(调试过程中)从未被调用过,或者根本没有调用它的语句。
这条警告信息前应该还有一条信息指示出是哪个函数导致了这一问题。只要做点简单的调整就可以。
不理它也没什么大不了的。解决方法:去掉COMPARE()函数或利用条件编译#if …..#endif,可保留该函数并不编译。
www./doc/2c12606762.html,B99.C(19): error C141: syntax error near '{', expecte
d 'const'
程序如下:
#include
#include
sbit LEDP=P1^0;
unsigned char counter;
main()
{TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
counter=0x0A;
EA=1;
ET0=1;
TR0=1;
while(1)
{};
}
void timer0_int(void) interrupt {TH0=0x3C;
TL0=0xB0;
counter--;
if((counter)!=0)
{ counter=0x0A;
LEDP=~LEDP;
}
}
问题在中断函数的写法上,C下面51的中断函数要这么写:
void timer0_int(void) interrupt N using M
其中的N是不同中断对应的中断号,一般单片机的书上都有说明的,M是这个中断函数在存储空间中所占的bank,一般不要和main函数的一样就可以了,而main函数的在bank0,那么针对51单片机,这个M可以为1,2,3
函数prototype7.C51编译警告?*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL?
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: ?C_START
MODULE: .STARTUP.obj (?C_STARTUP)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: ?C_START
MODULE: .STARTUP.obj (?C_STARTUP)
ADDRESS: 000DH
如果你在用C51编译器出现上面的警告,并且遍了网上也没能出个究竟时,你是否觉得这个问题很难,难得以至于没人能回答呢?
其实这个只是初学者和粗心者才会犯的错误:没把C文件添加到项目中!///另外,还有可能是因为存在没有被调用的已经定义的函数。
本文来自CSDN博客,转载请标明出处:www./doc/2c12606762.html,/liufei_learning/archive/2010/07/15/5737531.aspx
8.*** WARNING L15: MULTIPLE CALL TO SEGMENT***
原因Warning 15向我们表明了linker发现了一个函数,这个函数不仅在main code 里被调用了,而且在ISR(或者被ISR调用的函数中)被调用了。或者是被同时被多个ISR同时调用了。
这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函数已经在执行时它可能被另一个ISR所调用。这样就会导致结果是可变的而且很可能会导致一些参数的错误。
另一个问题就是本地变量和参数所使用的内存可能被其他函数的内存覆盖。如果函数是由中断所调用的,则此函数的内存就会被使用。这会引起其它函数的内存错误。举例来说,对于你的第一个警告,WRITE_GMVLX1_REG是会被多个root所调用。其被
定义在D_GMVLX1.C或者D_GMVLX1.A51中。他不仅会被ISR(或者被ISR调用的函数)而且也会被MAIN.C中的VSYNC_INTERRUPT函数所调用。
解决办法:(1).主程序调用该函数时禁止中断,可以在该函数被调用时用#pragma disable语句来实现禁止中断的目的。必须使用OVERLAY指令将该函数从覆盖分析中除去。
(2).复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。(3).将
该函数设为重入型。例如:
void myfunc(void) reentrant {
...
}
这种设臵将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配臵。
这种方法消耗更多的RAM并会降低重入函数的执行速度。
9.void delay(unsigned char i) {
while(i--)
{
;
}
}
main()
{
unsigned char i,k;
while(1)
{
i=8;
delay(i);
i=7;
delay(i);
k=10;
}
}
编译器的意思是我那行程序i=7;没有用,怎么解决这个问题呢
实际上是被编译了的,
调用函数时传递的的确是7。没有写回到i倒是事实,因为编译器认为后面不再用i 了,所以就没有回写。
如果你将下面的k=10改成k=i,那么就会将7写回到i,并且keil编译器不会直接使用立即数7,而用一条减1指令,从前面的8减1变成7。
10.单片机中_crol_函数的的意思:
_crol_(a,m) 将a循环左移,步进为m
_cror_(a,n) 将a循环右移,步进为n
11.if(temp-ret>min_value)
{min_value=temp-ret;
min_id=i;
}
LAB06.C(72): error C193: '-': illegal op-type(s)
此处需要强制类型转换,因为上面有一定义 unsigned int ret[50]. unsigned int temp = 0
temp和ret不是同一类型数据。
12.用KEILC51调试程序时,出现错误提示为?unprintable character 0XA1 skipped?的问题。
输入法的问题,在程序行输入中文模式下标点符号,不会显示,但是会出现标题这样的问题,打上//马上就能看到没有显示的标点符号
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论