如何避免使用"extern"在C中的多个文件之间共享实例?

Mac*_*cit 3 c embedded avr

我在c中制作了一个计时器库来启动计时器,停止它......等等.我使用这个lib为不同的事件制作许多计时器.对于每个事件,我应该创建一个新的计时器实例.我使用一个带有串行通信库,一个用于键盘库.现在重点是timer_interrupt_handler(New_timer* timer)必须通过微控制器的timer1中断程序为每个实例调用一个函数,该程序保留在主文件中.为此,计时器的实例必须是外部类型.有没有办法避免在这种情况下使用extern.

timer_tick.h文件

typedef enum state{STOPPED=0, RUNNING, TIMEOUT} Timer_state;

typedef struct {
        unsigned char volatile state;
        unsigned int volatile ticks;
        unsigned int volatile timeout_ticks;
    }New_timer;
Run Code Online (Sandbox Code Playgroud)

timer_tick.c文件

#include "timer_tick.h"

void start_a_timer(New_timer* timer)
{
    timer->state = RUNNING;
    timer->ticks = 0;
}

void stop_a_timer(New_timer* timer)
{
    timer->state = STOPPED;
}

void timer_interrupt_handler(New_timer* timer)
{
    if(timer->state==RUNNING)
    {
        if(timer->ticks < timer->timeout_ticks)
            timer->ticks++;
        else
            timer->state = TIMEOUT;
    }
}
Run Code Online (Sandbox Code Playgroud)

main.c中

// timer1 interrupt routine
void timerIsr()
{
    timer_interrupt_handler(&timer1);
    timer_interrupt_handler(&timer2);
    timer_interrupt_handler(&timer3);
    timer_interrupt_handler(&timer4);
    timer_interrupt_handler(&timer5);
}
Run Code Online (Sandbox Code Playgroud)

Fel*_*tti 5

为什么不使用链表在计时器模块中注册实例?

在客户端代码

static New_timer a_timer;
void foo () {
    timer_register (&a_timer);
};
Run Code Online (Sandbox Code Playgroud)

在timer.c:

void timer_register (New_timer * timer) {
    timer_add_to_a_linked_list (timer);
}

void timer_interrupt_handler () {
    for_each_timer_in_list_do_something ();
}
Run Code Online (Sandbox Code Playgroud)