在网上的一篇**《在HCS08微控制器上使用FLASH 存储器模拟EEPROM》中发现一点问题,讨论如下:
在原来的函数 unsigned char flash_byte_prog(unsigned int _addr, unsigned char _data)中,因为FLASH擦写的操作要拷贝到RAM中执行,为了使这部分RAM在被使用后可以自动回收,原函数将代码拷贝到stack中执行。这段代码在原来的CW5.1中运行没有问题。 但最近发现在CW6.0下编译后,调用该函数会导致程序异常。跟踪发现,ROM_PGM[]中的数据拷贝到stack中后,执行 __asm { LDA _data // pass '_data' thru A TSX // transfer SP to HX JSR 2,X // first 2 bytes of _pgm[] are '_addr' } 时,JSR跳到了代码中,但是往后错了一个字节,因此出现异常。
造成该问题的原因,该是CW6.0在函数调用的时候stack的祯结构和CW5.0不一样。
这样修改原来的代码后,可以在CW6.0下正常运行: __asm { LDA _data // pass '_data' thru A TSX // transfer SP to HX JSR 3,X // first 2 bytes of _pgm[] are '_addr' //原来是JSR 2,X,改为JSR 3,X }
const unsigned char ROM_PGM[] = { 0x9E, 0xFE, 0x04, // LDHX 3,SP ; get the target address '_addr'//原来是9EFE03,改为9EFE04
如果还有人遇到类似问题,欢迎一起讨论。
|