为什么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的更多相关文章

  1. 什么是UART中的FIFO

    FIFO是先进先出缓冲区的意思,即串口接收到的数据可以先进入FIFO,不必马上进入中断服务程序接收,这样可以节省CPU时间.对于发送数据也一样可以把要发送的数据一起写入FIFO,串口控制器按照写入的顺 ...

  2. [WF4.0 现实] WF4.0 Receive && Send

    写这篇博客的目的正是由于这个receive和send使用一直很困惑,有应用程序的多个实例,但整体感觉很模糊认识.每一次遇到,再要弄清楚.如今将这send和receive结合我们之前做的实例(未使用WC ...

  3. Software UART, Timer, PWM, External Interrupt

    How can you add extra hardware UARTs to a 32bit TMS470 ARM7-based microcontroller at zero cost? Solu ...

  4. 七、UART

    7.1 介绍 UART(Universal Asynchronous Receiver Transmitter),通用异步收发器,用来传输穿行数据时 UART 之间以全双工方式传输数据,连线方法只有 ...

  5. JZ2440 裸机驱动 第11章 通用异步收发器UART

    本章目标: 了解UART原理: 掌握S3C2410/S3C2440中UART的使用 11.1 UART原理及UART内部使用方法 11.1.1 UART原理说明     UART用于传输串行数据:   ...

  6. S3C2440—5.UART的使用

    文章目录 一.S3C2440中的UART介绍 1.1 电平匹配 1.2 UART数据帧与波特率 1.3UART框图 二.UART的配置 2.1 UART引脚的配置 2.2 波特率的配置 2.3 数据帧 ...

  7. 封装Socket.BeginReceive/EndReceive支持Timeout简介

    .NET中的Socket类提供了网络通信常用的方法,分别提供了同步和异步两个版本,其中异步的实现是基于APM异步模式实现,即BeginXXX/EndXXX的方式.异步方法由于其非阻塞的特性,在需考虑程 ...

  8. UART, SPI, IIC的详解及三者的区别和联系

    UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基 ...

  9. 封装Socket.BeginReceive/EndReceive以支持Timeout

    Socket .NET中的Socket类提供了网络通信常用的方法,分别提供了同步和异步两个版本,其中异步的实现是基于APM异步模式实现,即BeginXXX/EndXXX的方式.异步方法由于其非阻塞的特 ...

随机推荐

  1. mysql性能优化(一)

    随着项目的上线,关注开始关注服务器的运维和优化,其中后端数据库状态查看和参数调优是比不可少的一步,可能用到的两个小工具: mysqltuner.pl tuning-primer.sh 参考: [1] ...

  2. C#学习笔记(23)——C#将PPT批量转为JPG(aspose方法)

    说明(2017-7-31 18:30:25): 1. 最主要的是下载到aspose的破解文件,我在这里下载的http://www.lenosoft.net/down/10205.htm,如果不差钱可以 ...

  3. JavaScript高级 面向对象(11)--对象的动态特性-关联数组用法

    说明(2017.4.2): 1. 对象的动态特性: (1)在js中,一个对象需要属性,就可以利用“对象名.属性 = 值”的方式为其添加,只要赋值成功,对象就新增这个属性. (2)对象属性的访问形式: ...

  4. 插入中国所有省和市的SQL语句--以后用

    需要做根据省市过滤查询的,不得已写入数据库,这个留着方便以后用. 首先创建两张表 drop database if exists BSM; create database BSM; use BSM; ...

  5. java判断是移动端还是pc端

    // \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔), // 字符串在编译时会被转码一次,所以是 "\\b" // \B 是单词内部逻辑间隔(连着的 ...

  6. busybox tar 命令支持 tar.gz

    原始的 busybox 里面的 tar 命令不支持 tar.gz 解压 在 busybox-menuconfig 里面加入 下面的选项即可

  7. 是否要学点GUI编程

    传统GUI编程相对于Web前端编程来说,应该要复杂点.以MVC的要求来看,大多数现有系统代码可能都不达标.但在Web领域,通过框架的约束,是个人都知道要MVC. MVC有Classic MVC和Web ...

  8. [serial]基于select/poll/epoll的串口操作

    转自:http://www.cnblogs.com/darryo/p/selectpollepoll-on-serial-port.html In this article, I will use t ...

  9. 如何修改被hosts.deny禁止访问的IP

    自己的密码忘记了,重试了很多次被加入了黑名单. 如果仅仅清空 /etc/hosts.deny 文件内容,你会发现过一会自己的IP又进入里面了. 其实系统后台会定期自动扫描一些文件,然后将这些异常的IP ...

  10. c# 自动计算字符串的宽度

    测试代码: string str = "字符串"; var width = TextRenderer.MeasureText(str, this.Font); var width2 ...