我不能解决这个问题。我不明白为什么。这是我的简单代码
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;
}
的 编译时会出现“错误:左值作为赋值的左操作数”。 请帮我。谢谢你的帮助。
答案 0 :(得分:3)
您的代码没有任何意义。前缀*
的运算符优先级高于二进制+
。因此(*(volatile unsigned int*) BASE+0x000)
将被解释为:
int
或unsigned int
。(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常量,这不适用。