-1

我有一个函数旨在捕获所有将发生的中断调用,但我无法让任何函数从地址 04 开始。

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

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

__code __at (4) void handler() {

void __at (4) handler() {

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

4

4 回答 4

1

您不希望函数从地址 4 开始,而是希望编译器在该位置生成跳转到您的 isr 函数。

快速浏览一下 SDCC 文档会给出以下结构:

void isr(void) interrupt n { /* your code goes here */ }

在哪里需要 goto 指令的“n”向量槽。

其他编译器将具有类似的功能,您需要查看编译器文档以获取确切的咒语。

例如,使用 HiTech C:

void interrupt isr(void) { /* code */ }
于 2011-08-27T02:19:08.450 回答
1

函数的位置取决于链接器,而不是编译器。

于 2011-08-26T21:11:35.190 回答
0

我知道在最初的问题之后很长时间,但我正在寻找相同的答案并发现这个有用的信息,确认在 SDCC 3.3.0 上工作:(来源: http: //www.mail-archive.com/sdcc-用户@lists.sourceforge.net/msg00411.html )

要使函数链接到一个固定的已知地址,您可以用其他两个函数包围该函数:参见下面的示例。注意:所有 _ 都是双 _ _ 字符!(如果您打算在整个代码中多次使用它,您也可以像上面的示例中那样定义宏。

将 #### 替换为以下函数所需的地址:

测试.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.

希望这有帮助!

于 2013-10-27T20:56:47.810 回答
0

我在一个邮件列表中找到了这个。

sdcc --codeseg SEGNAME -c file.c
使用并链接执行此操作进行编译sdcc -Wl -bSEGNAME=0x7ff0 ...

于 2011-09-19T15:29:49.660 回答