【问题标题】:How to deal with flag variables in embedded system嵌入式系统中如何处理标志变量
【发布时间】:2014-03-06 10:45:14
【问题描述】:

我正在嵌入式系统上做一个项目,我在中断时更改标志变量“x_flag”。这个标志变量是全局的,并且在其他源文件中也可以访问以检查事件的状态。

我知道处理全局变量的麻烦,但是我想问一下如何才能访问其他源文件中'x_flag'的当前状态?

【问题讨论】:

    标签: variables embedded flags


    【解决方案1】:

    公开变量的正确方法是在拥有它的类中创建一个 GetXFlagState() 函数。这样,所有者类仍然处于控制之中。

    【讨论】:

    • +1 为正确答案。其他一切都是混淆。其他源文件不需要直接访问该标志。当然,您必须在 ISR 所在的文件中,在文件范围内将标志声明为 static volatile。但从来没有理由让它全球化。
    【解决方案2】:

    在你的 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 是打算作为单个标志还是一组标志。跨度>
    • @Clifford 我看不出为什么它应该是原子的,即使有一个字节,您也无法在许多平台上以原子方式修改单个位。而且我不喜欢依赖特定的 CPU 功能和编译器输出。所以我更喜欢用禁用/启用中断构建一个原子块
    • 正如我所说,在这种情况下,这并不重要。一般来说,对于共享内存,这是一个考虑因素。对于我关于位标志的观点,您有一个观点,简单地成为原子在读写修改情况下没有帮助。
    • 更好的方法是使x_flag 静态可变。将“临界区”代码放在返回变量副本的 getter 函数中。不要使用extern/globals。从来没有理由这样做。
    • @Lundin OP 询问主要如何从另一个模块访问变量。但你是对的,全局变量总是一个坏主意,这里有很多更好的解决方案
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2011-06-22
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多