与 C 中的多个中断服务例程共享全局变量

Sharing global variables with multiple Interrupt Service Routines in C

我正在用 C 语言为 PIC32 uC 编写一个程序,它有一个全局变量(uint32_t 类型),可以 read/modified 来自多个中断服务例程和来自主程序。
我知道那不安全所以我想知道如何让它安全?是否有示例说明如何使其安全?

编辑 1:

中断可以互相打断吗?是的
ISR 是否更新变量?是的 main 是否更新变量?是的 对变量的写入和读取是原子的,你怎么知道的?不确定
有实时操作系统吗?否

如果你真的需要保留全局变量,这些变量可以在服务多个可以相互中断的中断期间被修改,我建议你按照以下方式去做:

  1. 通过先禁用所有中断,然后重新启用所有中断,对这些变量"atomic" 进行所有操作序列(读取and/or 写入)。在 PIC32 上,您可以通过写入全局中断标志 GIE 来实现。
  2. 将这些变量声明为 volatile 以避免编译器进行任何意外优化。
  3. 使用特定前缀重命名这些变量以清楚地识别它们,如Shared_XXXX,但这取决于您使用的命名约定。
  4. 将对这些变量的所有操作序列放在以特定前缀命名的函数中,以便清楚地识别它们,如 Atomic_XXXX()。要实现第 1 点:这些函数必须全部以禁用所有中断开始并以重新启用所有中断结束,或者您可以系统地将原子函数作为回调参数传递给将禁用所有中断的函数,调用回调函数并重新启用所有中断。