首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]关于MC9S12X系列的EEPROM问题

[求助]关于MC9S12X系列的EEPROM问题

请教版主:我想在X系列单片机中的EEPROM下定义几个常量,如果我象“定义1”那样定义,取eep1时是从unpaged EEPROM的开始$c00取的,但在s19文件中根本就没有写EEPROM的代码,烧写结果EEPROM是空的。

定义1:

SEGMENTS

EEPROM = READ_ONLY 0x0C00 TO 0x0FFB;

END

PLACE

EEPCONST INTO EEPROM

END

#pragma CONST_SEG EEPCONST
const volatile byte eep0 =0x00;
const volatile byte eep1 =0x00;
const volatile byte eep2 =0x37;

a=eep1; //ldab #$c00

如果我象“定义2“那样定义,EEPROM编程没有问题,但取eep1时却按$800地址取的,请问我应该怎样定义?

定义2:

SEGMENTS

EEPROM_FF = READ_ONLY 0xFF0800 TO 0xFF0BFF;

END

PLACE

EEPCONST INTO EEPROM_FF

END

#pragma CONST_SEG EEPCONST
const volatile byte eep0 =0x00;
const volatile byte eep1 =0x00;
const volatile byte eep2 =0x37;

a=eep1; //ldab #$800

还有一个问题,为什么即便是我使用了volatile,如果eep0我没有使用的话,它还是被优化掉了?肯请版主回答,谢谢!

你可以用这个声明试试:

#pragma CONST_SEG __EPAGE_SEG EEPCONST

海纳百川  有容乃大
版主您好: 您说的方法不管用,我现在的问题是如果把常量定义在FF0800,它的不分页地址就是c00,那么我如何才能直接使用不分页地址,也就是汇编结果为ldab $c00 而不是ldab #$ff stab EPAGE ldab $800. 我的另一个问题是如何才能使编译器不优化掉我定义但没有使用的常量?
你把整个project打包上传看看吧。
海纳百川  有容乃大
这是工程,请版主看一看,谢谢。
z9Rq44hm.rar (209.05 KB)

用了volatile说明后,只能防止常量不被立即数替代,而不能防止常量被优化掉。要防止常量被优化,可以将常量加在PRM文件的ENTRIES中,如:

ENTRIES /* keep the following unreferenced variables */
/* OSEK: always allocate the vector table and all dependent objects */
//_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStart
eep0;
eep1;
eep2;
END

[此贴子已经被作者于2008-6-5 14:38:57编辑过]

海纳百川  有容乃大

关于在S19文件中生成EEPROM数据代码的问题,你可以在burner.bbl文件中加入这样一段文字:

/* EEPROM */
len = 0x800
origin = 0x000800
destination = 0x000800
SENDBYTE 1 "%ABS_FILE%"

因为要在S19和GLO文件中都生成EEPROM数据代码,所以要在这个文件中的两处加入这段文字。这样问题就解决了。

海纳百川  有容乃大
可参看此上传文件: Jk9b74t9.rar (910 Bytes)
海纳百川  有容乃大
非常感谢版主,也就说缺省的.bbl文件中没有EEPROM的说明,因此c00不能直接翻译成ff0800。再次表示感谢。
返回列表