2016-03-29 61 views
0

我用C写一个程序PIC32的uC与多个中断服务程序的全局变量,有一个全局变量(uint32_t的类型),可以读/从多个中断服务程序,并从主修改。
我知道这是不安全的,所以我想知道如何使它安全?有没有一个例子说明如何使它安全?共享使用C

编辑1:

中断可以互相中断吗?是
ISR是否更新变量?是 主要更新变量吗?是 是写入和读取的变量原子,你怎么知道?不确定
是否存在RTOS?没有

+0

最安全的方法是:不这样做!顺便说一句,我希望你把var定义为volatile。 – LPs

+0

好吧,这听起来像你在使用独立环境,所以C没有强制许可,但是如果你想编写可移植代码,你可以看看C11标准草案n1570:* 5.1.2.3程序执行5当抽象机器的处理由于接收到一个信号而中断,既没有锁定自由原子对象,也没有指定类型易失性sig_atomic_t的对象的值没有被指定[...]。任何对象的该处理程序修改的值既不是无锁原子对象也不类型的当处理程序退出[...] * – EOF

+1

如果您设置挥发性sig_atomic_t变得不确定,使得中断被禁止时你”重新服务中断,那么你所需要做的就是在你读取或修改main中全局的任何地方禁用中断。 – Ross

回答

1

如果你真的需要保留可以在多个中断的服务,可以互相中断期间进行修改全局变量,我建议你下面的方法做:

  1. 使操作的所有序列(读和/或写入)这些变量“原子”之前通过禁用所有中断,然后重新启用所有中断。在PIC32上,可以通过写入全局中断标志GIE来完成此操作。
  2. 声明这些变量作为挥发性避免编译任何意外的优化。
  3. 重命名这些变量与特定的前缀清楚地辨别出来,如Shared_XXXX,但它取决于你所使用的命名约定。
  4. 把对这些变量操作的所有序列与特定的前缀命名清楚地识别它们的功能,如Atomic_XXXX()。要实现第1点:要么这些函数必须全部通过禁用所有中断开始,并通过重新启用所有中断来结束,或者可以将原子函数作为回调参数系统地传递到禁用所有中断的函数,调用回调函数并重新启用所有中断打断。
+0

我喜欢你的建议,谢谢 –