Board logo

标题: CW08,怎么将一个C语言函数定位在一个绝对地址上? [打印本页]

作者: zxl777    时间: 2005-10-11 01:50     标题: CW08,怎么将一个C语言函数定位在一个绝对地址上?

比如 void fun(void)
我想把这个fun定位在 0xDD00的FLASH地址上,怎么做?
作者: yunfeng    时间: 2005-10-11 09:56

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 */
}
作者: zxl777    时间: 2005-10-11 13:21

谢谢你的答复,
你的程序是说明:怎么调用某指定地址的函数,而我问的是
怎么把C函数放置在FLASH的一个指定地址。
打个比方,就是说如果erase()是用C写的,我怎么让它位于0xFC06呢?
作者: asddsa    时间: 2005-10-11 14:16

#define fun                (*((unsigned char*)(0x0083)))
作者: strongchen    时间: 2005-10-11 15:37

可以用SECTION的方式来定义。
作者: zxl777    时间: 2005-10-11 16:21

strongchen ,请问具体关键词还有哪些?
我自己看帮助文件
作者: strongchen    时间: 2005-10-11 17:38

先在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编辑过]


作者: zxl777    时间: 2005-10-13 01:52

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

我是C51BBS论坛的站长龙啸九天,有空到 www.c51bbs.com 论坛灌水哦:)
作者: aressos    时间: 2005-10-14 09:04

版主的程序是对的,不过有两点要注意
1是楼上讲的SEGMENTS地址定义范围不能重叠
2是用到38,39等的flash时最好是整块的定义,不要象ROM_8000那样分成好几段
作者: cnzbm    时间: 2006-5-21 15:09

还是想知道:

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

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


作者: cnzbm    时间: 2006-5-21 17:15

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

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

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


作者: huangwei_flymys    时间: 2006-5-28 21:39

那么把函数定位在绝对地址上到底起到个什么作用呢?
是不是程序执行速度会加快,还是有其他的作用?
请大虾明示!
作者: cnzbm    时间: 2006-5-28 22:36

本意是想C内嵌汇编进行程序散转,以加快程序执行速度。现使用指针函数已经解决问题。
谢谢各位。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0