我正在编写一些与我们设计组的硬件直接接口的例程。我会尽可能简洁地解释这种情况。
我们的硬件为嵌入式CPU生成各种类型的中断,运行我所描述的固件。由于我们的调试计划的性质,有时我们希望限制服务的中断数量。此中断限制通过外部寄存器接口传递到正在运行的固件中。
SO!我有两个功能: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_limit
和num_ints_serviced
声明为全局变量。我想知道是否有办法避免使用全局变量。
我对如何做到这一点有一个模糊的想法:
num_ints_serviced
声明为静态int,以便每次调用inthandler()
时都不会重置其值。 (但是,这会带来另一个问题,因为在我们的测试中,我们确实希望将该计数器重置为0.目前只需调用另一个修改全局的函数reset_in_counter()
。)int_limit
的范围,以便它可以在interrupt_handler.cpp中本地声明,但是可以从external_command_handler.cpp进行修改。也许使用命名空间?我不确定细节。我知道最佳实践说你应该避免使用全局变量,但它们有一些用途。我想知道这是否只是其中一种用途,也许我只是让这个问题变得非常困难(毕竟,使用全局变量可以解决这个问题)。
提前感谢任何建议。
答案 0 :(得分:1)
void inthandler() {
static int limit = limit_interrupts();
static int n = 0;
if (n++ < limit) {
// do something
}
}
但是你可能想要一些方法来重置n,这是没有提供的,并且它也只允许设置限制一次,这是第一次调用方法。
答案 1 :(得分:1)
如果您所代表的内容实际上是全球性的,那么它应该在您的程序中表示为全局。
除非我的一个假设是错误的,否则它是合法的全球性。