ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:479.18KB ,
资源ID:10867973      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10867973.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于arm和uclinux多串口通讯的设计与实现3图文.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于arm和uclinux多串口通讯的设计与实现3图文.docx

1、基于arm和uclinux多串口通讯的设计与实现3图文基于 AR M 和 uClinux 多串口通讯的设计与实现 3王 欣 罗志祥 沈 光(华中科技大学光电子科学与工程学院 武汉 430074摘 要 以 AR M7嵌入式处理器 S3C44B0X 、 TI (T L16C752B 为硬件开发 平台 , 设计基于 uClinux 。关键词 AR M uClinux 串行设备驱动 中图分类号 TP316. 891 引言通用异步接收发送芯片 UART 产生于上个世 纪 70年代 , 是第一块大规模集成电路 。 1981年的 推出的 I B M PC 采用了 8250UART 芯片与外设进 行数据通信

2、, 直到上个世纪末 , UART 一直是 PC 中 最主要的串行通信接口 。嵌入式系统的多串口扩展的应用范围很广 。 它可以用来做多串口服务器 /多串口卡 , 工业 /自动 化现场 RS -485控制 , 使用 CDMA /GPRS MODE M 的无线数据传输 , 车载信息平台 /车载 GPS 定位系 统 , 远传自动抄表 (AMR 系统 , 税控 P OS/银行终 端等金融机具 , DSP 数据采集和传输系统等 。 本文给出了系统的多串口扩展完整硬件和驱 动解决方案 。 该方案对于多串口扩展应用以及以 L inux/uClinux类的操作系统为基础的驱动开发有 一定的指导意义和参考价值 。

3、2 硬件方案设计目前嵌入式处理器常见的有 AR M 、 Po werPC 、 M I PS 、 Mot or ola 68K 、 ColdFire (冷火 等 , 但 ARM 占 据了绝对主流 。由于低端市场上 AR M7/9型嵌入 式处理器非常火爆 , 本文就选用了其中一种流行的 ARM7型处理器 S3C44B0X 作为硬件开发平台 。 因为处理器 S3C44B0X 不带内存管理单元 MMU (无内存分页和地址映射机制 , 所以不能使用虚拟 内存 , 所以选用支持无存储管理单元微处理器的 uClinux 操作系统作为软件驱动开发平台 。截止到目前 , 全球范围内有超过 40种 UART 芯片

4、可以选择 , 大多数 UART 芯片是以计算机总线 转换 UART 为应用基础的 , 其管脚 、 寄存器基本相 同 。 这就使得 UART 芯片有很好的通用性 。本文 选用了其中较复杂的通用异步接收发送 (UART 芯片 T L16C752B 来扩展异步串行通讯口 。2. 1 UART 芯片 T L16C752B 工作原理图 1 T L16C752B 功能模块图 1T L16C752B 芯片与 UART 芯片 ST16C2550引 脚兼容 , 使用外部晶振时有高达 3Mbp s 的波特率 , 内置两套 UART 系统 , 每套都能独立工作 , 具有可 选的流控功能等 。T L16C752B 具

5、有 64字节发送 /接收 F I F O , 收 、 发 F I F O 的触发等级可通过软件编程实现 , 能减少 对 CP U 中 断 次 数 , 提 高 芯 片 收 发 效 率 。 T L16C752B 芯片功能模块如图 1所示 。2. 2 接口电路设计处理器 S3C44B0X 2与 T L16C752B 之间的硬 件连接如图 2所示 , D0D7通过总线收发芯片 S N74LVC16245A 连接 CP U 数据总线的低 8位 , 是441 计算机与数字工程 第 35卷 3收到本文时间 :2006年 9月 20日作者简介 :王欣 , 男 , 硕士研究生 , 研究方向 :嵌入式系统 、 数

6、字图像处理 。 罗志祥 , 男 , 副教授 , 硕士生导师 , 研究方 向 :宽带光通信 , 传感器网络 。 沈光 , 男 , 硕士研究生 , 研究方向 :嵌入式系统 。UART 的 数 据 输 入 与 输 出 通 道 , 其 中 S N74LVC16245A 是用来延时和增强数据总线驱动能力 ; 片选 CS A 、 CS B 连接 Bank4和 Bank5的引脚 nCGS4、 nGCS5, 这两个片选可以确定 2个 UART 端 口的起始地址 , 分别是 0x08000000、 0x0a000000。 即高位地址部分已固定 , 而片内寄存器的地址主要 由地址低 3位 A0A2确定 。只有在片

7、选信号和 地址信号都有效时 , 才能对片内相应的寄存器进行 正常读写 。 要注意的是 , Bank4和 Bank5的控制寄 存器的设置要参考 T L16C752B 图 2 S3C44B0X 与 T L16C752B 硬件连接图采用中断方式通知 CP U 接收到新的字符或字 符已发送 , 这样可以提高系统的实时性 。 这里中断 引脚 I N T A 、 I N T B 直接连接 S3C44B0X 的外部中断 引脚 EX I N T2EX I N T3。接入 T L16C752B 的外接 时钟频率最好是使用的波特率的倍数 。本文使用 的是 11. 0592M 的外部时钟 , 输出的的串口波特率 是

8、 115200。 T L16C752B 内部寄存器的映射表及访 问方法在参考文献 1中可查到 。3 串行设备驱动程序设计3. 1 uClinux 系统内核架构图 3 uClinux 内核架构 (字符型设备 设备驱动程序是操作系统内核与机器硬件之间的接口 。 它为应用程序屏蔽了硬件的细节 。在 应用程序看来 , 硬件设备只是一个设备文件 , 应用 程序可以像操作普通文件一样对硬件设备进行操 作 。 而事实上 , 对硬件的所有实际操作都是由用户 空间的应用程序调用内核空间的驱动程序来完成 操作的 。 在 uClinux (本文使用 2. 4. 20 中 :、 网络接口型 。 其中字 , (比如文件

9、 一样被访问 。 open 、 cl ose 、 read 和 write 等系统调用 , 如图 3所示 。 3. 2 串行设备驱动的分析在 uClinux 内核中提供了访问串行硬件的设 备 , 通常叫 tty 设备 (tty 是 Teletype 的简写 , 也可称 为终端设备 , 现在用来表示任何基于字符的数据 终端 。 uClinux 提供了三类 tty 设备 :串行设备 (有 的书中干脆称为串口 , 控制台 , 伪终端 (p ty 。其 中 , 后两者的命名只是因为从程序员的角度来看 , 它们和典型的 tty 设备 (即串行设备 以相似的方式工作 , 且它们的驱动程序已经被编写好了 ,

10、 而且 可能也不必为这两类 tty 驱动程序编写其他的驱动 程序 。 这使得任何使用 tty 核心与用户和系统交互 的新驱动程序都可以被看成是串行设备驱动程序 。 本文所设计的硬件就是典型的串行设备 。下面将 详细介绍 tty 类设备驱动的层次结构和串行设备驱 动的实现 。3. 2. 1 TTY 驱动的层次结构在 uClinux 系统中 , tty 驱动根据它们与设备的 关系 , 以及在执行流程中的位置 , 可以分为 tty 驱动 程序和与上层直接联系的 tty 驱动接口程序 。 可以 用图 4示意图来表示这种控制关系 。各种串行设 备都有自己的 tty 驱动程序来控制硬件 。在 tty 驱

11、动程序上层接口中 , tty 驱动程序的核心紧挨在标 准字符设备驱动层之下 , 并提供了一系列的功能 , 作为接口被终端类型设备使用 。内核负责控制通 过 tty 设备的数据流 , 并且格式化这些数据 。这使 得 tty 驱动程序把重点放在处理流向或者流出硬件 的数据上 , 而不必重点考虑使用常规方法与用户空 间的交互 。 为了控制数据流 , 有许多不同的线路设 置 (line disci p line 可虚拟地 “ 插入 ” 任何的 tty 设备 上 , 这由不同的 tty 线路设置驱动程序实现 。tty 线路设置对于 tty 驱动程序来说是不透明的 。 驱动程序不能直接与线路设置通信 ,

12、甚至不知 541第 35卷 (2007 第 8期 计算机与数字工程 道它的存在 。 在某种意义上讲 , 驱动程序的作用是 将发送给它的数据格式化成硬件能理解的格式 , 并 从硬件那里接收数据 。 tty 线路设置的作用就是使 用特殊的方法 , 把从用户或者硬件那里接收的数据 格式化 。 这种格式化通常使用一些协议来完成转换 , 比如 PPP 或者是蓝牙 (B luet ooth 3 。图 4 tty 驱动层次结构图 在 tty 驱动中使用到了一些数据结构 , 这些数 据结构关联了整个 tty 驱动的各个层次 。 如图 4和 图 5所示 , 这些数据结构有如下几种 。 在终端驱动 程序上层接口

13、tty_i o . c 文件中定义了终端驱动程 序的文件操作结构 file_operations 实例 -用于和用 户空间通讯 , 这是典型的字符设备的结构 , 它的每 一个成员函数都将与系统调用的 read 、 write 、 i octl 等关联起来 。 在文件中还定义了 tty_struct 结构实 例 (如图 4虚线框所示 , 它内部包含了下面的三种 结构 -它描述了通用 (或高层 tty 的属性 , 主要是 在当 tty 设备打开的时候 , tty 核心将当前特定的 tty 端口的状态保存在此结构中 。在默认线路设置模 块 n_tty. c 文件和其它文件如 ppp 协议的线路设置

14、文件 ppp_async. c 中 , 定义了 tty_ldisc 结构实例5-它列出了所有的当前线路设置的入口 。在各种串行设备的 tty 驱动程序中定义了 tty_driver结构 实例 (如图 4虚线框所示 , 它内部包含了下面的 ter m i os 结构 -用来向 tty 核心注册一个 tty 驱动程序 。 tty_driver结构中还包含所有的回调函数 , 它们被 tty 驱动程序设置 , 并被 tty 核心调用 。 这些 回调函数的实现需要调用到底层硬件控制 , 对具体 寄存器进行读写 , 完成串行设备的收发操作 。ter m i os 结构 (如下所示 -每个 tty 驱动程序

15、都包含有这样一个结构实例 , 结构中的标志集合控 制终端接口的各种特征 。用户进程就是通过 ter 2m i os 结构来设置和修改终端属性的 。struct ter m i os tcflag_tc_iflag;/3输入模式标志 3/tcflag_tc_oflag;/3输出模式标志 3/tcflag_tc_cflag;/3控制模式标志 3/tcflag_tc_lflag;/3局部模式标志 3/cc_tc_line;/3线路设置 3/cc_tc_ccNCCS;/33/;3. 2. 2tty 驱动中最重要的一 中 , tty 核心从用户那里得到将被 tty 设备的数据 , 然后把数据发送给 tt

16、y 线路设 置驱动程序 , 该驱动程序负责把数据传递给 tty 驱 动程序 。 tty 驱动程序对数据进行格式化 , 然后才 能发送给硬件 。 从 tty 硬件那里接受的数据将回溯 至 tty 驱动程序 , 然后流入 tty 线路设置驱动程序 , 接着是 tty 核心 , 最后用户从 tty 核心那里得到数据 。 有时 tty 驱动程序直接与 tty 核心通信 , tty 核 心将数据直接发送给 tty 驱动程序 , 但通常是 tty 线 路设置驱动程序修改在二者之间流动的数据3。在不同的线路设置中 , 数据的流向和处理方式 是不同的 。 例如如图 5所示 , 串行设备在默认状态 下和 ppp

17、 拨号连接建立时的数据处理方式是不同 的 , 而且数据传入的用户空间 (或是传出的用户空 间 也是不同的 。图 5中描述了串行设备驱动所 涉及的重要模块是如何注册的 (注册是为了允许 每个程序块能像内核模块一样被调用 , 以及串行 数据是如何在不同的线路设置情况下传输的 。其 中实线箭头表示串行设备驱动在默认的线路设置 下的情况下数据在不同的驱动程序文件间的流向 , 而点划线箭头描述了串行设备驱动在 ppp 拨号连 接的线路设置下的情况 。 3. 3 串行设备驱动的实现如前面所述 , 实现串行设备驱动 (即 tty 驱动 程序 , 就是要定义 tty_driver结构实例和实现结构 中的回调函

18、数 。而在 uClinux 内核中 (如图 5所 示 , 为了简化并标准化串行设备驱动的编写 , 又 在 tty 驱动程序中抽象出了一个串行核心驱动层 serial_core,其中申明了 uart_driver结构 (用来向串行核心驱动注册一个串行设备硬件控制驱动 , 并 将对串行设备硬件的一组标准控制方法接口 (供 tty_driver结构中的回调函数使用 封装在 uart_op s 6结构中 , 另外在 uart_port结构中封装了串行设备端口的相关参数 , 还对外提供了注册串行设备 硬件控制驱动的辅助函数 。6 41 王 欣等 :基于 AR M 和 uClinux 多串口通讯的设计与实

19、现 第 35卷图 5 串行设备驱动模块关联图 由于串行核心驱动 serial_core封装的大部分 的通用串行设备的操作 , 且为串行设备硬件控制驱 动提供了一组实现串行硬件控制的标准接口 , 这就 大大简化了编写此类串行设备驱动的难度 。只需 针对特定的硬件实现这一组方法和对应的中断服 务程序 , 就基本上实现了串行设备驱动 。 (如果在 某些情况下不适合使用这套标准接口 , 也可以不借 助串行核心驱动 , 而单独编写串行设备驱动 。 具体 情况请参考 L inux/uClinux 的串行设备驱动源码 。 因此 , 实现串行设备硬件控制驱动是本文编写 串行设备驱动的主要目标 。本文中所需做的

20、就只 是在串行设备硬件控制驱动程序中对端口进行注 册和实现 uart_ops 结构中提供的对端口的一组控 制方法及所需的中断服务程序 (I SR 。uart_ops 结构是串行核心驱动 serial_core和串 行设备硬件控制驱动之间的主要接口 。它包含控 制硬件的所有方法 。其中重要函数的伪码及说明 如下所示 :int (3startup (struct uart_port3port, struct uart_info 3info 重置串行设备对应端口的 F I F O 队列 ;清除对应端口中断相关的寄存器的值 ;检查对应端口线路状态寄存器的值判断 UART 是否存 在 , 如果不存在 ,

21、 则立即返回 ;抢占对应端口的中断资源 , 如果中断申请出错 , 则立即 返回 ;初始化对应端口的状态 ;使能对应的端口中断并再次重置 F I F O 队列 ;该函数在接收字符时调用并使能端口 。此外 , 还有 void (3shutdown (struct uart_port 3port, struct uart_info 3inf o 函数 , 它与 startup ( 函数操作相反 , 该函数在关闭端口时调用 , 并释放 所有的中断资源 。在串行设备硬件控制驱动中还使用了串行核 心驱动提供的一些辅助函数 。如在模块初始化函 数中使用了 int uart_register_driver(s

22、truct uart_driv2 er 3drv 函数来注册一个串行设备端口 ; 在模块卸 载函数中使用了 void uart_unregister_driver(struct uart_driver3drv 函数移除串行设备端口 。 中断处理是串行设备硬件控制驱动中的重要 部分 , 当接收 F I F O 中的字符和发送 F I F O 中的字 符数到达触发等级的时候都会触发系统中断进行 处理 。为了减少中断次数 , 提高收发效率 , 在设置 端口参数时 , 设置接收 F I F O 至少有 8个字符时就 触发中断 , 设置发送 F I F O 至少有 8个空位时就触 发中断 。当注册中断服

23、务程序时 , 如“ request_irq (port -irq, handler, S A _I N TERRUPT, “ tl16c751buart_int_pr oc ” , info ; ” , 驱动将通知内 核该串行设备将使用 port -irq 对应的中断号 (本文驱动中使用的中断号是 22、 23 。 handler 指 向的是中断服务函数的地址 , S A _I N TERRUPT 说 明注册的是一个快速中断 。由于每个 UART 都分 配了一个中断 , 且 UART 收发字符都会产生中断 , 因此在中断服务函数中应对两种中断分别进行处 理 , 这可由中断标示寄存器 II R

24、的值来区分 。 其中 发送中断的操作如图 7所示 。为了解决字符型设备的外设处理速度和 CP U 的处理速度不匹配问题 , 往往需要缓冲 。一般的 7 41第 35卷 (2007 第 8期 计算机与数字工程 UART 控制器都带有不多于几十个比特的 F I F O,但这远远不够 , 还需要从主存中开辟缓冲区 , 具体大小视情况而定 。 在 tty 驱动程序中缓冲区采用的 是一种环形缓冲区 , 如图 6所示 。 当接收中断到来 后中断服务程序从 UART 的 F I F O 中读入接收的字 节 , 放入接收环形缓冲区的头 , 然后唤醒处于睡眠 状态的用户读操作 。用户读操作将接收缓冲区尾 部的数

25、据传给用户空间 。 当用户进程想读操作 , 而 接收缓冲区无数据时 , 用户读进程睡眠在读等待队 列上 , 直到 UART 有新的数据到来 , 断时才被唤醒。 当发送中断到来后 , , 当 用户进程想写操作 , 用户写进 程睡眠在写等待队列上 , 直到 UART 产生新的发送 中断 , 读走发送缓从区的数据时才被唤醒。当中断服务函数退出前 , 应该清除中断 。 清除 中断有两步 :一是清除 UART 端口的中断请求信 号 , 只需设置 UART 的中断使能寄存器关闭中断即 可 。 二是清除 CP U 的相应中断请求 位 , 只需对 S3C44B0X 的中断挂起寄存器相应位置 1即可 。图 6

26、接收 /发送缓冲示意图中断服务程序的伪码如下所示 :void tl16c752buart_int_pr oc (int irq , void 3dev_id , struct p t_regs3regs 清除中断请求位 ;判断该中断来自哪个 UART 端口 ; 读取该端口的中断标示寄存器 ;if (端口的 tty_struct结构不存在或中断未发生 退出本程序 ;s witch (中断标示寄存器 case 发送中断 :调用中断发送函数 ;break; case 接收中断 :case 接收超时中断 :调用中断接收函数 ;break; default:break; 中断发送函数的流程图如图 7所示

27、 :图 7 中断发送函数中断接收函数与中断发送函数类似 , 只不过函数中还要检查并记录接收字符是否有错 , 若果有 错 , 字符应被忽略掉 。4 结束语在嵌入式领域中 , 随着嵌入式操作系统的逐渐 完善 , 可靠性和稳定性的提高 , 加上嵌入式操作系统 的源代码公开性 , 使我们可以根据实际需求来定制 内核 , 开发驱动支持新产品 , 设计应用程序也更有效 率。 可以预见随着微处理器及各种接口价格的进一 步降低和嵌入式操作系统的发展、 成熟 , 将会出现大 量有着低廉价格和高速接口的新产品及系统。参 考 文 献1TI company . T L16C752B Data Sheet E B /O

28、L.www . ti .com. cn, 2000, 82李岩 , 荣盘祥 . 基于 S3C44B0X 嵌入式 uClinux 系统原理及应用 M, 清华大学出版社 , 2005, 13JONATHAN Corbet, ALESS ANDRO Rubini,GREGKr oah -Hart m an . L inux Device D rivers (Third Editi on M.O R eilly &A ss ociates, 2005, 24毛德操 , 胡希明 . L inux 内核源代码情景分析 (下册 M.浙江大学出版社 , 2001, 95ALESSANDRO Rubini . Serial D riversE B /OL.htt p:/www . linux . it/rubini/docs/serial/serial . ht m l, 20016GREG Kr oah -Hart m an . The Serial D river Layer E B /OL .htt p:/www. linuxj ournal . com /article/6331,20028 41 王 欣等 :基于 AR M 和 uClinux 多串口通讯的设计与实现 第 35卷

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1