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