【问题标题】:How do I rewrite this code to avoid using the global?如何重写此代码以避免使用全局?
【发布时间】:2013-09-25 01:45:58
【问题描述】:

我正在编写一些与我们设计组的硬件直接交互的例程。我会尽量简洁地解释这个场景。

我们的硬件会对运行我所描述的固件的嵌入式 CPU 产生各种类型的中断。由于我们调试计划的性质,有时我们希望限制所服务的中断数量。此中断限制通过外部寄存器接口传递到正在运行的固件中。

所以!我有两个函数:inthandler()limit_interrupts()。它们基本上是这样的:

在文件 interrupt_handler.cpp 中:

void inthandler(){
    if (num_ints_serviced < int_limit)
    { 
        ...handle interrupt...
        num_ints_serviced++;
    }
}

在文件 external_command_handler.cpp 中:

void limit_interrupts(){
    int_limit = <read int limit from external register>;
}

目前,我已将 int_limitnum_ints_serviced 声明为全局变量。我想知道是否有办法避免为此使用全局变量。

我对如何做到这一点有一个模糊的想法:

  • num_ints_serviced 声明为静态int,这样就不会在每次调用inthandler() 时重置其值。 (但是,这带来了另一个问题,因为在我们的测试中,我们确实希望将该计数器重置为 0。目前只需调用另一个函数 reset_in_counter() 即可修改全局。)
  • 不知何故弄乱了int_limit 的范围,因此它可以在interrupt_handler.cpp 中本地声明,但从external_command_handler.cpp 修改。也许使用命名空间?我不确定具体情况。

我知道最佳实践表明您应该避免使用全局变量,但它们有一些用途。我想知道这是否只是其中一种用途,也许我只是让这个问题变得太难了(毕竟,使用全局变量适用于这种情况)。

提前感谢您的任何建议。

【问题讨论】:

    标签: c++ namespaces scope globals


    【解决方案1】:
    void inthandler() {
        static int limit = limit_interrupts();
        static int n = 0;
        if (n++ < limit) {
            // do something
        }
    }
    

    但是您可能想要某种方法来重置 n,这没有提供,并且它也只允许设置一次限制,即第一次调用该方法时。

    【讨论】:

    • 那么在这个例子中, lmit_interrupts() 会是什么样子?像这样的东西? int limit_interrrupts(){静态 int 限制 = 0;限制 = ;返回限制;}
    • 它将和现在一样,因为它只在 inthandler 中被调用一次。
    • 问题是中断限制可以在我们的测试中即时更改。在不关闭硬件的情况下,我们希望能够动态增加我们希望固件处理的中断数量。所以这些信息需要保存在某个地方。
    • 那么不要对 limit_interrupts() 的调用转到静态。
    【解决方案2】:

    很多人不会同意我的观点,但这是我的看法。

    如果你所代表的实际上是一个全局的,那么它应该在你的程序中被表示为一个全局。

    • 此信息代表 CPU 的属性
    • 你只有一个(CPU)
    • 如果不进行重新设计(因此需要进行代码重构),您永远不可能拥有多个版本
    • 使程序足够灵活以处理多个 CPU 配置几乎没有什么好处。它会更慢、更大、更容易出错且更难调试。

    除非我的假设之一是错误的,否则它确实是一个全球性的。

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多