对具有无线 UART 功能的 EFM32ZG 嵌入式系统进行编程。
UART 正确接收来自无线地面站的数据。当它发生时,我只需将 bool 值切换为“true”。当 UART 检测到 RX 缓冲区中的信息时,在中断服务处理程序中设置 bool 值。为了测试此功能,我指示微处理器在正确解码数据包时将 LED 设置为高电平,并且确实如此,因此我确信问题不在于 UART 数据的接收。
在 UART.h 文件中,我声明了我的 bool 值:
`volatile bool Sweep_CW`
在 UART.c 文件中,我有一个将值设置为 True 的函数:
if(received_packet[1] == '1' && received_packet[2] == '1'){
Sweep_CW = true;
...
}
我的代码的另一部分读取这个 bool 值。接口(interface)文件的头文件中包含以下内容:
extern volatile bool Sweep_CW;
在接口(interface)文件的“.c”文件中,我有一个函数,当它读取 bool 值为 true 时,会将 LED 设置为高电平。当 UART 上收到新数据时调用此函数,否则 CPU 将循环等待。我相信这部分代码也能正常工作,因为它经过了广泛的测试。
...
if(Sweep_CW)
GPIO_PinOutSet(gpioPortC,11);
...
问题:Sweep_CW 在接口(interface)文件的 .c 函数中永远不会被解释为“true”。
问题:我觉得这应该很容易,但它给了我很多悲伤。我是否错误地设置了我的声明/我是否遗漏了一些非常明显的东西?
到目前为止我尝试过的事情:
1)我确保我使用的是“ volatile ”存储类说明符 - 这在本例中非常重要。
2)我确保我的中断服务例程完成后会清除正确的标志。
3) 在线审查类似主题的 Material :https://electronics.stackexchange.com/questions/53218/pic-global-variable-not-modified-inside-interrupt-handler
4)小睡了一会儿,然后以全新的眼光回来看这件事。
最佳答案
extern volatile bool Sweep_CW;
是声明,属于头文件。
volatile bool Sweep_CW;
是定义,只能在一个源文件中出现一次。
不幸的是,仅此并不能解释您的问题。您可以发布一个更完整的代码示例来说明该问题吗?对于甚至可能不包含相关代码的小片段进行分析是很困难的。
关于c - 包含文件之间的共享变量状态未准确传达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38577843/