zl程序教程

您现在的位置是:首页 >  系统

当前栏目

linux设备驱动--等待队列实现

2023-09-27 14:28:47 时间
//设置当前进程的状态为TASK_INTERRUPTIBLE //TASK_INTERRUPTIBLE是阻塞态,进程当前正在等待除CPU外的其他系统资源,可以被信号唤醒. set_current_state(TASK_INTERRUPTIBLE); //通知调度器执行调度。 schedule(); if(signal_pending(current)) return -ERESTARTSYS; // return -EAGAIN; printk("read: wake up\n"); ret = size; empty = true; return ret; ssize_t test_write(struct file *filp, const char __user *buf, size_t size, loff_t *off) int ret; empty = false; wake_up_process(task); ret = size; return ret; int major = 0; struct file_operations fops = { .open = test_open, .release = test_close, .read = test_read, .write = test_write, //模块; int test_init(void) int ret; printk("test init\n"); //注册一个字符设备驱动 ret = register_chrdev(major, DEV_NAME, fops); if(ret 0) return ret; else if(0 == major) major = ret; printk("major = %d\n", major); return 0; void test_exit(void) printk("test exit\n"); //撤销字符设备 unregister_chrdev(major, DEV_NAME); module_init(test_init); module_exit(test_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("yang.yx"); MODULE_VERSION("1.1");

Makefile

obj-m += test.o

ROOTFS = /rootfs

KERNEL_SRC = /lib/modules/`uname -r`/build

 make -C $(KERNEL_SRC) M=`pwd` modules

clean:

 make -C $(KERNEL_SRC) M=`pwd` clean

 rm -rf app

install:

 make -C $(KERNEL_SRC) M=`pwd` modules_install INSTALL_MOD_PATH=$(ROOTFS)

 arm-linux-gcc app.c -o app
ioctl.c

#ifndef __IOCTL_H__

#define __IOCTL_H__

#include linux/ioctl.h 

#define LED_TYPE 0x1

#define LED_ALLON _IO(LED_TYPE, 0)

#define LED_ALLOFF _IO(LED_TYPE, 1)

#define LED_ON _IOW(LED_TYPE, 2, int)

#define LED_OFF _IOW(LED_TYPE, 3, int)

#endif






morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。