为什么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. java 多线程 29 :多线程组件之 Exchanger

    Exchanger Exchanger,从名字上理解就是交换.Exchanger用于在两个线程之间进行数据交换,注意也只能在两个线程之间进行数据交换.线程会阻塞在Exchanger的exchange方 ...

  2. NSURLConnection的Get\Post方法

    习惯了用AFNetworking来处理网络请求,这次试试苹果源生控件的处理方式~~ #import "ViewController.h" @interface ViewContro ...

  3. spring集成RabbitMQ配置文件详解(生产者和消费者)

    1,首先引入配置文件org.springframework.amqp,如下: <dependency> <groupId>org.springframework.amqp< ...

  4. sqlserver 目录名称无效解决办法

    问题描述: 1.sqlserver 打开表提示:目录名称无效 2.在执行sql语句时提示:在执行批处理时出现错误.错误消息为: 目录名无效 3.所有的数据库都存在1跟2的问题 问题分析: 1.操作系统 ...

  5. MVC LinqToSql Json DbComparisonExpression 需要具有可比较类型的参数。

    需求是:使用post方式传入Controller一个id,然后返回给前台一个Json.突然就报了这个错误,折腾了俩小时, 发现是linq to sql 的语法错了

  6. Web基础 HTML CSS JS JQuery AJAX

    1. Web基础 网页的骨骼HTML 什么是HTML超文本标记语言:Hyper Text Markup Language 这都不重要,重要的是:HTML是Web网页的基本组成部分HTML中定义的元素, ...

  7. java二维码的生成与解析代码

    二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或 ...

  8. RecyclerView 输出的和排版的不一样

    遇到过这样一种情况,就是RecyclerView加载出来的和看到Android Studio里的不一样 原因是: @Override public ViewHolder onCreateViewHol ...

  9. Functions: C++'s Programming Modules

    在这一章中要学习以下内容: 函数基础 函数原型 通过value向函数传递参数 设计处理数组的函数 使用const指针参数 设计函数处理文本字符串 设计函数处理结构体 设计函数处理string类型的对象 ...

  10. Mongo分片集群脚本

    bash大法好啊,一键玩mongo. 我的mongo版本是:MongoDB shell version v4.0.2 这里准备为大家献上Mongo创建分片和可复制集的脚本,以及在部署的时候踩的坑. 分 ...