加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于keilC编译出现的几个错误和解决方法(二)

(2013-08-19 15:24:52)
标签:

it

    第一个编译错误提示:
** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  ?_NRF24L01_X_WRITE_REG_MULTIBYTES?BYTE
    SEGMENT: ?DT?_NRF24L01_X_WRITE_REG_MULTIBYTES?NRF24L01_X
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  ?_NRF24L01_X_READ_REG_MULTIBYTES?BYTE
    SEGMENT: ?DT?_NRF24L01_X_READ_REG_MULTIBYTES?NRF24L01_X
Program Size: data=384.0 xdata=386 code=5834
    从提示中可以看出,貌似直接把函数给忽略了。从上面的Program Size可以看出data=384,而实际上我使用的是C8051F380,片内RAM仅有256Byte.RAM溢出了。
   从上面的分析可以看出data空间已经不够用,原因可能是使用了好多函数,而函数内部的局部变量又没有定义其空间,这种情况下,系统会根据编译器的设置进行分配的,将变量分配到编译器在Otions for Target 对话框里的设置的空间。我使用的是Keil C51编译器,其他编译器可能不一样。
    如下图所示中的 Memory Model 里设置成 Small:variables in DATA,则DATA空间很快便用完,导致data空间不够用。http://s6/mw690/6e020d66zx6BYAjzoIB45&690

解决的办法有两种:
    一是更改Memory Model设置,可以设置成pdata或xdata,以便有足够大的空间。但这又带来新的问题,程序运行速度减慢,而且code代码也会加大,因为如果一个局部变量被存放在了xdata空间,汇编语言访问xdata空间的代码大小要比访问data空间的代码大,变量一旦很多,程序的代码也会逐渐增大;
    二是代码优化。根据自己的要求设置变量的空间。在运行速度和代码大小之间取得适合自己的情况。

第二个提示错误是一堆的:*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL

网上提供的解决办法:

1.是文件没有添加到工程里。

2.可能是因为存在没有被调用的已经定义的函数。

3.不知道你有没有把Source group组下面的A51.C删掉,如果没有删,在A51.c上点右键,选择remove file ".

但是我的不是以上这三个,我的问题是没有加入相应的库函数,因为对应的C文件是借用芯片公司的框架,所以必须要加入相应的库;所以出现上面提示错误还有一种可能是:你声明了相应的东西,但是却没有给出具体的定义,或者是你拿别人的框架修改程序却没有在工程里面添加别人相应的库。
   今天被这两个问题折腾了一天,各种查各种尝试才解决了,写出来希望以后遇到相似问题的人能有所帮助。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有