基于Linux内核嵌入式串口通讯程序的设计.doc

基于Linux内核嵌入式串口通讯程序的设计.doc

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于Linux内核的嵌入式串口通讯程序设计 P基于Linux内核的嵌入式串口通讯程序设计BR摘nbsp;nbsp; 要BR本设计讨论了简易嵌入式Linux环境下的串口联网问题。BR在如今的工业控制领域,嵌入式设备通讯能力的优劣已经成为了一个尤为重要的评判标准,是否能够进行网络通信将是十分重要的。对于由于特殊要求而不能订制一些网络硬件的嵌入式设备来说,我们希望通过最为简单且经济的方式来解决网络问题,由此我们自然希望在尽力不改变设备原有资源的情况下给设备添加网络功能,并且将设备原先的功能所产生的冲突减到最小,选择具有普遍广泛应用的串口来实现串口联网将是十分具有现实意义的。BR本设计通过使用虚拟一些联网必备的网络硬件,通过串口来通信的方法来完成联网的实现,具体涉及到伪网络驱动程序和串口通信程序的开发。在不保证可靠通信和吞吐量的前提下,该设计能够实现简单的网络通信,包括Telnet等。/P P关键字:Linux环境,串口通讯,网络通讯,嵌入式BRnbsp;BR4. 串口网络通讯具体开发与实现BR4.1 字符设备驱动程序BR用户空间的进程主要通过两种方式和内核空间模块打交道,一种是使用proc文件系统,另一种是使用字符设备。本文所描述的两个字符设备sending device和receiving device事实上是内核空间和用户空间交换数据的缓存区,编写字符设备驱动实际上就是编写用户空间读写字符设备所需要的内核设备操作函数[15]。BR为了方便对设备编程,我们还需要一个字符设备管理的数据结构,这个数据结构是用来保存字符设备的一些基本状态信息。ssize_t是一个指向函数的指针,它的作用是为伪网络驱动程序提供写字符设备数据的系统调用接口。magic字段主要是标志设备类型号的,这里没有别的特殊意义;busy字段用来说明字符设备是否是处于忙状态,buffer指向内核缓存区,用来存放读写数据;mtu保存当前可发送的网络数据包最大传输单位,以字节为单位;lock的类型是自旋锁类型spinlock_t,它实际以一个整数域作为锁,在同一时刻对同一字符设备,只能有一个操作,所以使用内核锁机制保护防止数据污染;data_len是当前缓存区内保存的数据实际大小,以字节为单位;file是指向设备文件结构struct file的一个指针,其作用主要是定位设备的私有数据file-gt; private_data。定义字符设备struct ed_device ed[2],其中有一个定义ed[ED_REC_DEVICE]就是前面的receving device,ed[ED_TX_DEVICE]就是相对应的sending device。如果sending device ED_TX_DEVICE没有数据,用户空间的read调用将被阻塞,并把进程信息放于rwait队列中。当有数据的时候,kernel_write()中的wake_up_interruptible()将唤醒等待进程。BR字符设备的操作及其相关函数调用过程如图4.1所示。 BRnbsp;BR图4.1nbsp; 加载字符设备图BR当ed_device模块被加载的时候,eddev_module_init()调用register_chrdev()内核API注册ed_tx和ed_rec两个字符设备。这个函数定义在lt;linux/fs.hgt;。BR字符设备被注册成功后,内核把这两个字符设备加入到内核字符设备驱动表中。内核字符设备驱动表保留指向struct file_operations的一个数据指针。用户进程在调用设备读写操作时,无需自动添加进程,通过这个指针访问设备的操作函数,struct file_operations中的域大部分是指向函数的函数指针,指向用户自己编写的设备操作函数。BR注意到Linux2.4.x和Linux2.2.x内核中定义的struct file_operations是不一样的。device_read()、device_write()、device_ioctl()、 device_open()、device_release()就是需要用户自己定义的函数操作了,这几个函数是最基本的操作,如果需要设备驱动程序完成更复杂的任务,还必须编写其他struct file_operations中定义的操作。eddev_module_init()除了注册设备及其操作外,它还有初始化字符设备结构struct ed_device,分配内核缓存区所需要的空间的作用。在内核空间,分配内存空间的API函数是kmalloc()。 BR下面介绍一下字符设备的主要操作例程device_open()、device_release()、device_read()、de

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档