Intereting Posts
_mm_testc_ps и _mm_testc_pd vs _mm_testc_si128 Какой тип следует использовать для двоичного представления C enum? Передать общую библиотеку в другую версию libc Как бы вы добавляли символы в массив динамически? Без предопределенного массива? Кодовые блоки между #if 0 и #endif должны иметь парные двойные кавычки? C – Тернар действует, если еще Диапазон значений Min и Max акселерометра и преобразование данных датчика Основной цикл заканчивается неожиданно Объявление указателя функции, возвращающего массив Проблема с функцией hashирования – C Мне нужно реализовать фильтр Баттерворта в C. Легче ли получить библиотеку с этой функциональностью или написать код? OpenCV 2.1: Ошибка выполнения Сходства и различия между массивами и указателями на практическом примере Почему 32-битный указатель расшифровывается при добавлении в uint64_t? Таймеры Linux на глобальных vars

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