IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 一个arm64国产化工控机工程的移植总结 -> 正文阅读

[系统运维]一个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,生成的代码不尽相同——甚至不相容。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-06-20 23:09:26  更:2022-06-20 23:10:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:00:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码