c - 包含文件之间的共享变量状态未准确传达

标签 c embedded

对具有无线 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/

相关文章:

字符数组 C 中的字符插入

c - gcc无法使用mpi.h编译C文件

c - 无法调用外部函数

c - 使用 Netfilter 封装和解封装 IPv4 数据包

c - rcu_read_lock() 实际做什么(Linux 内核)

c - PC Lint while(TRUE) 与 for(;;)

embedded - Yocto 中的 BSP 和分布层有什么区别

c - 如何让 Eclipse 识别 __far 修饰符?

c - 寄存器的枚举和按位运算符

c++ - ARM 的自定义堆栈跟踪实现