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

标签 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 根本不知道我正在调用函数。

最佳答案

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

  • 为具有正确返回类型和参数的函数指针创建一个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();
}

关于c - 如何使用 SDCC 通过内存地址声明函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51105167/

相关文章:

c - 将 4 位分配给 8 位寄存器

c - cond.signal 或 lock.release 有问题吗?

c - 数组 a[i] 按降序打印,但我的逻辑是升序

c - 多次执行的性能分析

php - 重构这个mysql表显示代码

linux - 学习嵌入式固件黑客

C 给变量加上负号而不给它赋值

python - Python 函数中的类型错误

javascript - CSS 未被另一个函数调用的函数使用

c - numTicks 变量不递增