在使用C8051F编程时,出现以下问题:
*** ERROR L105: PUBLIC
REFERS TO IGNORED SEGMENT
SYMBOL:
?_NRF24L01_X_READ_RX_PAYLOAD?BYTE
SEGMENT:
?DT?_NRF24L01_X_READ_RX_PAYLOAD?NRF24L01_X
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
SYMBOL:
?_NRF24L01_X_WRITE_PIPE_ADDR?BYTE
SEGMENT:
?DT?_NRF24L01_X_WRITE_PIPE_ADDR?NRF24L01_X
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
SYMBOL:
?_NRF24L01_X_READ_PIPE_ADDR?BYTE
SEGMENT:
?DT?_NRF24L01_X_READ_PIPE_ADDR?NRF24L01_X
*** 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溢出了。
同时,从第一个error看提示什么,如下:
*** ERROR L107: ADDRESS SPACE
OVERFLOW
SPACE:
DATA
SEGMENT:
?DT?_NRF24L01_X_SET_PIPE?NRF24L01_X
LENGTH:
000AH
*** ERROR L107: ADDRESS SPACE OVERFLOW
SPACE:
DATA
SEGMENT:
?DT?_NRF24L01_X_SEARCH_NEXT_CLEAN_RF_CH?NRF24L01_X
LENGTH:
0009H
.......
从上面可以看出果然是溢出了。
------------------------------------------------------------------------------------------------
原因:
从上面的分析可以看出data空间已经不够用,原因可能是使用了好多函数,而函数内部的局部变量又没有定义其空间,这种情况下,系统会根据编译器的设置进行分配的,将变量分配到编译器在Otions
for Target 对话框里的设置的空间。我使用的是Keil C51编译器,其他编译器可能不一样。
如下图所示中的 Memory Model 里设置成 Small:variables in
DATA,则DATA空间很快便用完,导致data空间不够用。
-------------------------------------------------------------------------------------------
解决的办法有两种:
一是更改Memory
Model设置,可以设置成pdata或xdata,以便有足够大的空间。但这又带来新的问题,程序运行速度减慢,而且code代码也会加大,因为如果一个局部变量被存放在了xdata空间,汇编语言访问xdata空间的代码大小要比访问data空间的代码大,变量一旦很多,程序的代码也会逐渐增大;
二是代码优化。根据自己的要求设置变量的空间。在运行速度和代码大小之间取得适合自己的情况。
加载中,请稍候......