C51 链接时的数据类型检查和数据错误
时间:10-02
整理:3721RD
点击:
一直意识里认为keil C51是有数据类型的检查的,比如声明和定义的数据类型不一致就会报错误或警告,但昨天才发现这个认识需要改变下了:keil C51好像在有存储模式的说明时就只检查了存储模式(data、xdata等),而对数据类型不检查了(int、char、long等),由此数据在定义和声明引用时如果错误使用了不同数据类型就会导致数据发生非预期的改变或错误。
昨天搞个程序,以前就写好的,现在整机调试下,结果发现有个通道的实时的数据总是在另外一个独立通道运行时出现错误,莫名的就改变了,搞了好大半天,查了越界操作,都没有问题。最后又去看了M51文件,发现这个数据的长度不对,预期它应该是个int,也就是占2字节,但M51显示下一字节被占用了,也就是它实际只有一个字节。于是问题就清楚了,肯定是程序里有地方对它的定义或声明有问题,所有的声明头文件和使用的方式都是按extern WORD xdata,返回来去看定义,果然是UCHAR xdata,但是奇怪,为什么没有提示报错呢?好吧,先把这个错误解决掉,调试OK。然后有兴趣再看看是不是预期的那个样子,所以有了在名为my_data.c中定义“volatile unsigned char idata test1=0;”,然后在一个使用到的文件中直接声明成“extern idata long test1;”并在函数中作为延时数据,然后编译链接,竟然真的没有问题通过了。各种挪移试验,呵呵,直到去掉idata的声明时link就会报错,所以是不是数据类型检查只检查一种呢。
个人的一点见解,也许不对,也不去找文件支持了,只希望提供一种可能的有效排错方法,有类似经历或其它看法的看官们可以来研究讨论下,呵呵。