欢迎来到天天文库
浏览记录
ID:28242572
大小:395.50 KB
页数:19页
时间:2018-12-08
《基于linux内核的嵌入式串口通讯程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、.基于Linux内核的嵌入式串口通讯程序设计
基于Linux内核的嵌入式串口通讯程序设计摘 要本设计讨论了简易嵌入式Linux环境下的串口联网问题。在如今的工业控制领域,嵌入式设备通讯能力的优劣已经成为了一个尤为重要的评判标准,是否能够进行网络通信将是十分重要的。对于由于特殊要求而不能订制一些网络硬件的嵌入式设备来说,我们希望通过最为简单且经济的方式来解决网络问题,由此我们自然希望在尽力不改变设备原有资源的情况下给设备添加网络功能,并且将设备原先的功能所产生的冲突减到最小,选择具有普遍广泛应用的串口来实现串口联网将是十分具有现实意义的。
2、本设计通过使用虚拟一些联网必备的网络硬件,通过串口来通信的方法来完成联网的实现,具体涉及到伪网络驱动程序和串口通信程序的开发。在不保证可靠通信和吞吐量的前提下,该设计能够实现简单的网络通信,包括Telnet等。
关键字:Linux环境,串口通讯,网络通讯,嵌入式 4.串口网络通讯具体开发与实现4.1字符设备驱动程序用户空间的进程主要通过两种方式和内核空间模块打交道,一种是使用proc文件系统,另一种是使用字符设备。本文所描述的两个字符设备sendingdevice和receivingdevice事实上是内核空间和用户空间交换数据的缓存区,编
3、写字符设备驱动实际上就是编写用户空间读写字符设备所需要的内核设备操作函数[15]。为了方便对设备编程,我们还需要一个字符设备管理的数据结构,这个数据结构是用来保存字符设备的一些基本状态信息。ssize_t是一个指向函数的指针,它的作用是为伪网络驱动程序提供写字符设备数据的系统调用接口。magic字段主要是标志设备类型号的,这里没有别的特殊意义;busy字段用来说明字符设备是否是处于忙状态,buffer指向内核缓存区,用来存放读写数据;mtu保存当前可发送的网络数据包最大传输单位,以字节为单位;lock的类型是自旋锁类型spinlock_t,它实际以一个整数域作为锁,在同一时刻对同一字符
4、设备,只能有一个操作,所以使用内核锁机制保护防止数据污染;data_len是当前缓存区内保存的数据实际大小,以字节为单位;file是指向设备文件结构structfile的一个指针,其作用主要是定位设备的私有数据file->private_data。定义字符设备structed_deviceed[2],其中有一个定义ed[ED_REC_DEVICE]就是前面的recevingdevice,ed[ED_TX_DEVICE]就是相对应的sendingdevice。如果sendingdeviceED_TX_DEVICE没有数据,用户空间的read调用将被阻塞,并把进程信息放于rwait队列中。当
5、有数据的时候,kernel_write()中的wake_up_interruptible()将唤醒等待进程。字符设备的操作及其相关函数调用过程如图4.1所示。 图4.1 加载字符设备图当ed_device模块被加载的时候,eddev_module_init()调用register_chrdev()内核API注册ed_tx和ed_rec两个字符设备。这个函数定义在<linux/fs.h>。字符设备被注册成功后,内核把这两个字符设备加入到内核字符设备驱动表中。内核字符设备驱动表保留指向struct-..file_operati
6、ons的一个数据指针。用户进程在调用设备读写操作时,无需自动添加进程,通过这个指针访问设备的操作函数,structfile_operations中的域大部分是指向函数的函数指针,指向用户自己编写的设备操作函数。注意到Linux2.4.x和Linux2.2.x内核中定义的structfile_operations是不一样的。device_read()、device_write()、device_ioctl()、device_open()、device_release()就是需要用户自己定义的函数操作了,这几个函数是最基本的操作,如果需要设备驱动程序完成更复杂的任务,还必须编写其他stru
7、ctfile_operations中定义的操作。eddev_module_init()除了注册设备及其操作外,它还有初始化字符设备结构structed_device,分配内核缓存区所需要的空间的作用。在内核空间,分配内存空间的API函数是kmalloc()。下面介绍一下字符设备的主要操作例程device_open()、device_release()、device_read()、devie
此文档下载收益归作者所有