最近在公司写个小程序,用C51,这个东东可是以前没有用过,不过都是C,问题倒还是不大,就是需要注意一下C51的特殊语法就好了。
话说这一天编译出现了下面的警告信息:
WARNING L6: XDATA SPACE MEMORY OVERLAP
虽说警告信息不影响运行,但是放在那里总是不爽,而且是个隐患。于是请教了一下公司同事,把这个问题给解决了。
从字面上的意思来看,这个警告信息说的是xdata空间的内存被覆盖了。C51对于片外变量,可以使用xdata关键字来标识,对于这些变量的操作,当然要比片内变量要慢一点,但是胜在空间比内部变量的空间要大得多,所以在大多数情况下都是使用xdata变量空间的.
那么xdata空间的内存被覆盖到底是什么意思呢,原来是C51在定义xdata区域变量的时候,可以使用关键字"_at_"来直接定义某个变量的地址,这一般是用来定义硬件地址的。这样看来,这个警告信息的意思就比较明确了,就是编译器发现两个被指定了地址的变量使用了同一个地址空间。
譬如我的错误就是定义了一个变量,其地址在0x8000,这是一个数组,长度为16,然后又定义了一个变量,其地址在0x800A,这下明白了吧,第一个变量的起始地址是0x8000,长度16,结束地址就是0x800F,正好包括了0x800A这个地址,所以导致上述的警告信息。
既然知道了原因,解决起来就简单了,只要修改变量的地址,使之不发生冲突就好了。
话说这一天编译出现了下面的警告信息:
WARNING L6: XDATA SPACE MEMORY OVERLAP
虽说警告信息不影响运行,但是放在那里总是不爽,而且是个隐患。于是请教了一下公司同事,把这个问题给解决了。
从字面上的意思来看,这个警告信息说的是xdata空间的内存被覆盖了。C51对于片外变量,可以使用xdata关键字来标识,对于这些变量的操作,当然要比片内变量要慢一点,但是胜在空间比内部变量的空间要大得多,所以在大多数情况下都是使用xdata变量空间的.
那么xdata空间的内存被覆盖到底是什么意思呢,原来是C51在定义xdata区域变量的时候,可以使用关键字"_at_"来直接定义某个变量的地址,这一般是用来定义硬件地址的。这样看来,这个警告信息的意思就比较明确了,就是编译器发现两个被指定了地址的变量使用了同一个地址空间。
譬如我的错误就是定义了一个变量,其地址在0x8000,这是一个数组,长度为16,然后又定义了一个变量,其地址在0x800A,这下明白了吧,第一个变量的起始地址是0x8000,长度16,结束地址就是0x800F,正好包括了0x800A这个地址,所以导致上述的警告信息。
既然知道了原因,解决起来就简单了,只要修改变量的地址,使之不发生冲突就好了。