繁体   English   中英

为什么将这些宏功能转换为功能无法正常工作?

[英]Why turning these macro-functions to functions didn't work correctly?

我正在使用一些宏来初始化,写入和读取端口或端口引脚:(而且工作正常)

/* GPIO port operations */
#define GPIO_InitPort(CONTROL, DIRECTION)   ((CONTROL) = ((DIRECTION)? (~GPIO_OUT):(GPIO_OUT)))
#define GPIO_WritePort(PORT, DATA)          ((PORT) = (DATA))
#define GPIO_ReadPort(PORT)                 (PORT)

/* GPIO port pin operations */
#define GPIO_InitPortPin(CONTROL, PIN, DIRECTION)   ((CONTROL) = (CONTROL & (~(1 << PIN)))|(DIRECTION << PIN))
#define GPIO_WritePortPin(PORT, PIN, DATA)          ((PORT) = (PORT & (~(1 << PIN)))|(DATA << PIN))
#define GPIO_ReadPortPin(PORT, PIN)                 (((PORT) & (1 << PIN)) >> (PIN))

而且,我当时正在考虑制造一个GPIO模块,其功能实现如下:

void GPIO_InitPort(uint8 PortControl, uint8 PortDir){
    PortControl = ((PortDir) ?  (~GPIO_OUT) : (GPIO_OUT));
}

void GPIO_WritePort(uint8 PortData, uint8 PortLevel){
    PortData = PortLevel;
}

uint8 GPIO_ReadPort(uint8 PortData){
    return PortData;
}
void GPIO_InitPortPin(uint8 PortControl, uint8 Pin, uint8 PinDir){
    PortControl &= ( ~(1<<Pin) | (PinDir<<Pin) );
}
uint8 GPIO_ReadPortPin(uint8 PortData, uint8 PinLevel){
    return (( PortData & (1<<PinLevel) ) >> PinLevel);
}
void GPIO_WritePortPin(uint8 PortData, uint8 Pin, uint8 PinLevel){
    PortData &= ( ~(1<<Pin) | (PinLevel<<Pin) );
}

不幸的是,尽管使用了相同的逻辑,但这是行不通的。

请记住,宏只是文本替换-不会宏参数求值 ,只是将它们扩展到位。 如果你写类似

GPIO_InitPort( foo, bar );

预处理器将其扩展为

((foo) = ((bar) ? (~GPIO_OUT) : (GPIO_OUT)));

对函数自变量OTOH 进行求值,并将求值结果传递给函数。 请记住,C使用按值传递语义-形式参数与实际参数在内存中的对象不同,因此更新一个参数不会影响另一个参数。 如果调用该函数

GPIO_InitPort( foo, bar );

形式上的参数PortControl是内存中与实际参数foo不同的对象,类似地, PortDir是与bar分离的对象。 写入PortControlfoo绝对没有影响。

如果要让函数写入调用方中的实际参数,则必须将指针传递给该参数。 因此, GPIO_InitPort将需要编写为

void GPIO_InitPort( uint8 *PortControl, uint8 PortDir )
{
  *PortControl = PortDir ? ~GPIO_OUT : GPIO_OUT;
}

并称为

GPIO_InitPort( &foo, bar );

您需要了解指针。

例:

void changeVar(int *var, int source)
{
    *var = source;
}

int main()
{
    int foobar;

    changeVar(&foobar, 5);

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM