标题: 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 |