我是靠谱客的博主 优雅彩虹,最近开发中收集的这篇文章主要介绍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列是历史中断次数
34列中断名称

解决方法
如果是多核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内核中串口的收发流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部