进程休眠和唤醒实例

来源:互联网 发布:网页javascript打不开 编辑:程序博客网 时间:2024/05/22 06:55
/* * simple char device driver, beep *///#include #include #include #include #include #include /* printk() */#include /* kmalloc() */#include /* everything... */#include /* error codes */#include /* size_t */#include #include #include #include #include #include #include #include //#include #include #include static int beep_major = 0;//struct completion comp;DECLARE_WAIT_QUEUE_HEAD(waitq);static int stop;module_param(beep_major, int, 0);MODULE_AUTHOR("Guo Cheng");MODULE_LICENSE("Dual BSD/GPL");#define BEEP_MAGIC 'k'#define BEEP_START_CMD _IO (BEEP_MAGIC, 1)#define BEEP_STOP_CMD _IO (BEEP_MAGIC, 2)/* * Open the device; in fact, there's nothing to do here. */int beep_open (struct inode *inode, struct file *filp){return 0;}ssize_t beep_read(struct file *file, char __user *buff, size_t count, loff_t *offp){return 0;}ssize_t beep_write(struct file *file, const char __user *buff, size_t count, loff_t *offp){return 0;}void beep_stop( void ){//add your src HERE!!!//set GPB0 as outputs3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_OUTP);s3c2410_gpio_setpin(S3C2410_GPB0,0);}void beep_start( void ){//add your src HERE!!!//set GPB0 as outputs3c2410_gpio_pullup(S3C2410_GPB0,1);s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_OUTP);s3c2410_gpio_setpin(S3C2410_GPB0,1);}static int beep_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){//add your src HERE!!!switch ( cmd ) {case BEEP_START_CMD: { stop = 0;beep_start();//wait_for_completion(&comp);wait_event(waitq,stop == 1);beep_stop(); break;}case BEEP_STOP_CMD: {stop = 1;//complete(&comp); wake_up(&waitq);break;}default: {break;}}return 0;}static int beep_release(struct inode *node, struct file *file){return 0;}/* * Set up the cdev structure for a device. */static void beep_setup_cdev(struct cdev *dev, int minor,struct file_operations *fops){int err, devno = MKDEV(beep_major, minor); cdev_init(dev, fops);dev->owner = THIS_MODULE;dev->ops = fops;err = cdev_add (dev, devno, 1);/* Fail gracefully if need be */if (err)printk (KERN_NOTICE "Error %d adding beep%d", err, minor);}/* * Our various sub-devices. *//* Device 0 uses remap_pfn_range */static struct file_operations beep_remap_ops = {.owner = THIS_MODULE,.open = beep_open,.release = beep_release,.read = beep_read,.write = beep_write,.ioctl = beep_ioctl,};/* * There's no need for us to maintain any * special housekeeping info, so we just deal with raw cdevs. */static struct cdev BeepDevs;/* * Module housekeeping. */static int beep_init(void){int result;dev_t dev = MKDEV(beep_major, 0);//init_completion(&comp);/* Figure out our device number. */if (beep_major)result = register_chrdev_region(dev, 1, "beep");else {result = alloc_chrdev_region(&dev, 0, 1, "beep");beep_major = MAJOR(dev);}if (result < 0) {printk(KERN_WARNING "beep: unable to get major %d/n", beep_major);return result;}if (beep_major == 0)beep_major = result;/* Now set up cdev. */beep_setup_cdev(&BeepDevs, 0, &beep_remap_ops);printk("beep device installed, with major %d/n", beep_major);return 0;}static void beep_cleanup(void){cdev_del(&BeepDevs);unregister_chrdev_region(MKDEV(beep_major, 0), 1);printk("beep device uninstalled/n");}module_init(beep_init);module_exit(beep_cleanup);EXPORT_SYMBOL(beep_major);***********************************************************************************************#include #include #include #include #include #include #define DEVN "/dev/deep"#define BEEP_MAGIC 'k'#define BEEP_START_CMD _IO (BEEP_MAGIC,1)#define BEEP_STOP_CMD _IO (BEEP_MAGIC,2)int main(){int fd;pid_t p;fd = open(DEVN,O_RDWR);if(fd < 0){return -1;}p = fork();if(p == 0){//printf("This is child/n");printf("wait for completion...../n");ioctl(fd,BEEP_START_CMD,0);close(fd);exit(0);}else{//printf("This is father/n");sleep(4);ioctl(fd,BEEP_STOP_CMD,0);close(fd);exit(0);}}***********************************************************************************************实现功能,蜂鸣器响4秒停止