使用C函数式宏作为函数别名

时间:2014-03-04 18:14:04

标签: c macros

我使用来自两个不同供应商的SDK在C中编写嵌入式应用程序。每个SDK都有自己的模块来处理串行(SPI)功能,它们互相干扰。我已经编写了自己的SPI模块,并希望改用我的函数。

我不想通过替换所有函数调用来修改SDK,而是希望使用类似函数的宏来使旧调用映射到新函数。

我的功能反映了他们的功能,虽然还有一个额外的参数来声明我正在与之交谈的设备。例如:

供应商的SDK功能声明:

NTRXSPIRead(uint8_t address, uint8_t *buffer, uint8_t len);

我的功能:

spiBurstRead(DEVICETYPE, uint8_t address, uint8_t *buffer, uint8_t len);

我建议的解决方案:

#define NTRXSPIRead(add,buff,len) spiBurstRead(DEVICETYPE,(add),(buff),(len))

这应该有用吗?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

我试过了,效果很好!这里有一个更简单的函数作为示例,尽管问题中发布的函数也有效。

SDK功能:

NTRXSPIWriteByte(uint8_t address, uint8_t buffer);

我的功能:

void spiWriteByte (DEVICETYPE, uint8_t address, uint8_t byte2send);

#define声明:

#define NTRXSPIWriteByte(add,buff) spiWriteByte(SPI_NANO,(add),(buff))

查看反汇编程序,直接调用该函数如下所示:

spiWriteByte (SPI_NANO, 0x01, 0xDB); // Address=0x01, Data 0xDB
LDI  R24,0x02  Load immediate // Note: "SPI_NANO" is enumerated as = 2
LDI  R22,0x01  Load immediate
LDI  R20,0xDB  Load immediate
CALL 0x00003519  Call subroutine

SDK发出的调用:

NTRXSPIWriteByte (0x01, 0xDB);
LDI  R24,0x02  Load immediate
LDI  R22,0x01  Load immediate
MOV  R20,0xDB  Load immediate
CALL 0x00003519  Call subroutine

请注意,它将DEVICETYPE传递给目标函数,即使它在SDK中不存在。甜!