将定义传递给函数

Posted

技术标签:

【中文标题】将定义传递给函数【英文标题】:Passing defines to function 【发布时间】:2013-10-03 21:05:33 【问题描述】:

我正在使用 AVR 进行编程,并且正在尝试创建一个函数来将引脚设置为输出。我制作了一个结构来保存寄存器和密码,如下所示:

typedef struct Pin
    uint8_t pinNo;
    volatile uint8_t* pinReg;
;

然后我有这个函数来设置一个引脚输出。

void pin_output(struct Pin pin)
    //DDRA |= _BV(DDA6); 
    *(pin.pinReg) |= _BV(pin.pinNo);

这样称呼:

struct Pin pin6;
pin6.pinNo = DDA6;
pin6.pinReg = DDRA; 
pin_output(pin6);

这工作正常,但 LED 亮度非常暗。如果我这样设置输出:

DDRA |= _BV(DDA6);

引脚的预期亮度比使用该功能的亮度高约 3-5 倍。函数中丢失了什么导致亮度问题?

【问题讨论】:

【参考方案1】:

显然宏DDRA 隐藏了某种与某些硬件寄存器相关的左值。更改该左值会更改寄存器和亮度。如果该左值的实际类型是uint8_t,那么为了通过您的struct Pin 传递它,您应该将结构的相应成员初始化为

pin6.pinReg = &DDRA; 

注意& 运算符。

代码中的pin6.pinReg = DDRA 甚至不应该编译,或者至少应该为赋值中的不兼容类型产生警告。

【讨论】:

抱歉,遗留了一些调试代码。我更新了问题。我按你说的分配了 pin6.pinReg 但亮度仍然很暗。 @Nick:没有理由不工作。添加 & 后,它应该可以工作了。 对不起,我很笨。我更新了问题代码,只是假设我更新了实际代码并且没有……哈哈。谢谢现在很好用。

以上是关于将定义传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将条件传递给 Oracle 用户定义函数?

如何将局部变量传递给熊猫中的用户定义函数?

Bash - 如何将数组传递给函数,并在新函数中定义索引

如何将二维数组传递给用户定义的函数?

将当前字段的值传递给 Laravel 中的自定义验证函数

如何将自定义道具传递给 QueryRenderer 渲染函数?