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

流水账

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

当时是移植一个核心的工程,需在工控机上进行性能测试。在着手之前评估过,只要内存、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国产化工控机工程的移植总结相关推荐

  1. STM32标准库工程中移植TencentOS-tiny

    一.移植前的准备 1. 引言 因为项目的原因需要将原有的标准库工程升级为基于TencentOS-tiny的RTOS工程,所以花费一点时间记录移植过程,提供一份向基于STM32标准库的老工程中移植Ten ...

  2. 关于Maven中的常见命令,通过命令的方式快速创建一个空的maven工程,将jar包打到maven仓库中

    打jar包的方式  mvn package -Dmaven.test.skip=true mvn install -Dmaven.test.skip=true mvn compile -Dmave ...

  3. idea建立一个java工程_IntelliJ IDEA(三、各种工程的创建 -- 之一 -- 创建一个简单的Java工程)...

    一.创建一个简单的Java工程:HelloWorld 1. Eclipse的第一步是选择工作空间,然后创建项目: IDEA不同(没有工作空间的概念),第一步就直接创建具体的项目,项目创建过程中会选择在 ...

  4. JNI开发笔记(四)--实现一个简单的JNI工程并生成so库

    实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...

  5. 一个好的算法工程应该具备哪几点要素?

    原址 ● 每周一言 为人处世,分寸很重要. 导语 作为码农界的芸芸众生,我们几乎每天都会接触到各式各样的工程项目.一方面,一些工程项目往往具有相似的实现:另一方面,这些工程又存在一个二次开发的问题.为 ...

  6. 编译和运行一个ARM64内核

    编译和运行一个ARM64内核 1 准备工具 1.1 busybox的下载路径: 1.2 linux内核的下载路径: 1.2.1 国内阿里云linux内核源代码的镜像: 1.2.2 官方的内核下载链接: ...

  7. 使用cubemx建立一个内部flash虚拟一个U盘的工程

    序言 使用软件版本 建立一个基础工程 添加flash操作代码 工程链接 可以注意到的是,大部分的stm32芯片是支持usb从机的,当然这类的标准库例程也有,比如野火的例程就有,只要将例程稍做修改就可以 ...

  8. IMX6Q的硬编码(VPU)的工程代码移植

    IMX6Q的硬编码(VPU)的简化代码移植 文章目录 IMX6Q的硬编码(VPU)的简化代码移植 简介 imx-vpuwrap的代码下载与编译 代码的下载 代码的编译 示例代码的研读 示例代码的移植 ...

  9. 一个关于国产化适配 的PPT文案

    前一阵,对外做了一个直播,主题是关于信创国产化,由于本身就为公开对外直播,无保密相关问题,因此,当时的PPT文案在此公开,供大家参考.由于初次审核以有广告嫌疑为理由拒绝,这里我将公司名称统一替换成了X ...

最新文章

  1. 答应我!别再写上千行的类了,好吗?
  2. Android Volley彻底解决(三),定制自己Request
  3. 2021-03-09 Local Lipschitz 可能存在 有限时间逃逸
  4. 【Python基础】太香了!推荐6个Python数据分析神器!!
  5. 洛谷P2566 [SCOI2009]围豆豆(状压dp+计算几何)
  6. 服务器间 存活状态,Shell脚本监控LVS后台服务器存活状态
  7. java 九大内置对象_JSP九大内置对象(隐式对象)
  8. 机器博弈 (二) 遗憾最小化算法
  9. 优点 spark_分布式计算引擎之星——Spark
  10. 微信小程序服务器布置轮播图,微信小程序自定义轮播图
  11. Iptables-外网地址及端口映射到内网地址及端口
  12. element-ui 日期选择器DateTimePicker 的日期和后台不匹配,无法绑定(日期中含有T,Z)
  13. tukey 窗口_C语言完成窗口算法
  14. 1000瓶水里面有一瓶毒水,通过用兔子去喝水的方式检验,只能让兔子喝一次水,那么最少用多少只兔子检验出来是哪一瓶?
  15. iOS和Android的app界面设计规范
  16. 【iOS开发】—— SDWebImage源码学习(未完)
  17. OPENSTREETMAP电力数据的情况
  18. 紫色店铺商家信息后台管理模板
  19. python升级pip_python中pip升级
  20. Assemble(王爽)——nasm 和 masm的一些简单区分

热门文章

  1. 6月份智能手机市场份额发布:联想超华为第二逼近三星
  2. 您该怎样科学地准备过年?
  3. 美国白宫将探讨人工智能 概念股分析
  4. 企业实战, java、spingboot微信扫码支付,页面生成微信二维码,微信扫码付款,websocket通知,处理订单!复制粘贴代码直接开干
  5. html转化成PDF
  6. 用endnote9往word中插入参考文献
  7. npm 脚本跨平台设置环境变量命令 cross-env
  8. 关于互相尊重和直言有讳
  9. 分享一套国产化技术开发JAVA语言,大佬手下留情
  10. canvas画拓扑图(箭头连线)