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

CW08,怎么将一个C语言函数定位在一个绝对地址上?

CW08,怎么将一个C语言函数定位在一个绝对地址上?

比如 void fun(void)
我想把这个fun定位在 0xDD00的FLASH地址上,怎么做?
void (*const fktPtr)(void) = (void(*)(void))0x1234;
void main(void) {
  fktPtr();
}

#define erase ((void(*)(void))(0xfc06))  
void main(void) {
  erase(); /* call function at address 0xfc06 */
}
谢谢你的答复,
你的程序是说明:怎么调用某指定地址的函数,而我问的是
怎么把C函数放置在FLASH的一个指定地址。
打个比方,就是说如果erase()是用C写的,我怎么让它位于0xFC06呢?
#define fun                (*((unsigned char*)(0x0083)))
aaaaaa
可以用SECTION的方式来定义。
海纳百川  有容乃大
strongchen ,请问具体关键词还有哪些?
我自己看帮助文件
先在PRM文件中加入你要的SECTION地址:

/* This is a linker parameter file for the GP32 */
NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */

SEGMENTS /* here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
  Z_RAM  = READ_WRITE 0x0040 TO 0x00FF;
  RAM    = READ_WRITE 0x0100 TO 0x023F;
  ROM    = READ_ONLY  0x8000 TO 0xFDFF;
  T_ROM  = READ_ONLY  0xFC06 TO 0xFDFF;
END

PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
  DEFAULT_ROM                   INTO ROM;
  DEFAULT_RAM                   INTO RAM;
  _DATA_ZEROPAGE, MY_ZEROPAGE   INTO Z_RAM;
  MY_ROM                        INTO T_ROM;
END

STACKSIZE 0x50

VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */
//VECTOR 0 Entry  /* reset vector: this is the default entry point for a Assembly application. */
//INIT Entry      /* for assembly applications: that this is as well the initialization entry point */

然后在程序中将次函数定义为放在MY_ROM:

#pragma CODE_SECTION MY_ROM

void funct1(void){
  asm lda #2;
}

#pragma CODE_SECTION DEFAULT

void main(void) {
funct1();
}



[此贴子已经被strongchen于2005-10-11 17:38:24编辑过]

海纳百川  有容乃大
谢谢strongchen,您推荐的方法我已经试过了,程序已经OK。
不过要注意SEGMENTS地址定义范围不能重叠,否则绝对地址定位的函数
极可能被其他程序覆盖,而编译时竟然没有报警。

我是C51BBS论坛的站长龙啸九天,有空到 www.c51bbs.com 论坛灌水哦:)
版主的程序是对的,不过有两点要注意
1是楼上讲的SEGMENTS地址定义范围不能重叠
2是用到38,39等的flash时最好是整块的定义,不要象ROM_8000那样分成好几段

还是想知道:

使用strongchen的方法,可以将函数定位在MY_ROM区域,不过还是想知道如何将函数定位在一个绝对地址上?
比如把 void fun(void) 定位在 0xDD00的FLASH地址上,怎么做?

[此贴子已经被作者于2006-5-21 15:09:17编辑过]

还是想知道如何将函数定位在一个绝对地址上?

因为程序中有30多个函数,总不能写30多个MY_ROM段。
最好有类似变量 const @0xd000 的编译命令解决。

[此贴子已经被作者于2006-5-21 17:15:40编辑过]

那么把函数定位在绝对地址上到底起到个什么作用呢?
是不是程序执行速度会加快,还是有其他的作用?
请大虾明示!
本意是想C内嵌汇编进行程序散转,以加快程序执行速度。现使用指针函数已经解决问题。
谢谢各位。
返回列表