CW08,怎么将一个C语言函数定位在一个绝对地址上?
- UID
- 119721
- 性别
- 男
|
CW08,怎么将一个C语言函数定位在一个绝对地址上?
比如 void fun(void)
我想把这个fun定位在 0xDD00的FLASH地址上,怎么做? |
|
|
|
|
|
- UID
- 104673
- 性别
- 男
|
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 */
} |
|
|
|
|
|
- UID
- 119721
- 性别
- 男
|
谢谢你的答复,
你的程序是说明:怎么调用某指定地址的函数,而我问的是
怎么把C函数放置在FLASH的一个指定地址。
打个比方,就是说如果erase()是用C写的,我怎么让它位于0xFC06呢? |
|
|
|
|
|
- UID
- 119646
- 性别
- 男
|
#define fun (*((unsigned char*)(0x0083))) |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 119721
- 性别
- 男
|
strongchen ,请问具体关键词还有哪些?
我自己看帮助文件 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
先在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编辑过] |
|
|
|
|
|
- UID
- 119721
- 性别
- 男
|
谢谢strongchen,您推荐的方法我已经试过了,程序已经OK。
不过要注意SEGMENTS地址定义范围不能重叠,否则绝对地址定位的函数
极可能被其他程序覆盖,而编译时竟然没有报警。
我是C51BBS论坛的站长龙啸九天,有空到 www.c51bbs.com 论坛灌水哦:) |
|
|
|
|
|
- UID
- 105415
- 性别
- 男
|
版主的程序是对的,不过有两点要注意
1是楼上讲的SEGMENTS地址定义范围不能重叠
2是用到38,39等的flash时最好是整块的定义,不要象ROM_8000那样分成好几段 |
|
|
|
|
|
- UID
- 139252
- 性别
- 男
|
还是想知道:
使用strongchen的方法,可以将函数定位在MY_ROM区域,不过还是想知道如何将函数定位在一个绝对地址上? 比如把 void fun(void) 定位在 0xDD00的FLASH地址上,怎么做?
[此贴子已经被作者于2006-5-21 15:09:17编辑过] |
|
|
|
|
|
- UID
- 139252
- 性别
- 男
|
还是想知道如何将函数定位在一个绝对地址上?
因为程序中有30多个函数,总不能写30多个MY_ROM段。 最好有类似变量 const @0xd000 的编译命令解决。
[此贴子已经被作者于2006-5-21 17:15:40编辑过] |
|
|
|
|
|
huangwei_flymys 该用户已被删除
|
那么把函数定位在绝对地址上到底起到个什么作用呢?
是不是程序执行速度会加快,还是有其他的作用?
请大虾明示! |
|
|
|
|
|
- UID
- 139252
- 性别
- 男
|
本意是想C内嵌汇编进行程序散转,以加快程序执行速度。现使用指针函数已经解决问题。
谢谢各位。 |
|
|
|
|
|