您应该区分具有外部链接的全局变量和文件范围静态变量.你可以用后者来解决你的问题.
static volatile int shared_variable ;
int getShared(){ return shared_variable ; }
static void isr_handler()
{
shared_variable++ ;
}
因此,在上面的示例中,对转换单元外部的共享变量的唯一访问是通过访问函数getShared().这种方法当然依赖于使用单独的编译,但由于许多原因,这不是坏事.
对于其他避免全局变量的技巧,以及为什么要这样做的解释,请参阅Jack Ganssle的A Pox on Globals
要考虑的另一件事,以及全局变量在这种情况下特别成问题的原因是共享变量必须是原子的或在关键部分中访问.例如,在16位dsPIC上,32位访问不是原子的,在这种情况下,必要的保护可以放在访问函数中,而如果它是全局的,则每个访问都必须单独保护:
例如:
static volatile uint32_t shared_variable ;
int getShared()
{
uint32_t ret ;
_disable_interrupts() ;
ret = shared_variable ;
_enable_interrupts() ;
return ret ;
}