我有一个函数,用于捕获将发生的所有中断调用,但是我无法在地址04处启动任何函数。
注意:我不想使用特定于中断类型的函数,我不想要它们在代码中产生的开销。
我在SDCC上尝试过以下代码,可能不太相关,但为了以防万一,我会将它们留在这里。
__code __at (4) void handler() {
和
void __at (4) handler() {
没有运气,手册也没有进一步解释。
答案 0 :(得分:1)
函数的位置取决于链接器,而不是编译器。
答案 1 :(得分:1)
您不希望该函数从地址4开始,您希望编译器在该位置生成跳转到您的isr函数。
快速浏览一下SDCC文档就可以看出这个结构:
void isr(void) interrupt n { /* your code goes here */ }
你想要goto指令的'n'向量槽。
其他编译器将具有类似的功能,您需要检查编译器文档以获取确切的咒语。
例如,使用HiTech C:
void interrupt isr(void) { /* code */ }
答案 2 :(得分:1)
我在邮件列表中找到了这个。
使用sdcc --codeseg SEGNAME -c file.c
进行编译
并链接执行此sdcc -Wl -bSEGNAME=0x7ff0 ...
答案 3 :(得分:1)
我知道在原始问题之后很长一段时间,但我正在寻找相同的答案,并找到了这个有用的信息,确认在SDCC 3.3.0上工作: (来源:http://www.mail-archive.com/sdcc-user@lists.sourceforge.net/msg00411.html)
要使函数链接到固定的已知地址,您可以使用其他两个函数包围该函数:请参阅下面的示例。注意:所有_都是双_ _字符! (如果您打算在整个代码中多次使用此宏,也可以像上面的示例中那样定义宏。
使用您的函数所需的地址替换####:
test.c的
void begin_absolute_code(void) __naked
{
__asm
.area ABSCODE (ABS,CODE)
.org 0x#### // YOUR FUNCTION'S DESIRED ADDRESS HERE.
__endasm;
}
void your_function(...)
{
// Do stuff here. This code will be placed at the specified address.
}
void end_absolute_code(void) __naked
{
__asm
.area CSEG (REL,CODE)
__endasm;
}
void other_functions_here(...)
// These functions will return to relative positions determined by the linker.
希望这有用!