今天调试ARM程序时遇到一个符号扩展的问题。在使用语句IO0SET = IO0SET | ( (~data) * FlashStartNum)(其中data是8位整型,FlashStartNum是一个常量)时,程序运行有问题。程序的目的就是只操作32位口线的某几位而不影响其他位。用在原来的PCB板上就没问题,用新做的PCB就有问题。经过排查,发现了问题所在。原来的PCB只使用了端口的低位,高位部分根本没有。而现在的板子则用了所有的端口。这样的话,就有问题了。虽然data是uint8类型,但是由于ARM是32 位的,data取反后就会进行符号扩展。如data=0xff,取反后data=0xffffff00,后果可想而知。改成IO0CLR = IO0CLR | ((uint8)(~data) * FlashStartNum)后即可解决问题。
文章评论(0条评论)
登录后参与讨论