一个arm64国产化工控机工程的移植总结

Posted 李迟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个arm64国产化工控机工程的移植总结相关的知识,希望对你有一定的参考价值。

去年开始移植工程到一国产工控机,直到最近才阶段性结束,至于后续的工作,暂时无安排,故抽时间写一下小结。

流水账

这个任务去年年中就开始了,但任务不是部门的,是同一产业园另一单位派过来的,领导只有一句话,叫我配合移植,于是和技术人员对接,断断续续至今。

当时是移植一个核心的工程,需在工控机上进行性能测试。在着手之前评估过,只要内存、CPU与当前 x86 的相当,程序运行的性能是可以保证的。但具体怎样还得实操过才行。

龙芯

去年4月份,拿到第一块板子,是龙芯的 2K,系统是 debian 10,编译器版本是 8.3 的,把源码拷贝到板子上编译并测试,性能稍弱一些,达不到要求。

5月份,拿到第二块板子,还是龙芯,这次是 3A,性能达到了要求,但这只是一个核心工程而已,其它工程暂无权限,于是就抽点时间,把玩一下板子(注:不是玩弄),毕竟,龙芯大名听闻已久,今日得见,必须趁机做点事。

保存时间超时:

hwclock -r
hwclock: Timed out waiting for time change.

内核:

# uname -a
Linux sancog 4.19.167-rc4.lnd.3-loongson-3 #1 SMP PREEMPT Tue Apr 13 11:38:18 UTC 2021 mips64 GNU/Linux

的确是 mips 架构。

查看发行版本:

# cat /etc/os-release 
PRETTY_NAME="Loongnix-Desktop GNU/Linux 20 (DaoXiangHu)"
NAME="Loongnix-Desktop GNU/Linux"
VERSION_ID=20
VERSION=20
VERSION_CODENAME=DaoXiangHu
ID=Loongnix
HOME_URL="https://www.loongnix.org/"
SUPPORT_URL="https://ask.loongnix.org/"
BUG_REPORT_URL="http://bugs.loongnix.org/"

查了一下DaoXiangHu,是指其产业园所在的稻香湖路

飞腾

去年将结果上报领导后,以为没后文了,今年领导又叫我对接,这次是全部工程的移植,一度以为简单,就是在板子上编译一下就能跑了。结果前后持续了半年时间,一来部门的事太杂了,中间又有几个突击任务,上头已经发文并且规定了限期的那种。二来板子的软件配套又不全,像挤牙膏一样,一点一点的补充。

拿到板子后,还是先看编译器,是8.3版本的,之前对接时已经强调,编译器要用 4.8.5 版本。后来换了个板子,板子换了编译器。于是正式开始任务,找显示器,找 VGA 线,开机,是 CentOS7.6 的系统。

向组长申请权限,下载主程序,用 scp 拷贝到板子上编译,发现无法编译,虽然有 Makefile 文件,但用不了,只能用 eclipse 打开。于是删除代码返回板子,安装了 eclipse 后,能正常打开编译,编译发现缺少很多库,于是一一安装,或用 yum 安装,或到 github.com 下载源码编译安装,还稍改了一处调用 zip 库用的变量类型问题。

移植完主程序后,再移植 Qt 工程,板子上已经安装了 5.9.1版本,但没有QtCreator,用命令yum install -y qt-creator安装,但遇到依赖问题,于是用命令行编译qmake xxx.pro,但提示找不到WebEngine。于是删除代码返回板子,重新安装Qt库及 QtCreator 后,重新拷贝工程代码,在QtCreator配置了相关库的路径及编译器,由于Qt是基础源码编译,一定要将编译后的包放到源码编译时指定的目录,这样才能用新版本Qt编译。但Qt库却是用 gcc 8.3 版本编译的,稍作思考,认为关系不大。

复杂工程编译后,其它小工程就易如反掌了。但让整套系统工程运行起来却是件不容易的事。

首先从已有的在跑的工控机上拷贝运行目录到板子上,将其中的工程可执行文件替换掉,运行主程序后,发现数据库连接不上,于是在板子上启动mysql,再运行也连不上,原来是用户名密码数据库等没创建,于是一一创建之,由于是使用普通用户连接,因此需要提升其权限。再运行,发现打开不了串口,于是切换root权限运行程序,终于能跑了,但Qt工程用 root 权限运行提示错误,和QtWebEngineCore相关,而用普通用户却能正常。为让任务继续,就先抛开此问题。

但加载视频动态库时,出了问题,提示soap_base64o未定义。搜索工程代码发现的确只有声明没有定义,因为工程生成动态库,所以编译没有报错,于是继续反馈,拿到新的 soap 库再编译,能找到定义了,但又提示soap_new_REQUIRE_lib_v20890找不到,根据经验,是 soap 库版本有关,于是继续反馈,但那个版本已经很难找到源码了,而重新搞又要动到视频库代码,后来用了个不正道的招解决,即把现有代码旧的版本号改为新的库的版本号。这些和 onvif、gsoap 有关的东西,已经有五六年没接触了,当年一心搞技术,以至于忽略了一些必要的事,现在回首,很是感慨。

此后遇到的基本上是和业务相关的配置,因为拷贝的运行目录是生产环境的,和实验室测试环境有诸多不同,需根据条件逐一修改,比如串口设备名称、网口和网关路由,期间没少问同事,再加上自己理解,花费的时间也不少。
等界面启动后,查日志,没有什么大问题。于是从编译人员角色切换成测试人员角色,虽然此前观摩了正在执行测试作业的测试人员,但毕竟自己第一次接触和操作,完全不知如何下手,极像当年我第一次接触电脑,满怀敬畏之心,连键盘都不敢碰。于是多次询问测试人员,终于能自己单独测试一轮了,感觉自己又进步了一点,至少,从前是做周边接口,现在能编译主程序且对业务有了直观的认知。

小结

国产化替代,是符合时代潮流的,这里抛开很多因素不提,单从一个编码工具人角度思考。

如果要将当前的所有工程移植到龙芯上,底层驱动、外设厂家的库要重新移植——可能不仅仅是交叉编译那么简单。另外,我们的工程包括Qt框架,主工程及很多配套模块,都要移植,并且要经过大量测试。

而飞腾使用的是 arm 框架,部门有人有相关经验,相对来说会容易些。

至于开发环境及调试,不管哪个芯片的板子,都是会面临的,对开发人员都是一个不小的挑战。当然,这些可能不是我所能左右的了,仅作为一个风险点提出。

最后不得不提的是,事务在开始时要明确好责权和分工,最好是相关方都参与,最好有能拍板的领导在场。起初我认为事情简单:拿到板子,拉取工程代码,打开IDE,编译,运行,完毕。但实际上花了很多的时间,最主要的是环境的不同,有些事明显不归我做,但始终没有忘记自己的外包打工仔身份,所以不是该不该的问题,而是怎么把事做好,再者说,往好好想,能从中学习知识,亦非坏事。不管是当初没有确认好,还是不同层面人的认知和理解不同,无论怎样,最终还是完成任务。

从这次任务中了解、学习或研究到的:

  • 平生首次接触了龙芯,日后不知有没有机会再碰到。
  • 初步接触了业务,做了些测试工作。
  • 研究了开机自动启动脚本,并研究如何开机只显示Qt程序(而不是登陆界面)。
  • 再次接触了 gsoap,并测试了 onvif。
  • 了解了不同系统的 GCC 宏定义,并据此完善代码匹配不同系统。

文中涉及的知识点

查看CPU信息:

cat /proc/cpuinfo 

查看系统发行版本:

cat /etc/os-release 

判断大小端代码示例:

(小端:低位在低地址)
#include <stdio.h>

// 判断是否小端
// 1:小端 1:大端
int isLittelEndian()

    union w
    
        int a;
        char b;
     c;
    c.a = 1;
    return (c.b == 1);


int main(void)

    int little = isLittelEndian();
    printf("endian: %s\\n", (little==1) ? "little" : "big");

    return 0;

双网卡路由:

添加静态路由:
sudo route add -net 172.18.18.0/24 gw 172.18.18.1 eth0
添加默认网关:
route add default gw 192.168.1.254 dev eth1

用gsoap生成onvif相关代码,要用到soap的库,也会用到gsoap生成代码,还会用到soap的代码,不同版本的gsoap,生成的代码不尽相同——甚至不相容。

以上是关于一个arm64国产化工控机工程的移植总结的主要内容,如果未能解决你的问题,请参考以下文章

国产ARM核心板推荐

一个arm平台C++工程段md5错误的排查

一个arm平台C++工程段md5错误的排查

arm上操作系统怎么移植?为啥不同的操作系统都可以在arm上跑,啥样的硬件上可以运行操作系统?

ARM工控主板LS1012A

基于NXP_LS1012A 芯片ARM工控主板