2014-03-04 56 views
1

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

而不是通过更换所有的函数调用来修改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))

这项工作应该如何?有没有更好的方法来做到这一点?

+3

它应该工作吗? IDK,_TRY IT!_ – ApproachingDarknessFish

+2

这可能不工作的一个原因是,如果代码传递函数指针到供应商的SDK函数,因为A)预处理器将无法替换那些实例(它们不像宏调用),B)你已经改变了功能类型。 –

+0

@ValekHalfHeart哈!毫无疑问:)代码准备开始调试前几天,我想知道是否有更好的方法可以遵循。 – bitsmack

回答

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 

注意,它传递的设备类型为目标函数,尽管它在SDK中不存在。甜!