如何使用SDCC通过内存地址声明函数

时间:2018-06-29 15:34:29

标签: c function embedded memory-address sdcc

(此处为非母语人士,我为模糊的头衔表示歉意)

我正在使用编译器套件sdcc(3.7.0)来为TI-82 STATS计算器编译C代码。它的处理器是Z80。操作系统提供了多种与设备进行交互的功能,例如位于内存地址0x4755的ClrLcdScreen(),该函数不带任何参数也不返回任何内容。

要“声明”并在汇编中调用该函数,我可以执行以下操作:

ClrLcdScreen    equ     0x4755  ; Assembly equivalent of '#define ClrLcdScreen 0x4755'

        call    ClrLcdScreen    ; Call the function at memory address 0x4755

现在,我不确定如何告诉SDCC在内存地址0x4755上有一个我想调用的函数。 如何只编写声明并让SDCC知道在运行时可以在哪里找到定义?

这就是我可以想象的解决方案(下面的代码不是真实的,只是为了演示我的需要而设计的):

__at__ 0x4755 void ClrLcdScreen(); // Function declaration

int main() {
    ClrLcdScreen();
}

我尝试使用内联汇编调用该函数:

#define ClrLcdFull() __asm__("call 0x4755")

int main() {
    ClrLcdFull();
}

那行得通,但不是我想要的。使用该代码,我可以自己管理调用,而SDCC根本不知道我正在调用函数。

1 个答案:

答案 0 :(得分:4)

您可以使用函数指针。您需要做三件事

  • 使用正确的返回类型和参数为函数指针创建typedef
  • 使用该typedef声明一个指针,并为该指针分配一个地址
  • 像调用其他任何函数一样调用该函数

例如:

typedef void (*funcptr)(void);

int main(void)
{
    static const funcptr ClrLcdScreen = (funcptr)0x4755;

    ClrLcdScreen();
}

这是不涉及声明指针变量的替代方法。它只是将地址转换为函数指针,然后调用它。

typedef void (*funcptr)(void);
#define ClrLcdScreen ((funcptr)0x4755)

int main(void)
{
    ClrLcdScreen();
}