当前位置: 技术问答>linux和unix
用过Linux内核定时的请进
来源: 互联网 发布时间:2016-08-28
本文导语: 小弟在前几天写了一个基于Linux操作系统的LED驱动程序,主要是应用Linux内核定时器进行自动定时,这样就不用在应用层应用ioctl函数进行控制,而把ioctl用于其它的用途,其时,之所以选择LED进行验证Linux内核定时,...
小弟在前几天写了一个基于Linux操作系统的LED驱动程序,主要是应用Linux内核定时器进行自动定时,这样就不用在应用层应用ioctl函数进行控制,而把ioctl用于其它的用途,其时,之所以选择LED进行验证Linux内核定时,是因为这样可以排除其它的干扰,有错误就一定不是LED本身引起的,而是Linux内核定时引起的。
问题在于注销模块或者运行一段时间后(大约3分钟左右)就会死机,小弟也不知道错在什么地方,有懂的朋友请指点一下。代码如下,由于比简单,所以没有加注释。
问题在于注销模块或者运行一段时间后(大约3分钟左右)就会死机,小弟也不知道错在什么地方,有懂的朋友请指点一下。代码如下,由于比简单,所以没有加注释。
/**********************************************************
*
*
*说明:本程序为一个基于Linux操作系的简单LED驱动模块,由于
* 比较简单,所以在此不再进行说明
*
**环境:
* 1)操作系统:Linux
* 2)内核版本:kernel-2.6.13
* 3)CPU :S3C2440
* 4)开发板 :Mini2440
*
*硬件连接:
* 1):LED1 -- GPB5
* 2):LED2 -- GPB6
* 3):LED3 -- GPB7
* 4):LED4 -- GPB8
*
*编译环境:arm-linux-gcc-3.4.1
*
*作者:soon
*部门:长沙理工大学
*最后修改时间:2010.5.20
*
*
**********************************************************/
#ifndef _LED_C_
#define _LED_C_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifndef LED_MAJOR
#define LED_MAJOR 240
#endif
#ifndef LED_MINOR
#define LED_MINOR 0
#endif
/*
#define TIMER_OVER (5 * Hz/100)
*/
MODULE_AUTHOR("soon");
MODULE_LICENSE("Dual BSD/GPL");
static unsigned int led_inc=0;
static unsigned int led_count = 0;
struct LED_dev
{
struct cdev cdev;
};
/*定义LED相应的CPU引脚*/
static unsigned long led_table [] = {
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8,
};
/*相应引脚的工作方式*/
static unsigned int led_cfg_table [] = {
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
};
static struct LED_dev *LED_devices;
static struct timer_list *LED_TIMER;
static void kerneltimer_timerover(unsigned long arg);
static void
kerneltimer_registertimer(void)
{
init_timer(LED_TIMER);
LED_TIMER->expires = get_jiffies_64() + (5 * HZ/100);
LED_TIMER->function = kerneltimer_timerover;
add_timer(LED_TIMER);
}
static void
kerneltimer_timerover(unsigned long arg)
{
unsigned int i;
led_count &= 0x3;
for(i = 0; i 0)return -ERESTARTSYS;
LED_TIMER = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
if(!LED_TIMER)
return -ENOMEM;
kerneltimer_registertimer();
led_inc++;
dev = container_of(inode->i_cdev, struct LED_dev, cdev);
filp->private_data = dev;
return 0;
}
static int
LED_release(struct inode *inode, struct file *filp)
{
led_inc--;
return 0;
}
static struct file_operations LED_fops = {
.owner = THIS_MODULE,
.open = LED_open,
.release = LED_release,
};
static void
LED_cleanup_module(void)
{
unsigned int i = 0;
dev_t devno = MKDEV(LED_MAJOR, LED_MINOR);
if (LED_devices) {
cdev_del(&LED_devices->cdev);
kfree(LED_devices);
}
if(LED_TIMER)
kfree(LED_TIMER);
for(; i cdev.owner = THIS_MODULE;
LED_devices->cdev.ops = &LED_fops;
result = cdev_add (&LED_devices->cdev, dev, 1);
if(result)
goto fail;
for (i = 0; i