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 и принимает нулевые аргументы. Поэтому любые аргументы, переданные вызову функции, были бы слишком большими.