我的使用步骤具体如下:
首先kernel中已经打开了high resolution Timer support
驱动程序中hrtimer的初始化如下:
hrtimer_init(&m_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
m_timer.function = vibrator_timer_func;
hrtimer_start(&m_timer,ktime_set(0, 62500),HRTIMER_MODE_REL_PINNED);
定时函数vibrator_timer_func如下:
static enum hrtimer_restart vibrator_timer_func(struct hrtimer *timer)
{
gpio_set_value(gpio_test, 1);
gpio_set_value(gpio_test, 0);
hrtimer_forward_now(&m_timer,ktime_set(0, 62500));
return HRTIMER_RESTART;
}
其中gpio_test为输出引脚,为了方便输出查看。
但是用示波器查看引脚波形时,发现虽然设定的周期为62.5us,但是输出总是为72us左右,而且偶尔会有两个波形靠的很近(也就是说周期突然变为10us以下)。我将周期设到40us的话,就会出现72us和10us经常交替出现,无法实现精确的40us的波形,如果设置到100us时,则波形就是100us了,而且貌似没有看到有10us以下的周期出现。
上面就是目前我使用下来的现象,不知道大神们有什么建议,是不是我哪些地方不对?
(注:我用rt_task(current)查看驱动是否是实时任务时返回的是false,不知道这个会不会有影响?如果有的话,怎么设置成实时任务?)