Embedded C - слишком много аргументов для функции (указатель) - PullRequest
5 голосов
/ 29 ноября 2011

Я пытаюсь вызвать следующий макрос в моем файле .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 ]

15 голосов
/ 29 ноября 2011

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

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));
}
5 голосов
/ 29 ноября 2011
(void (*)())(IAP_ROM_LOCATION)

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

2 голосов
/ 29 ноября 2011

Вы также можете сделать это только с макросами:

#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))
1 голос
/ 29 ноября 2011

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

...