如何重写此代码以避免使用全局

How do I rewrite this code to avoid using the global?

本文关键字:全局 代码 何重写 重写      更新时间:2023-10-16

我正在编写一些直接与我们设计团队的硬件接口的例程。 我将尝试尽可能简洁地解释这种情况。

我们的硬件会为运行我所描述的固件的嵌入式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修改。 也许使用命名空间? 我不确定具体情况。

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

提前感谢您的任何建议。

void inthandler() {
    static int limit = limit_interrupts();
    static int n = 0;
    if (n++ < limit) {
        // do something
    }
}

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

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

如果您所表示的内容实际上是全局的,那么它应该在您的程序中表示为全局。

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

这是一个合法的全球性,除非我的一个假设是错误的。