Embedded C - Слишком много аргументов функции (указатель)

Я пытаюсь вызвать следующий макрос в моем файле .cpp:

#define IAP_ROM_LOCATION                0x1FFF1FF1UL
#define IAP_EXECUTE_CMD(a, b)           ((void (*)())(IAP_ROM_LOCATION))(a, b)

Однако, когда я вызываю указанную функцию так:

IAP_EXECUTE_CMD(0, 0);

Я получаю сообщение об ошибке, указывающее слишком много аргументов? Как это? Я был бы признателен за любые указатели.

Среда разработки - GCC для Cortex-M3.

Ответ 1

Для удобства чтения определите подпись для вызываемой функции:

typedef void signature_t(int, int);

Затем вы можете указать местоположение своего диска

#define IAP_EXECUTE_CMD(a, b)  ((signature_t*)IAP_ROM_LOCATION) ((a),(b))

и с недавним GCC (текущая версия GCC 4.6) Я бы сделал встроенную функцию

static inline void iap_execute_cmd(int a, int b) {
    ((signature_t*)IAP_ROM_LOCATION) ((a),(b));
}

Ответ 2

(void (*)())(IAP_ROM_LOCATION)

Эта часть передает IAP_ROM_LOCATION указателю на функцию, которая не принимает аргументов и ничего не возвращает (void (*)()). Следовательно, вы получаете сообщение об ошибке, когда хотите передать какие-либо аргументы этой функции.

Ответ 3

Вы также можете сделать это только с помощью макросов:

#define IAP_ROM_LOCATION        0x1FFF1FF1UL
#define IAP_FUNC_SIGNATURE      void (*)(int, int)
#define IAP_EXECUTE_CMD(a, b)   ((IAP_FUNC_SIGNATURE)(IAP_ROM_LOCATION))((a), (b))

Ответ 4

ОК, мой C довольно ржавый, но мне кажется, что ваш макрос IAP_EXECUTE_CMD() отличает unsigned long address как указатель на функцию, которая возвращает void и принимает нулевые аргументы. Поэтому любые аргументы, переданные вызову функции, были бы слишком большими.