【发布时间】:2014-11-29 16:11:58
【问题描述】:
我主要是自学 C 语言。我对嵌入式微控制器进行编程。 (以 dsPIC33fj128gp804 为例) 我通常使用全局变量,而我读过的所有内容都谴责使用全局变量,就像它们是瘟疫一样。我一直在努力减少使用,但有一种情况我不知道如何不使用全局变量。
微控制器配备中断。中断是在硬件外部触发的事件。当中断被触发时,主代码的执行停止,当前的工作变量被保存,一个预先分配的函数被执行,然后主代码从它停止的地方重新开始。因为中断是一个独立的函数,可以随时触发,没有任何东西可以传入或传出函数。
例如,当 UART 硬件接收到一个字节的数据时,该数据需要在被覆盖之前移出硬件缓冲区。
void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void)
{
GlobalVariable = U2RXREG; // Move data to global variable
IFS4bits.U2RXIF = 0; // Clear the UART2 Receive Interrupt Flag
}
有没有办法在没有全局变量的情况下做到这一点,或者这是一个例外?
【问题讨论】:
-
对于不同的线程和ISR(中断服务例程),您确实必须使用全局数据。但您有时也需要确保在访问这些数据时互斥。
-
全球不是瘟疫,很多人说实际上不知道为什么或为什么不知道,除非有人告诉他们。根据经验而不是猜测从那里慢慢改变你所知道的......
-
如果您采纳@dwelch 的建议“慢慢改变”,您可能会发现您会“慢慢”减少错误数量!虽然我们可能同意很多,但我不确定我是否同意。然而,确实许多人盲目地遵循“没有全局变量”的口头禅,而没有费心去理解为什么或更重要的是也许是适当的替代方案。理解为什么以及如何是不被诱惑假设你有一个可以或必要的特殊情况的关键。然而在瘟疫上:A Pox on Globals.
标签: c embedded global-variables microchip