任何人都可以让我知道如何实现差分计时器概念

时间:2011-05-20 05:38:31

标签: c timer

任何人都可以让我知道如何实现差分计时器概念。

我正在开发一个移动平台,它只提供或支持一个硬件计时器。使用这个我必须维护应用程序请求的不同计时器。

任何人都可以建议使用一个硬件计时器实现此软件计时器的最佳方法

3 个答案:

答案 0 :(得分:2)

我是否正确理解您的问题为“我只有一​​个硬件计时器,但我的应用程序需要多个计时器,一个慢,一个快,其他一些”?

然后你可以这样做:

typedef void (*timer_callback_fn)(void *);

// private
struct registered_timer {
  timer_callback_fn callback;
  void *data;
  unsigned long ticks; // hardware ticks between calls to this timer
};

void timer_register(timer_callback_fn cb, unsigned long ticks) {
  ...
}

static void interrupt on_hardware_timer(void) {
  static unsigned long ticks = 0;

  ... for each registered timer ...
  if (ticks % timer->ticks == 0) {
    timer->callback(timer->data);
  }
}

当然,您必须要小心,所有软件定时器必须能够在硬件计时器的一个刻度内处理。

答案 1 :(得分:1)

如果我理解你想要实现的目标,你基本上只有一个计时器,你希望能够模拟多个计时器吗?那真的很容易。

对于每个“计时器”,从实际计时器获取当前时间。这将作为计时器的基准时间。如果想要获得时间,请获取当前时间(来自您的实际计时器)并找出当前时间和基准时间之间的差异。就这么简单。

答案 2 :(得分:1)

如果我理解你的问题:

保留一个“虚拟”计时器的排序列表,其中第一个具有最少的剩余时间。然后将“真实”计时器设置为该计时器的时间。当真实计时器到期时,处理第一个虚拟计时器,将其从列表中删除,并将实际计时器设置为与(新)第一个虚拟计时器相同的时间。

如果您有大量虚拟计时器,您可能需要考虑另一种数据结构,而不是简单的排序列表。

但我不确定你问的是什么。