当前位置: 技术问答>linux和unix
内核定时器使用的错误
来源: 互联网 发布时间:2016-08-26
本文导语: 想使用内核定时器来对开发板上的灯,定时的点亮、关闭,相成闪烁的效果。在用户态应用程序调用这个驱动时,linux直接崩溃了,问题出在定时器调用的那个函数中: void led_twinkle_timer_function(unsigned long arg) { ...
想使用内核定时器来对开发板上的灯,定时的点亮、关闭,相成闪烁的效果。在用户态应用程序调用这个驱动时,linux直接崩溃了,问题出在定时器调用的那个函数中:
执行到myled_ioctl_led_on()或者myled_ioctl_led_off()时就出错了。奇怪的是如果把这两个函数禁掉,直接printk,是正常的。函数中就是调用了一个内核中的函数,而且不用时钟,直接调用时是正常的。
void myled_ioctl_led_on(void)
{
cpm2_set_pin(2, 13, CPM_PIN_OUTPUT|CPM_PIN_GPIO|CPM_PIN_VALUE_0);
}
void led_twinkle_timer_function(unsigned long arg)
{
if (!led_twinkle_status)
{
myled_ioctl_led_on();
//printk(KERN_ALERT"led on n");
led_twinkle_status = 1;
}
else
{
myled_ioctl_led_off();
//printk(KERN_ALERT"led off n");
led_twinkle_status = 0;
}
mod_timer(&myled_dev->s_timer, jiffies+HZ);
}
执行到myled_ioctl_led_on()或者myled_ioctl_led_off()时就出错了。奇怪的是如果把这两个函数禁掉,直接printk,是正常的。函数中就是调用了一个内核中的函数,而且不用时钟,直接调用时是正常的。
void myled_ioctl_led_on(void)
{
cpm2_set_pin(2, 13, CPM_PIN_OUTPUT|CPM_PIN_GPIO|CPM_PIN_VALUE_0);
}
|
在内核定时器的上下文中,代码会受到许多限制。定时器函数必须原子地运行:
1)不允许访问用户空间
2)不能访问current指针
3)不能执行休眠或这调度,schedule或者wait_event,或者kmalloc等等。
1)不允许访问用户空间
2)不能访问current指针
3)不能执行休眠或这调度,schedule或者wait_event,或者kmalloc等等。
|
ioremap在时钟中断的函数中不能这么使用吗?
ioremap 可能会引起休眠。。。
寒。 去看了一下那个帖子, 我居然也有回复。。
ioremap 可能会引起休眠。。。
寒。 去看了一下那个帖子, 我居然也有回复。。
|
有错误信息吗?
|
我也遇到过定时器引起kernel 崩溃的问题, 没找到原因,关注一下,呵呵。