一个嵌入式项目的小框架设计思路

功能需求:tcp通信,UDP通信,串口通信, 音频数据的编解码

用消息队列作为数据交换的中心,根据push进去的不同类型的消息作出处理
伪代码如下

main
{

  •     Step1 初始化信息

        初始化所需要的信息,类似socket 登录 账号等信息
            

  •     Step2 创建消息队列

        创建一个消息队列,定义不同的类型,基本设计方案,根据tcp一个类型 udp一个类型 串口通信一个类型,通过不同的类型将业务区分开;
        这里是可扩展的,后续需要不同的类型的业务 也可以添加不同的消息类型 来进行驱动;向我们这里面有音频数据类型 那么再定义一个音频数据类型
        来pusn 和 pop
        

  •     Step3 创建push 和 pop 线程 来进行消息的进出操作(push和pop线程 理论上都是成对的,这里有三种通信方式,那么就使用6个线程来处理消息)

        创建不同的业务线程,在这里面进行的是 各个业务push和pop操作,举个例子:tcp的操作该如何成对使用该业务逻辑
        Step3-1 初始化消息里面处理socket的初始化,在tcpPush线程中传入socketfd(初始化sokcet的返回值)
        Step3-2 在tcpPush线程中 来不停的recv消息 然后将recv得到的消息 msgsnd到消息队列中(这个时候记得带上对应的消息的类型)
        Step3-3 将消息push到消息队列中之后,这步就开始处理消息 也就是tcpPop线程开始,这一步从消息队列中msgrcv拿出消息,然后再进行
            业务的分类
        这样就形成了一个完整的push消息队列=>pop消息队列的过程
        注意:消息队列的msgsnd和msgrcv可以根据参数的设置,是否为阻塞的
                    TCP里面就有粘包的问题,就是两段数据粘在一起出来,这个时候要考虑拆包的操作
        

  •     Step4 守护线程(用来监控 Step3 里面的push和pop线程)

        守护线程,这个是为了方便来重启那些异常退出,或者死掉的线程
        具体实现逻辑:以tcpPush和tcpPop为例
        这里实现方式比较简单,定义一个全局的变量来计数(这里计数只是在线程执行的过程中计数,也就是while(1)里面)
        守护线程的时候 设定时间为60s读一次那个全局变量,如果60s的时候和60s后读出的时间一致,那就说明该线程可能是阻塞或者异常退出了;
        那么这个时候就可以重启该线程了;
}

总结:
应用到的技术细节:
1.linux中的消息队列
2.linux中的线程基本操作
3.tcp和udp的基本操作
4.读配置文件
5.简单的定时器的实现

zong

Guess you like

Origin blog.csdn.net/Wuzm_/article/details/103632841