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,布布扣,bubuko.com

时间: 2025-01-09 06:51:44

UART Receive FIFO and Receive Timeout的相关文章

UART

A Universal Asynchronous Receiver and Transmitter (UART) in Exynos 4412 SCP provide four independent Exynos 4412 SCP 的UART提供了4个异步串口通道(ch0~3).还提供的ch4专用通道给GPS.channels with asynchronous and serial input/output (I/O) ports for general purpose (Ch0 to 3)

Software UART, Timer, PWM, External Interrupt

How can you add extra hardware UARTs to a 32bit TMS470 ARM7-based microcontroller at zero cost? Solution: Designers can use the high-end timer (HET) peripheral found on all Texas Instruments ARM7-based, 32-bit TMS470 microcontrollers to implement add

进程间通信(5) - 命名管道(FIFO)

1. 前言 本篇文章的所有例子,基于RHEL6.5平台.前一篇文章介绍了匿名管道.点此链接. 2.介绍 管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中.这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,

封装Socket.BeginReceive/EndReceive以支持Timeout

Socket .NET中的Socket类提供了网络通信常用的方法,分别提供了同步和异步两个版本,其中异步的实现是基于APM异步模式实现,即BeginXXX/EndXXX的方式.异步方法由于其非阻塞的特性,在需考虑程序性能和伸缩性的情况下,一般会选择使用异步方法.但使用过Socket提供的异步方法的同学,应该都会注意到了Socket的异步方法是无法设置Timeout的.以Receive操作为例,Socket提供了一个ReceiveTimeout属性,但该属性设置的是同步版本的Socket.Rece

第三十六课 Spark之TaskScheduler Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详

</pre></h2><div><p>本节课内容:</p><p>1.     TaskSchedulerBackend与SchedulerBackend</p><p>2.     FIFO与FAIR两种调度模式</p><p>3.     Task数据本地性资源的分配</p></div><h3>一.Scheduler运行过程(Spark-shell角度)

Uart,IIC和SPI的区别

1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基本都用于调试. 主机和从机至少要接三根线,RX.TX和GND.TX用于发送数据,RX用于接受数据(收发不是一根线,所以是全双工方式).注意A和B通信A.TX要接B.RX,A.RX要接B.TX(A用TX发B当然要用RX来收了!) 如果A是PC机,B是单片机,A和

UART、SPI、IIC

UART, SPI, IIC的详解及三者的区别和联系 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基本都用于调试. 主机和从机至少要接三根线,RX.TX和GND.TX用于发送数据,RX用于接受数据(收发不是一根线,所以是全双工方式).注意A和B通信A.TX要接B.RX,A.RX要接B.TX(A用TX发B当然要用RX来收了!) 如果A是PC机,B

mini2440系统引导(五)串口UART

S3C2440A 的通用异步收发器(UART)配有 3 个独立异步串行 I/O(SIO)端口,每个都可以是基于中断或基于 DMA 模式的操作.换句话说,UART 可以通过产生中断或 DMA 请求来进行 CPU 和 UART 之间的数据传输.UART 通过使用系统时钟可以支持最高 115.2Kbps 的比特率. uart中断触发的时机 UART LINE控制寄存器ULCON,用于控制uart的奇偶校验模式选择,停止位长度,以及一次发送的数据个数设定. UART 控制寄存器UCON,用于设定是否启用

STM32有关CAN的结构体

这是与can有关的结构体及注释:typedef struct{  CAN_TypeDef                 *Instance;  /*!< Register base address          */---这是寄存器的基本地址 CAN_InitTypeDef             Init;       /*!< CAN required parameters        */这是初始化相应的参数 CanTxMsgTypeDef*            pTxMsg;