Как я могу объявить функцию по адресу памяти с SDCC - PullRequest
0 голосов
/ 29 июня 2018

(не носитель языка, прошу прощения за смутное название)

Я использую набор компиляторов sdcc (3.7.0) для компиляции кода C для калькулятора TI-82 STATS . Его процессор Z80. ОС предоставляет несколько функций для взаимодействия с устройством, например, ClrLcdScreen () по адресу памяти 0x4755, который не принимает аргументов и ничего не возвращает.

Чтобы «объявить» и вызвать эту функцию в сборке, я могу сделать следующее:

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 голосов
/ 29 июня 2018

Вы можете использовать указатели функций. Есть три вещи, которые нужно сделать

  • создать 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();
}
...