gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:10:38 24 4
gpt4 key购买 nike

我用 c 编写了一个定时器库来启动定时器,停止它......等等。我使用这个库为不同的事件制作许多计时器。对于每个事件,我都应该创建一个新的计时器实例。我将一个用于串行通信库,一个用于键盘库。现在的重点是,有一个函数 timer_interrupt_handler(New_timer* timer) 必须由保留在主文件中的微 Controller 的 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;

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;
}
}

主.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);
}

最佳答案

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

在客户端代码处

static New_timer a_timer;
void foo () {
timer_register (&a_timer);
};

在 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 ();
}

关于c - 如何避免使用 "extern"在 C 中的多个文件之间共享一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42404549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com