我正在使用hrtimer来实现带有GPIO的方波输出。
系统是AR9331 + openwrt,它不支持PWM输出。
摘录如下,
初始化并开始
hrtimer_init(&(s_WS2812_control.send_timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);
s_WS2812_control.send_timer.function = send_timer_handler;
hrtimer_start(&(s_WS2812_control.send_timer), ktime_set(0, 1000), HRTIMER_MODE_REL); //timeout now
我的超时处理程序是
send_period = ktime_set(0, 1000); //next timeout period is 1us
gpio_level = ~gpio_level;
gpio_set_value(out_pin, gpio_level);
hrtimer_forward(&send_timer,
send_timer.base->get_time(),
send_period);
我的结果不符合逻辑,因为它的超时时间(状态切换时间)不固定。 (在示波器中观察)
有时它是3.6us,有时是15us。
我认为即使处理程序的执行时间大于1us,波形也应该是1us的移位,但不是这样,因为定时器中断对于系统是高优先级的,就像我想象中的其他硬件中断一样。
我的波形是这样的,短/长期如上所述。我真的不明白为什么GPIO输出是这样的。
如果有人知道有关此问题的一些线索,请提供帮助,或欢迎任何有关计时器教程/学习材料的建议。
感谢。