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

Другие вопросы по тегам