-1

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

我们的硬件对运行我所描述的固件的嵌入式 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声明为全局变量。我想知道是否有办法避免为此使用全局变量。

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

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

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

提前感谢您的任何建议。

4

2 回答 2

1

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

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

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

除非我的假设之一是错误的,否则它是合法的全球性的。

于 2013-09-19T20:12:45.713 回答
1
void inthandler() {
    static int limit = limit_interrupts();
    static int n = 0;
    if (n++ < limit) {
        // do something
    }
}

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

于 2013-09-19T20:01:54.877 回答