0

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

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;
    }

测试.c:

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

它在编译时得到“错误:左值需要作为赋值的左操作数”。请帮我。感谢您的帮助。

4

4 回答 4

3

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

  • 我假设 BASE 是intor unsigned int
  • 将 BASE 强制转换为 type (volatile unsigned int*)
  • 获取该指针的内容。结果是一个unsigned int.
  • 将该值添加0x0000到该结果中。结果是类型unsigned int
  • 由于此结果不是左值,因此不能在其上使用 |=。

修复很简单:

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

于 2013-11-12T09:20:22.417 回答
2

START_REG被扩展到(*(volatile unsigned int*) BASE+0x000)所以你不能调用 |=它。你所做的和(a+1) |= 2-a + 1是暂时的一样,你不能用它来做|=

编辑:也许您遇到的问题是您的意思是|=地址指向的值。为此,请将星号移出START_REG宏中的括号:

#define START_REG                 *((volatile unsigned int*) BASE+0x000) 
于 2013-11-12T08:32:22.617 回答
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;
    }
于 2013-11-12T09:12:09.627 回答
-1

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

a |= b

相当于

a = a | b

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

于 2013-11-12T08:40:24.563 回答