【问题标题】:Move an interrupt handler and variables from main to a include file将中断处理程序和变量从 main 移动到包含文件
【发布时间】:2016-01-09 11:21:45
【问题描述】:

我有一个关于如何正确地将中断处理程序移动到包含文件的新手问题。我的 main.c 文件中有一个 SysTick 处理程序,以这种方式定义:

volatile int systick_timer_counter = 0;

void SysTick_Handler(void) {
    systick_timer_counter++;
}

我使用这个systick_timer_counter,每 10 毫秒增加一次,在经过一段时间后触发一些检查,然后将其重置。

我想要的是在一些不在我的main.c 文件中但在另一个函数的.c 文件中的函数中使用这个systick_timer_counter。所以我想创建一个名为systick_counter 的文件来包含我需要使用它的位置。

我要问的是,我应该如何以正确的方式做到这一点?我可以创建一个.c 文件并在其中放置变量和中断头,还是应该添加更多内容或更改变量定义?

【问题讨论】:

    标签: c global-variables microcontroller interrupt


    【解决方案1】:

    听起来你的意思是你想定义一个全局变量 一个可以从其他模块访问的模块(源文件)。

    假设我已经正确解释了您的问题,是的,可以这样做 通过使用 extern 关键字。但是,这对我来说是不负责任的 并不是说不必要地使用全局变量是不好的做法。它 导致难以维护的代码,因为外部全局可能是 从代码库中的任何地方更改。你想限制范围和 尽可能多地查看您的标识符。

    在这种情况下,我建议您改为保留 systick_timer_counter 定义它的模块的本地,并且 使用该模块中的函数来访问它。就像定义一个类 使用方法,使用没有显式类的语言。正在做 这样,除了调用,其他模块无法更改该值 reset_systick().

    int systick_timer_counter = 0;
    
    void reset_systick()
    {
        systick_timer_counter = 0;
    }
    
    void SysTick_Handler()
    {
        systick_timer_counter++;
    }
    
    int return_systick()
    {
        return systick_timer_counter;
    }
    

    【讨论】:

    • 感谢您的回答。例如,如果我在我的主循环中作为“while(return_systick()
    • @Singe 函数调用有一点开销,但我们谈论的是每次调用的少量指令,而不是程序正在执行的所有其他操作。避免过早优化;如果您愿意,可以对其进行分析,但我真的怀疑它会产生明显的不同。
    【解决方案2】:

    static 关键字添加到您希望只能从文件中访问的变量也是一个好主意。

    静态 int systick_timer_counter = 0;

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多