【发布时间】:2014-03-06 10:45:14
【问题描述】:
我正在嵌入式系统上做一个项目,我在中断时更改标志变量“x_flag”。这个标志变量是全局的,并且在其他源文件中也可以访问以检查事件的状态。
我知道处理全局变量的麻烦,但是我想问一下如何才能访问其他源文件中'x_flag'的当前状态?
【问题讨论】:
我正在嵌入式系统上做一个项目,我在中断时更改标志变量“x_flag”。这个标志变量是全局的,并且在其他源文件中也可以访问以检查事件的状态。
我知道处理全局变量的麻烦,但是我想问一下如何才能访问其他源文件中'x_flag'的当前状态?
【问题讨论】:
公开变量的正确方法是在拥有它的类中创建一个 GetXFlagState() 函数。这样,所有者类仍然处于控制之中。
【讨论】:
static volatile。但从来没有理由让它全球化。
在你的 c 文件中你可以像这样定义它
volatile int x_flag;
void myISRFunction(void)
{
x_flag = 1;
}
然后在你的头文件中添加一个声明
extern volatile int x_flag;
那么你只需要包含其他c文件中的头文件就可以访问x_flag
但是你也应该在访问/修改标志时禁用中断。
#include "myISR.h"
void someFunc()
{
int local_x_flag;
disableInterrupts();
local_x_flag = x_flag;
x_flag = 0;
enableInterrupts();
if ( local_x_flag )
doSomething();
}
请注意,如果标志确实是一个硬件寄存器,您可能需要更加小心,因为禁用中断不会阻止硬件更改标志的值,并且可能允许也可能不允许明确清除它。在这种情况下,您需要仔细查看硬件文档以了解哪些是安全的,哪些是不安全的(和/或与设计它的人交谈,如果您与硬件工程师合作)。
【讨论】:
x_flag 的数据类型在目标架构上也应该是原子的。例如,int 在 8 位系统上可能不是这种情况。但是,如果它只用于值 0 和 1,这可能无关紧要,但尚不清楚 x_flag 是打算作为单个标志还是一组标志位。跨度>
x_flag 静态可变。将“临界区”代码放在返回变量副本的 getter 函数中。不要使用extern/globals。从来没有理由这样做。