嵌入式C:能够访问某些结构成员而不能访问其他结构成员

时间:2015-07-28 03:05:07

标签: c struct boolean avr

问题

在我的个人项目中,我在UART抽象库中定义了一个结构(让我们称之为UART.c和U​​ART.h)我为AVR做了。

在UART.h中:

typedef struct ST_UARTRX_MESSAGECONTENTS{
 uint8_t u_command[3];          //Command 
 uint32_t u32_value;            //Parameter for Command
 boolean b_newValue;    //Is there new value written here
 boolean b_Error;       //Is there an error with this message
} ST_UARTRX_MESSAGECONTENTS;

volatile ST_UARTRX_MESSAGECONTENTS st_uartRX_MessageContents;

所以基本上它是一个包含UART消息的结构,它有一个“b_newValue”,它是收到新消息时的标志。当AVR收到新行“\ n”时,“收到”消息。

在另一个文件的头文件中(让我们调用“foo.h”):我包含了我的“UART抽象库”并将其放在标题中:

extern volatile ST_UARTRX_MESSAGECONTENTS st_uartRX_MessageContents;

但是在foo.c中,我尝试访问“b_newValue”:

if(st_uartRX_MessageContents.b_newValue){
    st_uartRX_MessageContents.b_newValue = TRUE;  
    fsm_state = ST_STOREMACRO;
}

但即使我的调试器说结构值确实为真,也永远不会输入“if”:

enter image description here

你可以看到我在if语句中突破了。如果我点击“Step”,它就会跳过它并且不会进入!

布尔类型参数:

typedef enum{FALSE, TRUE} boolean;

我尝试过的一些事情

当我查看已编译的ASM代码时,我看到通用寄存器R24用于加载b_newValue,但它加载0x00,而不是像我期望的那样加载0x01。

uartTX_sendArray(st_uartRX_MessageContents.u_command, sizeof st_uartRX_MessageContents.u_command);
delay_ms(2000);
if(st_uartRX_MessageContents.b_newValue){
    st_uartRX_MessageContents.b_newValue = TRUE;  
    fsm_state = ST_STOREMACRO;
}

我使用“UART:发送此数组”函数从同一结构发送ascii“命令”,它可以工作!我不知道为什么我的foo.c可以看到“命令”而不是“b_newValue”。

我已经把头发撕了好几个小时了。谢谢你的期待。

1 个答案:

答案 0 :(得分:1)

根据您现在发布的内容判断,您在头文件UART.h

中有结构对象已定义
volatile ST_UARTRX_MESSAGECONTENTS st_uartRX_MessageContents;

这是正式的非法(如果你将UART.h包含在多个翻译单元中),即使某些编译器接受它作为扩展,通常也不是一个好主意。我建议你将上面的定义移到UART.c文件中并放置一个非定义的声明

extern volatile ST_UARTRX_MESSAGECONTENTS st_uartRX_MessageContents;

进入UART.h