问题
在我的个人项目中,我在UART抽象库中定义了一个结构(让我们称之为UART.c和UART.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”:
你可以看到我在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”。
我已经把头发撕了好几个小时了。谢谢你的期待。
答案 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
。