I am trying to invoke the following macro in my .cpp file:
#define IAP_ROM_LOCATION 0x1FFF1FF1UL
#define IAP_EXECUTE_CMD(a, b) ((void (*)())(IAP_ROM_LOCATION))(a, b)
However, when I call said function like so:
IAP_EXECUTE_CMD(0, 0);
I get an error saying too many arguments specified? How is this? I would appreciate any pointers.
Development environment is GCC for Cortex-M3.
For readability, define a signature for the function to be called:
typedef void signature_t(int, int);
Then you can cast your ROM location
#define IAP_EXECUTE_CMD(a, b) ((signature_t*)IAP_ROM_LOCATION) ((a),(b))
and with a recent GCC (current version of GCC is 4.6) I would make that an inline function
static inline void iap_execute_cmd(int a, int b) {
((signature_t*)IAP_ROM_LOCATION) ((a),(b));
}
(void (*)())(IAP_ROM_LOCATION)
This part casts IAP_ROM_LOCATION
to a pointer to a function that takes no arguments and returns nothing (void (*)()
). Hence you get an error when you want to pass any arguments to that function.
You can also do it with macros only:
#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))
OK, my C is rather rusty, but it seems to me that your IAP_EXECUTE_CMD() macro is casting the unsigned long address as a pointer to a function which returns void and accepts zero arguments. Therefore, any arguments passed to the function call would be too many.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With