当寄存器设置值时,得到“错误:左值作为赋值的左操作数”

时间:2013-11-12 08:29:57

标签: c

我不能解决这个问题。我不明白为什么。这是我的简单代码

mjpeg.h:

    #define START_REG                 (*(volatile unsigned int*) BASE+0x000)  
    #define MJPEG_PIC_START_RD                                  (0x00000001)   

mjpeg.c:

    void encStreamInit(void){
    START_REG |= MJPEG_PIC_START_RD;
    }

test.c的:

    int main(void){
     encStreamInit();
     return 0;
    }

的 编译时会出现“错误:左值作为赋值的左操作数”。 请帮我。谢谢你的帮助。

4 个答案:

答案 0 :(得分:3)

您的代码没有任何意义。前缀*的运算符优先级高于二进制+。因此(*(volatile unsigned int*) BASE+0x000)将被解释为:

  • 我认为BASE是intunsigned int
  • 将BASE转换为(volatile unsigned int*)类型。
  • 获取该指针的内容。结果是unsigned int
  • 将值0x0000添加到该结果中。结果是unsigned int类型。
  • 由于此结果不是左值,因此您不能使用| =。

修复很简单:

(*(volatile unsigned int*) (BASE+0x000))

答案 1 :(得分:2)

START_REG扩展为(*(volatile unsigned int*) BASE+0x000),因此您无法在其上调用|=。您所做的与(a+1) |= 2相同 - a + 1是暂时的,您不能将其用于|=

编辑:也许你遇到的问题是你想要|=地址所指的价值。要实现此目的,请将星号移出START_REG宏中的括号:

#define START_REG                 *((volatile unsigned int*) BASE+0x000) 

答案 2 :(得分:0)

怎么样:

mjpeg.h:

    volatile unsigned int * START_REG = BASE+0x000; /* BASE needs to be #define here- */
    #define MJPEG_PIC_START_RD                                  (0x00000001)   

mjpeg.c:

    void encStreamInit(void){
    (*START_REG) |= MJPEG_PIC_START_RD;
    }

答案 3 :(得分:-1)

当您使用define时,它只会替换文字。它不会做的是定义一个变量。在您的情况下,您希望将这些常量用作变量并在它们之间使用运算符。

a |= b

相当于

a = a | b

因此,这意味着您对常量使用OR运算符,并尝试将结果分配给START_REG常量,这不适用。