为什么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. oracle的db link

    cd $ORACLE_HOME/network/admin vi tnsnames.ora 添加 CCPBS_19 =  (DESCRIPTION =    (ADDRESS_LIST =      ...

  2. 基于jQuery垂直多级导航菜单代码

    基于jQuery垂直多级导航菜单代码是一款黑色风格的jQuery竖直导航菜单特效下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <ul class="ce&q ...

  3. jsp----标签编程(JSTL)

    标签编程简介 JSP的开发是在HTML代码中嵌入了大量的Java代码,但是这样一来会使得JSP页面中充满了Java程序,修改或维护起来非常的不方便, 定义一个简单的标签----空标签 要想实现一个标签 ...

  4. vi/vim 中如何在每行行首或行尾插入指定字符串

    行首 :%s/^/your_word/ 行尾 :%s/$/your_word/ 按键操作: 注释:ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入 ...

  5. php的变量引用与销毁机制

    在php中,符号"&"表示引用. 1.看看不引用的情况是这样子: $a  = "hello world";//定义一个变量,下面赋值给$b $b = $ ...

  6. Android keytool 生成keystore与给APK签名

    http://www.tttabc.com/android/keytool-keystore-jarsigner-apk.htm

  7. 教你如何禁用U盘、屏蔽USB端口的三种方法

    如果想禁止所有U盘的使用,则可以通过修改注册表来实现. 打开”运行“对话框,输入命令“Regedit”进入注册表界面.   依次展开“HKEY_LOCAL_MACHINE”→“SYSTEM”→“ Cu ...

  8. MacBook如何用Parallels Desktop安装windows7/8

    虽然MacBook真的很好用,不过在天朝的国情下,有很多软件还是仅支持IE和windows系统下才有.所以有必要为自己的MacBook装一个windows版本的系统,之前试过用Boot Camp来建立 ...

  9. Android NDK: Application targets deprecated ABI(s): armeabi Open File

    Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi Error:(82) Android NDK: Suppo ...

  10. R语言使用RMySQL连接及读写Mysql数据库 测试通过

    R语言使用RMySQL连接及读写Mysql数据库 简单说下安装过程,一般不会有问题,重点是RMySQL的使用方式. 系统环境说明 Redhat系统:Linux 460-42.6.32-431.29.2 ...