打印

昨天看到freescale工程师写的一个**

[复制链接]
3022|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JerryBJ|  楼主 | 2007-10-9 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在网上的一篇**《在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


如果还有人遇到类似问题,欢迎一起讨论。

相关帖子

沙发
forthlab| | 2007-10-9 17:16 | 只看该作者

我在CW5.1上调试的,好像就有这个问题啊。

我当时以为是印刷错误,现在CW6.0也有,
是否是编译器设置问题?

使用特权

评论回复
板凳
yewuyi| | 2007-10-10 08:33 | 只看该作者

发现MOTO的写FLASH比较麻烦……

感觉MSP430在这上面做的比较简单明了。

使用特权

评论回复
地板
forthlab| | 2007-10-10 09:48 | 只看该作者

昨天看到freescale工程师写的一个**

意思是高可靠性的程序要求,其中有一条:写flash的程序最好不要放在应用程序内,防止程序跑飞删除代码。。。。。。

使用特权

评论回复
5
afanti| | 2007-11-16 22:41 | 只看该作者

??我怎么没有这个问题

Jerry,这个函数我在5.1和6.0上都用过,没有发现这个问题啊!按照你的修改,造成非法代码复位,观察了执行过程,JSR 2,X跳得地方就是0x9E, 0xFE, 0x03。没错,为什么你们的和我的不一样?

使用特权

评论回复
6
forthlab| | 2007-11-18 19:45 | 只看该作者

所以我怀疑是否是编译器设置问题?

有人能解释一下么?

使用特权

评论回复
7
afanti| | 2007-11-19 16:23 | 只看该作者

re

院创作者Jerry这几天也不来了,等待ing

使用特权

评论回复
8
张明峰| | 2007-11-27 18:26 | 只看该作者

我自己用的Flash模拟E2程序

使用特权

评论回复
9
forthlab| | 2007-11-28 11:33 | 只看该作者

如果有专用版PE的license,包含flash模块的

如果有专用版PE的license,里面包含flash模块的,应该不会有BUG的。
可惜没有啊。。。。。

使用特权

评论回复
10
afanti| | 2007-12-3 13:54 | 只看该作者

re

学习一下张教主的程序~~~

使用特权

评论回复
11
hantian521314| | 2014-4-27 11:43 | 只看该作者
非常感谢!若能分析一下原因就更好了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

84

帖子

0

粉丝