嵌入式C - 函数的参数太多(指针)

时间:2011-11-29 12:05:00

标签: c gcc embedded

我正在尝试在.cpp文件中调用以下宏:

#define IAP_ROM_LOCATION                0x1FFF1FF1UL
#define IAP_EXECUTE_CMD(a, b)           ((void (*)())(IAP_ROM_LOCATION))(a, b)

但是,当我像这样调用所述函数时:

IAP_EXECUTE_CMD(0, 0);

我收到错误,说明指定了太多参数?这怎么样?我会很感激任何指针。

开发环境是Cortex-M3的GCC。

4 个答案:

答案 0 :(得分:15)

为了便于阅读,请为要调用的函数定义签名:

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));
}

答案 1 :(得分:5)

(void (*)())(IAP_ROM_LOCATION)

这部分将IAP_ROM_LOCATION转换为指向不带参数的函数的指针,并且不返回任何内容(void (*)())。因此,当您想要将任何参数传递给该函数时,会出现错误。

答案 2 :(得分:2)

您也可以仅使用宏来执行此操作:

#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))

答案 3 :(得分:1)

好吧,我的C相当生疏,但在我看来,你的IAP_EXECUTE_CMD()宏正在将无符号长地址转换为指向函数的指针,该函数返回void并接受零参数。因此,传递给函数调用的任何参数都会太多。