UART Receive FIFO and Receive Timeout
为什么UART要有FIFO?
现代的CPU运转速度越来越快。UART的波特率通常达不到10M,在没有FIFO的情况下。每次填充数据给UART 或者 从UART取数据都会占用CPU的时间。这是极大的浪费。
因而UART在硬件上设置了FIFO用作数据发送和接受的缓冲区。
每次CPU要填充数据,把数据填充到UART的TX FIFO里面去了,每次CPU要取数据,从UART的RX FIFO把数据取出来。总之。FIFO作为缓冲区的存在减轻了CPU的负担。
有了FIFO后RX对数据的处理是如何的?
一般而言,当RX FIFO 接受到数据达到 RX FIFO设置的触发级别时。产生一个中断给CPU,CPU进入中断处理函数将数据取出来。考虑到这种一种情况,假设有一次传输的数据不是RX FIFO触发级别的整数倍的时候。就会造成最后的那部分数据够不到RX FIFO的触发级别。怎么办,RX FIFO的这部分数据还能取出来吗?
以下考虑两种方法:
1, 将RX FIFO触发级别设置成1。这样每次RX FIFO接受到一个数据就会触发一个中断,不可能存在RX FIFO的数据不够触发级别的情况,因而仅仅要RX FIFO中仅仅要有数据,CPU都能知道并能进行对应的处理。可是这样和没有FIFO差别大吗?非常小。CPU的负载太重。每接受一个数据都会产生一个中断。
2,设置RX timeout中断,通过使能该中断,并设置一个timeout值用以确定自从上次接受到数据为止的多长时间里面再也接受不到数据的时候产生RX timeout中断。
眼下我们公司的UART的RX timeout中断应该有些问题,使能timeout中断后,在UART没有接受到不论什么数据的时候,它依旧以一定的时间产生这个timeout中断,这是不正常的。
# date && cat /proc/interrupts
Fri Jan 2 04:20:52 UTC 1970
CPU0
0: 1680 SIRFINTC sirfsoc_timer0
6: 3 SIRFINTC SGX ISR
8: 0 SIRFINTC prima2-dsp
10: 1 SIRFINTC ci13xxx_sirf
11: 0 SIRFINTC ci13xxx_sirf
12: 0 SIRFINTC sirfsoc_dma
13: 35 SIRFINTC sirfsoc_dma
14: 0 SIRFINTC sirfsoc-vip
18: 22799 SIRFINTC sirfsoc-uart
24: 26 SIRFINTC b00e0000.i2c
25: 13 SIRFINTC b00f0000.i2c
30: 28322 SIRFINTC SIRFSOC-FB
32: 0 SIRFINTC sirfsoc_pwrc_int
33: 0 SIRFINTC sirfsoc_tsc
34: 0 SIRFINTC sirfsoc_adc
38: 8035 SIRFINTC mmc0, mmc1
39: 52 SIRFINTC mmc2, mmc3
52: 0 SIRFINTC sysrtc.11
128: 0 sirf-gpio-irq ft5x0x_ts
129: 0 sirf-gpio-irq extcon-gpio
IPI0: 0 CPU wakeup interrupts
IPI1: 0 Timer broadcast interrupts
IPI2: 0 Rescheduling interrupts
IPI3: 0 Function call interrupts
IPI4: 0 Single function call interrupts
IPI5: 0 CPU stop interrupts
IPI6: 0 CPU backtrace
Err: 0
# date && cat /proc/interrupts
Fri Jan 2 04:21:46 UTC 1970
CPU0
0: 1729 SIRFINTC sirfsoc_timer0
6: 3 SIRFINTC SGX ISR
8: 0 SIRFINTC prima2-dsp
10: 1 SIRFINTC ci13xxx_sirf
11: 0 SIRFINTC ci13xxx_sirf
12: 0 SIRFINTC sirfsoc_dma
13: 35 SIRFINTC sirfsoc_dma
14: 0 SIRFINTC sirfsoc-vip
18: 25674 SIRFINTC sirfsoc-uart
24: 26 SIRFINTC b00e0000.i2c
25: 13 SIRFINTC b00f0000.i2c
30: 31779 SIRFINTC SIRFSOC-FB
32: 0 SIRFINTC sirfsoc_pwrc_int
33: 0 SIRFINTC sirfsoc_tsc
34: 0 SIRFINTC sirfsoc_adc
38: 8085 SIRFINTC mmc0, mmc1
39: 52 SIRFINTC mmc2, mmc3
52: 0 SIRFINTC sysrtc.11
128: 0 sirf-gpio-irq ft5x0x_ts
129: 0 sirf-gpio-irq extcon-gpio
IPI0: 0 CPU wakeup interrupts
IPI1: 0 Timer broadcast interrupts
IPI2: 0 Rescheduling interrupts
IPI3: 0 Function call interrupts
IPI4: 0 Single function call interrupts
IPI5: 0 CPU stop interrupts
IPI6: 0 CPU backtrace
Err: 0
能够看到它一分钟产生了2000+个中断,太不正常。
通过调查学习发现:
1, 什么时候才会有RX timeout中断
- 使能了RX tiemout中断和设置了timeout的值
- RX FIFO 数据非空。而且在设定的时间内没有接受到新的数据且规定时间内RX FIFO的数据并没有发生被读空。它才产生RX timeout中断
2。什么时候清空该中断
- 进入中断处理函数,清理该中断
- 在中断处理函数中将RX FIFO的数据取至空
所以通过设置RX timeout中断和设置RX threshold中断。能够有效的应对IO方式的数据接受工作。
- 通过threshold中断搬运数据
- 通过timeout中断搬运数据
UART Receive FIFO and Receive Timeout的更多相关文章
- 什么是UART中的FIFO
FIFO是先进先出缓冲区的意思,即串口接收到的数据可以先进入FIFO,不必马上进入中断服务程序接收,这样可以节省CPU时间.对于发送数据也一样可以把要发送的数据一起写入FIFO,串口控制器按照写入的顺 ...
- [WF4.0 现实] WF4.0 Receive && Send
写这篇博客的目的正是由于这个receive和send使用一直很困惑,有应用程序的多个实例,但整体感觉很模糊认识.每一次遇到,再要弄清楚.如今将这send和receive结合我们之前做的实例(未使用WC ...
- Software UART, Timer, PWM, External Interrupt
How can you add extra hardware UARTs to a 32bit TMS470 ARM7-based microcontroller at zero cost? Solu ...
- 七、UART
7.1 介绍 UART(Universal Asynchronous Receiver Transmitter),通用异步收发器,用来传输穿行数据时 UART 之间以全双工方式传输数据,连线方法只有 ...
- JZ2440 裸机驱动 第11章 通用异步收发器UART
本章目标: 了解UART原理: 掌握S3C2410/S3C2440中UART的使用 11.1 UART原理及UART内部使用方法 11.1.1 UART原理说明 UART用于传输串行数据: ...
- S3C2440—5.UART的使用
文章目录 一.S3C2440中的UART介绍 1.1 电平匹配 1.2 UART数据帧与波特率 1.3UART框图 二.UART的配置 2.1 UART引脚的配置 2.2 波特率的配置 2.3 数据帧 ...
- 封装Socket.BeginReceive/EndReceive支持Timeout简介
.NET中的Socket类提供了网络通信常用的方法,分别提供了同步和异步两个版本,其中异步的实现是基于APM异步模式实现,即BeginXXX/EndXXX的方式.异步方法由于其非阻塞的特性,在需考虑程 ...
- UART, SPI, IIC的详解及三者的区别和联系
UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基 ...
- 封装Socket.BeginReceive/EndReceive以支持Timeout
Socket .NET中的Socket类提供了网络通信常用的方法,分别提供了同步和异步两个版本,其中异步的实现是基于APM异步模式实现,即BeginXXX/EndXXX的方式.异步方法由于其非阻塞的特 ...
随机推荐
- vs2015利用python加载dll调试配置
python调用dll相对而言比较方便,写个脚本调试轻松工作,快乐生活. python脚本 from ctypes import * import time # 脚本挂起 input() # load ...
- 基于jquery鼠标点击图片翻开切换效果
基于jquery鼠标点击图片翻开切换效果是一款基于jQuery+CSS3实现的点击图片切换特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class=&quo ...
- corntab被黑记录
多出来的corntab 最近服务器经常出现负载过高的情况,经过运维排查,出现了一个corntab定时任务 不是开发的锅,别背 一开始运维认为是这个定时任务是我们开发的. 排查后,明确了服务器是被黑了. ...
- WPF 系列学习
WPF CheckBox 自定义样式 给Button设置ToolTip 圆角Button 样式
- Ansible 进阶技巧
原文 http://www.ibm.com/developerworks/cn/linux/1608_lih_ansible/index.html?ca=drs- 简介 Ansible 是一个系 ...
- C# 通过反射获取MVC Controller里的类名,方法名,参数列表,返回值类型,Description描述,自定义Attribute
需要反射的DLL里的一个类: namespace ElegantWM.WebUI.Areas.Admin.Controllers { [Description("功能模块管理")] ...
- RavenDb学习(二)简单的增删查改
在上一节当中已经介绍了RavenDb的文档设计模式,这一节我们要具体讲一讲如何使用api去访问RavenDb .连接RavenDb var documentStore = new DocumentSt ...
- 【嵌入式】——对#define GPBCON (*(volatile unsigned long*)0x56000010)的理解
#define GPBCON (*(volatile unsigned long*)0x56000010) 1:volatile 当计算机需要一个数值的时候,会先把内存中的值读取到寄存器,然后下次在使 ...
- 制作nodejs项目镜像,实现docker下的快速部署
前言 前面的文章<centos7+ docker1.12 实践部署docker及配置direct_lvm>中,已经实践了如何在centos7下安装,配置docker, 所以接下来就打算去制 ...
- 使用Photoshop实现弹簧字效果
一.准备工作 软件环境:PhotoshopCS6 目的:使用路径实现弹簧字效果 二.实验步骤 1,新建画布 2,背景改为黑色,快捷键 Alt+Delete 3,键入文字,发现文字显示不出来,这时选择左 ...