概述
一、介绍
在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.找出执行时间较长的中断处理程序,视情况来决定在它屏蔽中断时不屏蔽串口的中断。
最后
以上就是优雅彩虹为你收集整理的linux内核中串口的收发流程的全部内容,希望文章能够帮你解决linux内核中串口的收发流程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复