C错误:左值作为赋值的左操作数需要左值

时间:2018-03-15 14:42:32

标签: c embedded avr-gcc contiki

我正在尝试在ContikiOS上移植arduino平台,在gpio.h的定义中,我定义了所有gpio操作,这些操作有助于将arduino gpio用于传感层。

我在这些线路上收到错误!我想我的代码是正确的!

/**
 * \name GPIO Manipulation macros
 * @{
 */
#define REG(x)         (*((volatile unsigned long *)(x)))
#define GPIO_DATA               0x00000000  /**< Data register */
#define GPIO_DIR                0x00000400  /**< Data direction register */

/** \brief Set pins with PIN_MASK of port with PORT_BASE to input.
 * \param PORT_BASE GPIO Port register offset
 * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
 */

#define GPIO_SET_INPUT(PORT_BASE, PIN_MASK) \
  do { REG((PORT_BASE) + GPIO_DIR) &= ~(PIN_MASK); } while(0)

/** \brief Set pins with PIN_MASK of port with PORT_BASE to output.
* \param PORT_BASE GPIO Port register offset
* \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
*/

#define GPIO_SET_OUTPUT(PORT_BASE, PIN_MASK) \
  do { REG((PORT_BASE) + GPIO_DIR) |= (PIN_MASK); } while(0)

PS:我正在使用avr-gcc进行编译

提前谢谢。

2 个答案:

答案 0 :(得分:1)

  

我猜我的代码是正确的

我猜你的代码不正确,因为编译器抱怨它。

实际上,一旦你掌握了术语,错误就会告诉你究竟出了什么问题。

在C编程中,lvalue基本上可以分配给变量或非常量指针取消引用。 “l”表示“左”,因为它指的是赋值左侧的值。

赋值是指你给一个非常明显的左值赋值,但在C中,赋值还包括赋值运算符,如|=,它取左值或者右边是rvalue(右边是什么)运营商的一面)。

因此,错误消息告诉您|=左侧的任何内容都无法分配给您。扩展宏后,您有

REG((PORT_BASE) + GPIO_DIR) |= (PIN_MASK)

因此编译器认为无法分配REG((PORT_BASE) + GPIO_DIR)。最可能的原因是因为没有宏REG并且编译器将其解释为函数调用。函数调用不是左值。你可能忘了一个头文件。

这里的一个方便的技巧是使用-E选项运行编译。这为您提供了对源代码进行预处理的输出,以便您可以看到编译器真正认为REG的内容。 e.g。

avr-gcc -E sourcefile.c

答案 1 :(得分:1)

conixios上的cpu / avr中缺少REG宏,我现在定义为:

#define REG(x)         (*((volatile unsigned long *)(x)))

错误已解决。