为什么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. Pythonic版二分查找

    [本文出自天外归云的博客园] 前提:升序数组,待查元素在数组中. 二分查找:就是一个递归函数c.待查元素a,当前数组中位数b,如果b=a则返回b的索引,b>a则在b左侧的子数组中调用函数c,否则 ...

  2. " java.lang.NoSuchFieldError: HBASE_CLIENT_PREFETCH_LIMIT

    0down vote This issue is caused by the version of hbase-client in your pom differing from the jar ve ...

  3. 【转】使用scipy进行层次聚类和k-means聚类

    scipy cluster库简介 scipy.cluster是scipy下的一个做聚类的package, 共包含了两类聚类方法: 1. 矢量量化(scipy.cluster.vq):支持vector ...

  4. Chrome 插件编写日记

    Chrome 插件,你可以理解为打开了一个网页,但是里面只有前端语言,JavaScript, HTML + css 但是有一点区别的是,它是有一个名字为 manifest.json 的配置文件的,里面 ...

  5. MapReduce教程(一)基于MapReduce框架开发<转>

    1 MapReduce编程 1.1 MapReduce简介 MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,用于解决海量数据的计算问题. MapReduce分成了两个部分: ...

  6. MSSQL跨服务器查询

    1.因为此功能服务器安全配置的一部分而被关闭,所以我们先开启 reconfigure reconfigure 2.如果需要关闭,执行 reconfigure reconfigure 3.查询语句 SE ...

  7. 解决:According to TLD or attribute directive in tag file, attribute value does not accept any express。

    http://blog.csdn.net/lzblog/article/details/22076893 ——————————————————————————————————————————————— ...

  8. 标签<view>文字自动换行

    <view style='word-break:break-all;'>{{con.blog}}</view>

  9. Android开发 sharesdk分享微信/朋友圈的时候只显示文字,不显示链接

    问题:分享的时候只将分享的content分享出去了,连标题及链接都没有分享出去. 原因:没有配置image导致. 解决办法: 在  showShare 方法里面添加配置: if(ImageUrlOrP ...

  10. 【转】PyCharm LicenseServer 破解

    在自己的云平台上部署了IntelliJIDEALicenseServer服务,理论上http://www.jetbrains.com的产品都可以使用,不过目前只测试了PyCharm. 大家也知道,Py ...