机智云Gokit3.X源代码分析之串口接收数据这块的机制

昨天分享了整个程序的架构,今天重点分析一下串口接收数据这块的机制
我们知道,通过串口接收数据一般有3中方式,轮询、中断以及dma。轮询模式为堵塞模式,必须要定时去查询收到的数据;中断模式为非堵塞模式,也是平时用的比较多的,但每次只能接收一个字节;还有一个比较好的方法那就是用串口的空闲中断+dma实现串口数据的接收,在接收一帧数据只需要中断一次,这样就可以接收不定长数据了。机智云这里采用的方式2,即常规的中断方式。
数据通讯采用的串口2,引脚为gpio2和gpio3,在gizwitsinit()中进行初始化
我们进去看看
上图主要初始化了一些硬件接口,并开启中断,这也是我们一般的写法,再往下看,看到一个prb的结构体,这是个什么呢,我们追踪下,下面是prb的定义
我们先来解释下环形缓冲区的原理:
环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读用户仅仅会影响读指针,而写用户仅仅会影响写指针。
这里的rbcapacity代表缓冲区的容量,head指向了读区域,tail指向了写区域,rbbuff指向缓冲区的入口地址,示意图入下
明白了结构体的定义,我们接着往下看
rbcreate(),顾名思义,此函数的作用用于创建缓冲区,将缓冲区的head/tail都指向缓冲区的首地址,那么rbcapacity和rbbuff在哪里赋值的呢?我们返回去看gizwitsinit();
看到这里我们就明白了,继续往下看
这个函数为删除缓冲区函数,将结构体里面的数据全部清零
这个函数为获取缓冲区的总容量,很好理解
接下来这个函数为缓冲区有多少数据可以读,有三种情况:
1、head和tail都指向同一个地址,可读大小为0,返回0,这种情况只会出现在缓冲区还没有数据的时候,使用之后就不会出现头尾重合的现象;
2、headtail,如下图所示,缓冲区已经写满,并且从开头处重新写了数据,可读部分为蓝灰色区域(rb_capacity(rb) - (rb->rb_head - rb->rb_tail));
接下来的函数为可写区域大小,直接用总容量rb_capacity(rb)减去可读区域大小就好了。
然后是读数据函数,从head处开始读,读取count个数据,放到data地址开始的数据区域,如下图所示,也是分为三种情况
1、headtail,且count中的数据小于从head到缓冲区尾部的个数,即小于下图中的蓝灰色,与第一种情况一样,直接复制相应内存,之后修改head指针即可。
3、head>tail,且count中的数据大于从head到缓冲区尾部的个数,即大于下图中的看灰色,这种情况我们就先把head到缓冲区尾部的数据复制到data处,再把绿色区域的复制过去,这里绿色部分并不会超过tail,写操作中做了限制。
最后是写数据函数,把从data指向的地址,写到tail指向的地址,写count个数据,返回成功写入的个数,在这里判断了要写入的数据大小要小于可写区域大小,防止数据覆盖,如下图所示,也是分为三种情况
1、head2、headtail,这个因为已经做了数据合法判断,所以直接复制数据就行。如下图所示
那么明白了串口环形buff的机制,数据是从哪里进入的呢,我们找到串口中断的入口,
可以看到中断程序非常简单,中断之后直接往缓冲区丢一个数据就行了,采用这种数据结构,大大提高了程序的稳定性,同时操作起数据来也很方便,需要的时候直接去读缓冲区数据就好了。今天就先分享这么多,下期分享机智云的协议与结构体的定义,谢谢大家!

融资数千万,深慧视加码3D视觉
年会奖品,我只想要Shokz韶音运动耳机
我国三大运营商推出了各自的网络重构规划
常见EMC器件的特性及选型分析
增加环节曝光,卡塔利亚进口超市加盟品牌寻求新的利润增长点
机智云Gokit3.X源代码分析之串口接收数据这块的机制
射灯怎么弄
美国军方相信AI将在未来的战争中帮助美国取得胜利
《拒绝内卷,伏达重新定义功率“触顶”趋势下的充电半导体技术演进路线图》
谁说没人开得起宝马?众泰牌皮尺惊现2016广州车展
德州仪器高度集成2.4GHz RF前端将低功耗无线系统覆盖范
中国移动:未来5G数字技术将催生生产生活场景的更多模式创新
OPPO Ace2的超强充电功能 成为新一代“好评收割机”
调心滚子轴承的安装与拆卸及注意事项
已下架,华为应用商店搜索不到微软OneNote App
Hashed已经筹集1.2亿美元用于资助区块链发展
谷歌计划到2030年为全球所有数据中心提供无碳能源
电视行业风险重重,华为为何还要涉险呢?
数字资产交易系统源码开发虚拟资产币币交易系统
SK海力士扭亏为盈,将持续提升盈利能力与效率