如何使用GPLINK在地址04处编译函数? (对于PIC16)

时间:2011-08-26 20:15:48

标签: c microcontroller pic sdcc

我有一个函数,用于捕获将发生的所有中断调用,但是我无法在地址04处启动任何函数。

注意:我不想使用特定于中断类型的函数,我不想要它们在代码中产生的开销。

我在SDCC上尝试过以下代码,可能不太相关,但为了以防万一,我会将它们留在这里。

__code __at (4) void handler() {

void __at (4) handler() {

没有运气,手册也没有进一步解释。

4 个答案:

答案 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.

希望这有用!