是否可以从自定义内核模块中修改hrtimer参数?

时间:2015-03-06 23:51:14

标签: timer linux-kernel real-time

有没有办法在内核模块中调整hrtimer的参数(特别是我想调整min_delta_ns)?

我正在编写一个内核模块,其中有一些由hrtimer驱动的输出。这是基本代码的大致轮廓:

#include <linux/hrtimer.h>
#include <linux/sched.h>

#define MAXRUNS 300000
#define PERIOD_IN_NS 100000

static struct hrtimer hr_timer;
static ktime_t ktime_period_ns;
static volatile int runcount = 0;

static int some_function(parameters) {
    ktime_period_ns= ktime_set( 0, PERIOD_IN_NS );
    hrtimer_init ( &hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL );
    htimer.function = timer_callback;
    hrtimer_start( &hr_timer, ktime_period_ns, HRTIMER_MODE_REL );

    return 0;
}

static enum hrtimer_restart timer_callback(struct hrtimer *timer)
{
        runcount++;

        if (runcount < MAXRUNS) {
            // do stuff
            hrtimer_forward_now(&hr_timer, ktime_period_ns);
            return HRTIMER_RESTART;
        } else {
            runcount = 0;
            return HRTIMER_NORESTART;
        }
}

当我使用100,000或更高的PERIOD_IN_NS运行它时,一切都很好。但是,如果我将该值减去50,000,那么我的钳位时间约为90,000(ish),输出变得不可预测。

我运行cat / proc / timer_list来获取我的计时器的详细信息,以下是我认为相关计时器的详细信息:

Tick Device: mode:     1
Per CPU device: 0
Clock Event Device: mxc_timer1
 max_delta_ns:   1431655752223
 min_delta_ns:   85000
 mult:           6442451
 shift:          31
 mode:           3
 next_event:     13571723000000 nsecs
 set_next_event: v2_set_next_event
 set_mode:       mxc_set_mode
 event_handler:  hrtimer_interrupt
 retries:        0

从我读过的关于hrtimer如何工作的内容来看,85000的min_delta_ns意味着我不能以小于85,000纳秒的周期运行中断。我想尝试降低该值以查看是否可以让我的代码更快地循环而不会对系统产生不利影响(我在Raspberry-Pi-like开发板上运行这个名为HummingBoard)

看起来这个时钟最初是在my specific architecture's version of time.c (line 180)中配置的,但我无法弄清楚如何在我的自定义内核模块中访问和修改该上下文之外的值。

有没有办法从我的内核模块中调整hrtimer参数的值?

1 个答案:

答案 0 :(得分:1)

min_delta_ns描述硬件设备的属性。 即使你能够改变这个值(你不能),定时器事件实际上也不会更快到达。