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.
4 ответа
Для удобства чтения определите сигнатуру для вызываемой функции:
typedef void signature_t(int, int);
Затем вы можете разыграть свой ROM
#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() приводит длинный беззнаковый адрес в качестве указателя на функцию, которая возвращает void и принимает нулевые аргументы. Следовательно, любые аргументы, передаваемые вызову функции, будут слишком многочисленными.