linux系统运行application,[分享]分享曾经做过的一个嵌入式系统application框架 | 勤奋的小青蛙...

=================第一天================

前言:

本文只是分享下自己曾经开发过的一个嵌入式Linux+Qt的系统应用层开发框架,只是分享出来,算不上什么高深的东西,希望可以给需要的人一些帮助吧。本文侧重的是应用层(Linux串口和Qt应用程序通信)这块的框架,并不会去过多的说bootloader,kernel,因为太庞大了,本人也不精通,但是应用层的话,毕竟难度小些,学起来还是挺快,希望分享出来,大家也能学个应用层开发(Linux串口与Qt通信)的一个框架。

讲之前的一些废话:

嵌入式Linux开发系统,在我目前接触的几个项目里,几乎都是这样的一个基础框架:

bootloader->kernel->filesystem->application,也就是:系统引导程序->内核->文件系统->应用程序

bootloader:通常用的都是uboot喽,这个大家应该都晓得,uboot用的最多;

kernel:从官网下载一个,根据自己的硬件平台或者根据kernel提供的相似的硬件平台,编译出kernel;

filesystem:通常是用busybox来构造最小文件系统,busybox小而强大,非常适合构建文件系统;

application:在Linux下的话,现在还是Qt用的多一些喽。

其实这篇博客我想讲的就是当uboot执行了,kernel也执行了,最后文件系统挂载上去之后的一些事情。文件系统挂载之后,下面就是要执行我们的应用程序了,根据Linux开机执行的脚本顺序,我们把开机执行的应用程序,放在/etc/profile文件里执行,比如本文主要讲的程序comm_if,那么,我们在/etc/profile文件的最后,加上一行:./comm_if &即可,这样就实现了开机自动去执行comm_if这个程序,下面我就主要讲怎么在comm_if这个程序里,把串口以及Qt的程序同时打开工作。

=================第二天================

首先来介绍下项目背景,这个项目主要是一个高压注射机器,一个注射头+显示器,注射头和显示器间进行联机通讯,注射头通过RS232通信协议和显示器程序进行通信,显示器程序一方面要负责进行注射头传输过来的数据处理,一方面还要负责Qt界面的显示,数据呈现,那么其实本文章主要写的就是显示器主板基于Linux系统如何完成这个需求,我们直接开始分析源码。

fe34d9a4fbd5699b6c683ad312c84907.png

第一步我们创建了一个消息队列,消息队列是Linux里进程间通信的一种方式,创建这个消息队列,我们显示器这个程序就可以和Qt的gui程序进行通信,如果对消息队列不懂的话,可以参考Linux进程间通信,找下资料学习学习;

f4439debf5df3816bf89e6a8a3845c08.png

第二步骤便是,我们在Linux下实现一个串口通信,完成和注射头之间的RS23协议的通信,这一部分便是将我们Linux下串口编程的知识用了上来,是不是也挺实用的?

然后串口的收发是在下面的这段代码里实现的,通过read函数进行串口的读取:

6459b66c7b7daedfe2fdc44ce7ee4966.png

然后串口的写的话,也就是向注射头发送数据,那么是通过下面这个函数write进行的:

a5401f7326aff2327dd09ac8297b3b64.png

好了,这个Linux下的串口通信程序,在真正的项目开发中,其实也就是这么用起来的;

下面第三步骤就是比较重要的一步了,就是Linux下如何父进程创建子进程,然后我们显示器通信程序便可以顺利的把Qt的图形界面程序调用起来,其实Linux下创建进程无非通过fork()函数或者vfork()函数,这里我们使用fork()函数:

6aa989edf8bd2555d0cdc1b18c5a2515.png

Linux下fork()函数调用后,当返回值pid==0时,便是在子进程里了,这个时候,我们便去调用Qt的应用程序,这个程序里是analysicpro,然后通过execl函数,我们便将Qt的应用程序执行起来了;

通过上面的代码,我们已经建立了如下的操作:

1:建立显示器通信程序和Qt程序的消息队列;

2:创建了显示器通信程序和注射头之间的串口通信;

3:通过Linux下的进程的创建,我们成功打开了Qt的应用程序

通过以上三步骤,现在我们的显示器板子运行着和注射头通信的显示器通信程序,还运行着Qt的应用程序,那么还差最后一步,那就是显示器通信程序和Qt应用程序之间的通信,这个通信就是消息队列的收发喽,看代码:

a4c14e60b8d6e0b04ab7e934fbdce1db.png

在显示器端,我们通过消息队列函数msgrcv进行Qt应用程序端的数据发送,然后如果有数据的话,便通过msg_info_type来进行数据判断,然后根据不同的消息类型进行处理。

那么我们再看下Qt应用程序这边的程序,程序代码见:msgthread.h msgthread.cpp

ae49c04b6fe1eabe4602c8dba187e2f5.png

在Qt应用程序这块,为了保证消息的及时性,我们采用了线程,msgThread继承QThread类实现一个线程,然后在线程的run函数里,我们便可以进行数据处理:

e21126a434a902bf3041d4945107c27f.png23967415593e156679fc121173aad77c.png

在Qt的线程类的run方法里,我们便进行消息队列的数据接收,然后根据msg.info_type进行判断处理,其中消息队列的发送通过这些函数:

上面两个函数便是消息队列消息的发送。

好了,至此,Qt应用程序和显示器通信程序之间也可以进行消息的通信了,然后显示器通信程序通过Linux下的串口和注射头进行通信,那么这个框架便搭建完成了。

具体的细节,那就是靠伟大的程序员一点点添砖加瓦的完成喽。

文章的脚注信息由WordPress的wp-posturl插件自动生成

|2|left

打赏

1b6439c6a040252321edad911c85491b.png微信扫一扫,打赏作者吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值