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.

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

 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)); } 
 (void (*)())(IAP_ROM_LOCATION) 

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

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

 #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)) 

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