IAR MSP430 bug 危险的取反操作
时间:11-13
来源:互联网
点击:
芯片是msp430f247,编译器是iar for msp430 V5.10,据说是最稳定的版本。
今天却一下子发现好几个bug。。。。
第一个bug:
语句if ((packnum == UartA0Waitchar()) && (packnum ==(~UartA0Waitchar()) ) )被编译器直接编译没了,编译器认为这句话永远不会成立,而实际上UartA0Waitchar()是个串口取字符函数,每次取回来的结果都不是一样的,这个if完全有可能成立。刚开始认为只要将编译器的优化取消即可,可是在将option->c/c++ compile ->Optimizations->level的值改为none后,if语句仍旧没了。。。。
第二个bug:
定义了packnum/rcvpacknum1/rcvpacknum2三个变量,都是unsigned char类型的。在实际执行过程中,可以查看到packnum存储于R6中,值为0x0001,rcvpacknum1存储于R7中,值为0x0001,rcvpacknum2存储于R8中,值为0x00FE。
1.语句packnum == rcvpacknum1,等式成立;
2.语句packnum == ~rcvpacknum2,等式不成立;
3.语句packnum == (unsigned char) ~rcvpacknum2,等式成立;
等式2之所以不成立,是以为0x00fe取反后位0xff01,所以和packnum不相等。问题出现了,我在定义这3个变量的时候,已经明确声明了变量类型为unsigned char,为什么在实际比较的时候去比较16bit的宽度呢!!!!
对于第二个bug,有下图可以作证。
IARMSP430bug取反操 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)