linux内核中串口的收发流程
一、介绍 在linux开发应用的时候,经常会碰到串口收发数据丢包,如果要排除bug就需要知道内核中串口的流程
二、串口收发流程 硬件一般会有串口fifo,存储数据,一般16byte或者32byte以减少cpu的中断次数
1)外部数据经过硬件串并转换到硬件fifo 2)硬件fifo满了以后触发中断启动dma 3)dma将fifo里面的数据搬运到软fifo(一般是一个大数组) 4)应用层平时的read,write就是直接读取的软fifo里面的数据
这个软fifo是可以配置的,配置方法参考我另外改串口fifo大小的文章
三、对于串口丢数据的排除 1)硬fifo到软fifo之间的丢失,这种一般是中断被屏蔽导致 查看方法 查看cpu中断
cat /proc/interrupts 查看系统中各个设备的中断号 cat /proc/stat 1列是中断号 2列是历史中断次数 3列 4列中断名称
解决方法 如果是多核cpu直接把串口中断绑定到另外的核
echo "2" >> /proc/irq/38/smp_affinity echo 输入的数字的各个bit为1代表使用对应的CPU,比如bit0为1代表使用CPU0,可同时绑定多个CPU。
单核cpu的 1.首先关闭uboot和内核的调试打印信息,内核和uboot的打印肯定优先与应用层,这种会导致发送丢包 2.尽量优化中断处理流程,拆分一次传输的size。 3.降低串口波特率。 4.找出执行时间较长的中断处理程序,视情况来决定在它屏蔽中断时不屏蔽串口的中断。