×
嵌入式 > 技术百科 > 详情

单片机程序问题总结

发布时间:2020-06-06 发布时间:
|
BL51: WARNING 16 (UNCALLED SEGMENT, IGNORED FOR OVERLAY ...)
原因是声明的函数没有调用。才产生这个警告。
详细说明见下面网址内部。
http://www.keil.com/support/docs/875.htm 
解决办法:
1将没调用的函数部分注释掉。等用到的时候在取消注释。
2调用一下,这个函数。(废话)
3使用条件编译。
#if 0 
void uncalled_function (void) 
{ } 
#endif
碰到的问题
目标器件:C8051F340
编译环境:Keil uV4.
 
 
项目需要,定义了一个数组
 
 
U8 xdata recv_para[PARA_LENGTH]={0}; //PARA_LENGTH=64
 
 
该数组如果不加xdata修饰,会报错,提示ram空间不够。
 
 
*** ERROR L107: ADDRESS SPACE OVERFLOW
 
 
加上xdata修饰后,经过测试发现程序不对。debug调试也不执行。莫名其妙。
 
 
然后将xdata修饰符改为idata后。程序可以正常运行。但是这样的话定义的数组还是会占用单片机内部ram空间。内部只有256字节ram
 
 
如果后续还要添加功能,可能内部ram还是不够用。
 
 
所以想利用单片机的外部ram。也就是datasheet里面说的XRAM来存放这个数组。datasheet里面说c8051f340这个单片机有个4k大小的XRAM可以用。
 
 
经过查网上资料发现用修饰符xdata,是没有错误的。
 
 
网上有很多关于data,idata,xdata的用法文档,这里就不引述了。
 
 
最终发现有个网友碰到的问题和我一样。
链接:http://www.amobbs.com/thread-4453022-1-1.html
链接:http://www.amobbs.com/thread-3950965-1-1.html
 
 
根据网友的解释:
 
 
1.初始化时间太长 ,看门狗默认开,没关。
2.根本原因是初始化的时间过长,超过了看门狗的时间,初始化完成以后才能进入main函数,这时关狗已经来不及了,这时要修改startup.a51(记得把它加入复制到工程而不是修改系统的),在第一条指令前加入关狗的指令,在main函数里再开(如果需要的话)。
 
 
所以,我在STARTUP.A51文件里面第131行添加了一条关闭看门狗的语句。
 
 
MOV     0D9H,#00h  ; 关开门狗 
 
 
关闭看门狗之后,再用xdata修饰符 修饰数组,然后初始化,就没有问题了。
 
 
还有一个解决方法就是定义的全局变量或者数组之类的。不要对其进行初始化。等到main程序里面,通过主动赋值的方式主动初始化。
  

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
三星研发基于risc-v架构的5G毫米波射频芯片