嵌入式操作系统(Linu进程及设备驱动程序)课件

上传人:磨石 文档编号:243154954 上传时间:2024-09-17 格式:PPT 页数:65 大小:299KB
返回 下载 相关 举报
嵌入式操作系统(Linu进程及设备驱动程序)课件_第1页
第1页 / 共65页
嵌入式操作系统(Linu进程及设备驱动程序)课件_第2页
第2页 / 共65页
嵌入式操作系统(Linu进程及设备驱动程序)课件_第3页
第3页 / 共65页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,嵌入式操作系统(Linu进程及设备驱动程序),*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,嵌入式操作系统(Linu进程及设备驱动程序),*,Linux,进程间通信及驱动程序,软件,学院 张亮,嵌入式操作系统(Linu进程及设备驱动程序),通信目的,进程间的数据传递,,A,向,B,传送,进程间的数据共享,一个修改后,别的可以看到,通知事件:一个进程要向一个或者一组进程发送消息,表明某种事件的产生,资源共享:多个进程要共享同样的资源,需要加锁和同步,进程控制:需要控制另外一个进程的执行(知道他的状态信息),2,嵌入式操作系统(Linu进程及设备驱动程序),通信方法,信号,管道,消息,信号量,共享内存,套接字,自定义,3,嵌入式操作系统(Linu进程及设备驱动程序),通信方法,信号,最古老的进程间通信方式之一,内核为进程产生信号,以表示不同的事件,这些事件就是信号源,异常:进程运行过程产生的异常,其他进程:一个进程可以向另一一个或者一组进程发送信号,终端中断:,Ctrl-C,报警:计时器到期,其他:通知。例如,IO,就绪,4,嵌入式操作系统(Linu进程及设备驱动程序),通信方法,信号处理,内核对信号的,5,种缺省动作,异常终止,将进程的地址空间内容、寄存器内容保存到一个,core,文件中,终止进程,退出:不产生,core,文件,终止进程,忽略:不处理该信号,停止:挂起该进程,继续:如果该进程被挂起,则恢复进程运行,否则,忽略该信号,5,嵌入式操作系统(Linu进程及设备驱动程序),通信方法,信号处理,信号的特定处理动作,忽略,但是,SIGKILL,、,SIGSTOP,不能被忽略,阻塞信号:进程可以选择阻塞某些信号,先将到来的信号记录下来,等到以后解除阻塞后再处理,进程处理该信号:注册处理程序,信号对照含义?,SIGHUP,、,SIGINT,、,SIGQUIT,、,SIGFPE,、,SIGKILL,、,SIGALRM,、,SIGTERM,、,SIGHLD,、,SIGSTOP,6,嵌入式操作系统(Linu进程及设备驱动程序),通信方法 信号处理,系统调用,Signal,、,sigaction,定时器相关:,alarm,,,settimer,7,嵌入式操作系统(Linu进程及设备驱动程序),通信方法,管道,特点,单向的、先进先出、无结构、固定大小的字节流,一个读、一个写,管道大小的定义:,PIPE_BUF,,在,include/linux/limits.h,中,一般大小为,4096,8,嵌入式操作系统(Linu进程及设备驱动程序),通信方法,管道调用,系统调用,Pipe(),,读、写操作,输入参数,int filedes2,返回值中,filedes0,为读句柄,filedes1,为写句柄,9,嵌入式操作系统(Linu进程及设备驱动程序),通信方法,消息,使用消息队列标识符进行标识,Msgget,创建一个新队列或者打开一个已经存在的队列,Msgsnd,向队列末端添加一条新消息,Msgrcv,从队列中取消息,注:取消息不一定是按照先进先出原则,也可以按照消息类型字段获取(,msgrcv,方式决定),10,嵌入式操作系统(Linu进程及设备驱动程序),通信方法-信号量,用于保护临界资源,以及进程间同步,初始化函数,sem_init(),,注意参数,等待信号量可用,sem_wait/sem_trywait,释放信号量,sem_post,11,嵌入式操作系统(Linu进程及设备驱动程序),通信方法-共享内存,进程间数据通信方法,直接读写内存,不需要任何数据拷贝,管道、消息机制都需要在内核、用户空间进行数据拷贝(系统调用过多),Shm_get,用于创建或者获取标识符,Shm_at,用于获取对应的地址,Shm_dt,用于删除,12,嵌入式操作系统(Linu进程及设备驱动程序),通信方法-套接字,进程间数据通信方法,事件形式,RAW_SOCKET,发送、接收都一致,13,嵌入式操作系统(Linu进程及设备驱动程序),什么是设备驱动程序,设备驱动程序就是外部设备的软件抽象,或者说是软件表现 ,是系统看到的设备,是虚拟的设备。,一个外设的性能在很大程度上取决于驱动程序的性能。驱动程序之于外部设备,犹如操作系统之于硬件环境。,14,嵌入式操作系统(Linu进程及设备驱动程序),驱动程序有什么用,Linux,下的设备驱动程序都是一个个独立的,“黑盒子”,,使某个特定的硬件响应一个,定义良好的内部编程接口,,同时完全隐藏了设备的工作细节。,用户对设备的操作通过,一组标准化的系统调用,来完成。驱动程序就是将这些,调用映射到作用于实际硬件的设备特定的操作上,(写寄存器命令)。,15,嵌入式操作系统(Linu进程及设备驱动程序),系统调用接口,设备,1,设备,2,设备,3,驱动,1,驱动,2,驱动,3,用户程序,用户空间,内核空间,内核子系统,其它模块,其它模块,硬件,驱动程序在内核中的位置,16,嵌入式操作系统(Linu进程及设备驱动程序),模块化的驱动程序,为了使系统更有效的运行,,Linux,支持,内核的动态扩展,,即在系统,运行时给内核增加新的功能,(模块)。,驱动程序就是几个可以模块化的功能之一。这也是,Linux,下驱动程序与,Windows,下驱动程序的最大区别。,17,嵌入式操作系统(Linu进程及设备驱动程序),什么是模块,模块是一段没有链接的目标代码(,.o,),可由,insmod,程序动态的链接到正在运行的内核,链接后,它就成了内核的一部分,直到用,rmmod,程序解除链接。,和用户函数库的动态链接有些相似;但函数的功能在链接前就已明确,而模块连接时才注册自己的功能。,18,嵌入式操作系统(Linu进程及设备驱动程序),系统内核,19,嵌入式操作系统(Linu进程及设备驱动程序),驱动程序,系统内核,20,嵌入式操作系统(Linu进程及设备驱动程序),驱动程序,将驱动程序加入到内核中,系统内核,21,嵌入式操作系统(Linu进程及设备驱动程序),系统内核,22,嵌入式操作系统(Linu进程及设备驱动程序),核心模块与应用程序的对比,C,语言应用程序,模块程序,入口,main(),init_module(),出口,exit(),cleanup_module(),编译,gcc,gcc c D_KERNEL_ -DMODULE,链接,gcc (ld),insmod,运行,由,OS,加载运行,等待为某个进程服务,地址空间,用户空间,内核空间,23,嵌入式操作系统(Linu进程及设备驱动程序),简单驱动程序举例子,-2.4,#ifndef MODULE,#define MODULE,#endif,#ifndef _KERNEL_,#define _KERNEL_,#endif,#include ,#include ,int,init_module,(void),printk,(KERN_ALERT “ Hello World !n”);,return 0;,24,嵌入式操作系统(Linu进程及设备驱动程序),void,cleanup_module,(void),printk(KERN_ALERT “Goodbye !n”);,MODULE_LICENSE(“GPL”)/,为了避免,”no license”,警告,-,MakeFile,文件,MODULECFLAGS := -I /usr/src/linux-2.4/include D,MODULE,D,_KERNEL_,hello.o: hello.c,gcc $(MODULECFLAGS) c hello.c,.PHONY: clean,clean: rm f hello.o,简单驱动程序举例子,-2.4,25,嵌入式操作系统(Linu进程及设备驱动程序),注意之处,1,:,2.4,内核中,,MODULE,和,_KERNEL_,宏必须定义,,无论是在编译选项时还是在源文件代码,中。保险期间:两边都写,同时使用,ifdef,宏加了保护,不会出现重复定义,2,:如果在,printk,打印时候不使用,KERN_ALERT,宏,则,linux/kernel.h,可以不包括,3,:,头文件,linux/module.h,必须添加,4,:初始化必须是,init_module,,退出函数必须是,cleanup_module,简单驱动程序举例子,-2.4,26,嵌入式操作系统(Linu进程及设备驱动程序),简单驱动程序举例子,-2.6,#include #include ,#include ,MODULE_LICENSE(Dual BSD/GPL);,static char *whom = world;,module_param(whom, charp, 0);,static int howmany = 1;,module_param(howmany, int, 0);,static int,hello_init,(void) int i;for( i=0; ihowmany; i+)printk(KERN_ALERT (%d) Hello, %s!n,i,whom);return 0;,27,嵌入式操作系统(Linu进程及设备驱动程序),简单驱动程序举例子,-2.6,static void,hello_exit,(void)printk(KERN_ALERT Goodbye!n);,module_init,(hello_init);,module_exit,(hello_exit);,-,Makefile,文件:,obj-m += hello.o,all:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean,28,嵌入式操作系统(Linu进程及设备驱动程序),2.6,加载,insmod hello.ko,howmany=5 whom=islab,注意事项,初始化和退出函数可以写成任何名字,使用,module_init,以及,module_exit,宏调用一下即可,本质和,2.4,的,init,,,cleanup,一致,参数传递的注意事项,信息查看在,cat /var/log/messages,简单驱动程序举例子,-2.6,29,嵌入式操作系统(Linu进程及设备驱动程序),2.6,内核模块参数传递,内核提供了一个简单框架,允许驱动程序声明参数,并且用户在,系统启动,或,者模块装载,时候为,参数指定相应的值,。,-,必须包含,linux/moduleparam.h,文件,模块参数定义方式,module_param(int_name, type, perm);,module_param_named(,ext_name,int_name, type, perm);,module_param_string(ext_name, string, len, perm);,module_param_array(int_name, type, nump, perm);,module_param_array_named(ext_name, int_name, type, nump, perm);,使用宏,MODULE_PARM_DESC(),对定义的参数进行说明,30,嵌入式操作系统(Linu进程及设备驱动程序),各个参数含义,int_name,:当参数中没有,ext_name,的时候,此参数即是用户看到的参数名,又是模块内接受参数的变量,2.6,内核模块参数传递,len,:当参数是,string,的时候,表示字符串,string,数组的大小,type,:表示参数的数据类型,可以为,byte, short, ushort, int, uint, long, ulong, charp, bool, invbool,perm,:指定了在,sysfs,中相应文件的访问权限。,(,一般不考虑,),ext_name,:用户看到的参数名,对外的参数名,nump,:指向一个整数,其值表示有多少个参数存放在数组中,module_param_array_named(ext_name, int_name, type, nump, perm);,31,嵌入式操作系统(Linu进程及设备驱动程序),模块参数传递举例,#include #include #include ,#define MAX_ARRAY 6static int int_var = 0;static const char *str_var = default;static int int_array6;int narr;,module_param(int_var, int, 0);,MODULE_PARM_DESC(int_var, A integer variable);,module_param(str_var, charp, 0);,MODULE_PARM_DESC(str_var, A string variable);,module_param_array(int_array, int, ,MODULE_PARM_DESC(int_array, A integer array);,32,嵌入式操作系统(Linu进程及设备驱动程序),模块参数传递举例,static int _init hello_init(void)int i;printk(KERN_ALERT Hello, my LKM.n);printk(KERN_ALERT int_var %d.n, int_var);printk(KERN_ALERT str_var %s.n, str_var);for(i = 0; i name = DEV_NAME;,dev-major = MAJOR(inode-i_rdev);,dev-minor = MINOR(inode-i_rdev);,dev-read_buffer = kmalloc(sizeof(READ_BUF_SIZE),GFP_KERNEL);,if(dev-read_buffer = NULL),printk( KERN_ALERT allocate read buffer memory failed.n);,dev-write_buffer = kmalloc(sizeof(WRITE_BUF_SIZE),GFP_KERNEL);,if(dev-read_buffer = NULL),printk( KERN_ALERT allocate write buffer memory failed.n);,init_waitqueue_head(,init_waitqueue_head(,if(filp-private_data = NULL),filp-private_data = dev;,printk(The function of Myopen has been called !n);,return 0;,55,嵌入式操作系统(Linu进程及设备驱动程序),int my_release(struct inode *inode,struct file *filp),struct Mydevice *dev = filp-private_data,;,if(dev-read_buffer != NULL),kfree(dev-read_buffer);,if(dev-write_buffer != NULL),kfree(dev-write_buffer);,kfree(dev);,printk(The function of Myrelease has been called,!,n);,return 0;,56,嵌入式操作系统(Linu进程及设备驱动程序),ssize_t my_read(struct file *filp,char *buf,size_t count,loff_t *offp),char *pdata = kmalloc(sizeof(count),GFP_KERNEL);,if(pdata = NULL),return (-ENOMEM);,copy_to_user(buf,pdata,count);,*offp += count;,printk(The function of Myread has been called,!,n);,return count;,57,嵌入式操作系统(Linu进程及设备驱动程序),ssize_t my_write(struct file *filp,char *buf,size_t count,loff_t *offp),char *pdata = kmalloc(sizeof(count),GFP_KERNEL);,if(pdata = NULL),return (-ENOMEM);,copy_from_user(pdata,buf,count);,*offp += count;,printk(The function of Myread has been called,!,n);,return count;,58,嵌入式操作系统(Linu进程及设备驱动程序),int my_ioctl (struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg),switch(cmd),case 1 :,printk(This is command 1 !n);,break;,case 2 :,printk(This is command 2 !n);,break;,case 3 :,printk(This is command 3 !n);,break;,default :,printk(There is no such command !n);,return -1;,return 0;,59,嵌入式操作系统(Linu进程及设备驱动程序),struct file_operations fops = ,open : my_open,/* open,函数 *,/,release: my_release,/* write,函数 *,/,read : my_read,/* read,函数 *,/,write: my_write,/* write,函数 *,/,ioctl: my_ioctl,/* ioctl,函数 *,/,;,用上面声明的各函数声明文件操作结构,file_operations,。,60,嵌入式操作系统(Linu进程及设备驱动程序),int my_init(void),int res = register_chrdev(DEV_MAJOR,DEV_NAME,if(res 0) major = res;,printk(My device register success !n);,return 0;,61,嵌入式操作系统(Linu进程及设备驱动程序),int my_cleanup(void),unregister_chrdev(major,DEV_NAME);,printk(My device release success !n);,return 0;,module_init(my_init);,module_exit(my_cleanup);,MODULE_LICENSE(GPL);,62,嵌入式操作系统(Linu进程及设备驱动程序),傻瓜步骤,设计驱动程序,1.1,实现各个文件操作函数,1.2,声明函数指针数组,1.3,完成初始化函数,并向系统注册。完成清除函数。,建立设备文件节点,mknod /dev/testdev c xxx 0,设计测试应用程序,63,嵌入式操作系统(Linu进程及设备驱动程序),傻瓜步骤,加载驱动程序,insmodchar_dev.o,运行应用程序进行测试,卸载驱动程序,rmmodchar_dev,64,嵌入式操作系统(Linu进程及设备驱动程序),谢谢!,65,嵌入式操作系统(Linu进程及设备驱动程序),
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!