记录自己的程序移植经历(裸机软PLC C语言程序移植到Linux)

先说一下本人的基础,本人是一个小公司初来乍到的实习生,拿到这个任务的时候,不懂PLC,而对于linux只懂一点点皮毛的操作。结果硬是把程序移植完毕且能顺利运行。

该程序是嵌入式软PLC,主要代码是对四元式指令的解析。说白了就是移植一个软PLC的运行时。

拿到任务初期,首先是去了解了一下软PLC是什么,然后研读了一下公司工程师开发这个程序的设计文档、交互文档等。说实话,光看文档看了一周,看得云里雾里,不知道文档在说什么。

然后就是在网上疯狂搜索程序移植的文章,想汲取点前辈的经验,奈何没有多少前辈写过文章。

然后就是去了解了一下linux的开发,即应用开发和驱动开发。当然移植软PLC程序只涉及到了应用开发。

了解完了这些,就去找工程师要了代码,只需要移植,所以代码不需要自己写。

拿到代码时更是一脸懵,一头雾水,看代码看到要抓狂的程度。这个代码是针对于裸机开发的,所以里面涉及到了一些关于STM32的库的内容。

回忆一下从拿到代码,是怎么一步一步移植过来的叭。

一、了解程序框架 

       首先肯定要知道的就是每个文件都大体有什么功能,通篇看一下代码,从代码文件名入手,就能大致知道里面的代码是干什么的了,或者简单点,直接请教工程师,每个文件都是什么功能。然后确定哪些功能,哪些文件是我们需要移植的。比如说:原先有关于硬件操作的文件是不需要的,或者说是需要改的。

二、排除有关STM32的内容

       由先前看文档、搜资料的基础知道,STM32的库在linux里是用不了的,我用了最粗暴的办法,将所需要的文件里有关于HAL库的头文件删除,然后看报错部分。想想看移植后的程序是否需要这个,需要这个的话,就用linux里可以用的函数替代。比如说:定时器、延时函数等。

三、进一步深入看看代码,理清楚代码逻辑

       主要了解每个函数是干嘛的,一般也可以从函数名儿入手(前提是工程师函数命名规范,清晰易懂),然后理清函数执行的先后逻辑。

       第二是从入口函数入手。一般来说,keil开发的程序,都有单独的main.c文件,这里面包含了移植用不到的函数,有两个办法,就是将不需要的函数删除,单独留下需要的函数写一个入口函数main。但由于我需要的函数不多,直接在主代码里添加了main函数。将函数的执行逻辑重新在里面实现。

三、初编译

       上面的步骤完成了,就可以将代码放入linux里开始编译了。这个时候的编译的目的并不是获得可执行文件,而是找错误——编译后会有报错,都是一些不兼容的错误或者函数未定义啥的。接下来就是根据这些错误一步一步到代码里修改。这里还是需要一定的c语言基础的。当然,我就是小白一个。这里借助了GPT,每个问题都让它进行了辅助修改,简直事半功倍。

比如这样 :

四、实现通讯模块

      编译那一步,直到所有问题都被解决后,即能生成可执行文件了,有个问题便接踵而来——怎么验证程序移植成功。所以还得实现通讯模块来与上位机通讯。

       这里简单介绍一下:上位机也是软PLC的一部分,即软PLC的开发系统。

      我们公司开发的这套软PLC的开发系统与运行时通过UDP通讯。

      硬件与上位机通讯是通过公司自己实现的udp协议。而移植到linux中用UDP的socket编程即可。确定好ip地址以及端口号就可以实现udp的收发。由于需要实时接收数据,所以我创建了两个线程,用于接收数据。为什么是来两个线程,因为需要监听两个端口号。

     在这个过程中,我遇到了一个问题值得注意:没有注意linux端发送数据是的目的端口号,这个需要用同一个套接字发送数据,不能在创建一个套接字进程发送,不然会导致数据发送到其他端口号,从而上位机接收不到数据。

五、调试

       通讯部份完成后,就开始调通上位机与下位机。调通不是大问题,就不赘述了。

       回顾来看整个移植过程看似并不复杂,但是对于我这样一个对那方面都近乎小白的人来说,还是耗费了好多心力。

       其实主要就是API的更换,数据类型的转换(因为我linux是64位的,源程序是针对32位的,所以有区别)、socket通讯的实现等内容。

     总之,不管是拿到什么任务,都是发现问题与解决问题的过程。

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/26405.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可移植性测试包括哪些

可移植性测试 可移植性是指应用程序能够安装到不同的环境中,在不同的环境中使用,甚至可以移动到不同的环境中。当然,前两者对所有系统都很重要。就PC软件而言,鉴于操作系统、共存和互操作应用程序、硬件、带宽可用性等方面的快速…

Kubespray v2.22.1 在线部署 kubernetes v1.26.5 集群

文章目录 1. 介绍2. 预备条件3. 配置 hostname4. yum5. 下载介质5.1 git 下载5.2 下载 kubespray v2.22.1 6. 编写 inventory.ini7. 配置互信8. 安装 ansible9. 关闭防火墙10. 安装 docker11. 配置内核参数12. 启动容器 kubespray13. 部署14. 配置连接集群 1. 介绍 kubespray​…

【005】基于深度学习的图像语 通信系统

摘要 语义通信是一种新颖的通信方式,可通过传输数据的语义信息提高带宽效率。提出一种用于无线图像传输的系统。该系统基于深度学习技术开发并以端到端(E2E)的方式进行训练。利用深度学习实现语义特征的提取和重建,在发送端提取信…

干货整理,自动化测试-数据依赖解决方案详细,一篇通透...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 解决自动化数据依…

分布式ELK 企业级日志分析系统

一、ELK的相关知识 1.ELK简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch:是基于Lucene(一个全文检…

postman:模拟发送一个需要 cookie 认证的请求

目录 前言: 1、chrome 已安装插件 intercept。 2、chrome 浏览器要设置打开,在运行期间浏览器要一直打开。 3、本人是用 fiddler 对 app 的请求进行抓包,也可以使用其他工具。查看 headers 里的 cookie,并复制。 4、将复制的…

纯css3实现小鸡从鸡蛋破壳而出动画特效

实现一个使用纯css3实现小鸡破壳的效果 示例效果如下所示 示例代码 <template><div><div class"eggWrapper"><div class"chickHead"><div class"eyeDiv"></div><div class"eyeDiv"></di…

【K8S系列】深入解析K8S监控

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 Kubernetes (k8s) 是一个容器编…

6款开源中文OCR使用介绍(亲测效果)

文章目录 前言开源ocr项目1. Paddle OCR&#xff08;推荐指数&#xff1a;★★★★★&#xff09;1.1 简介1.2 使用1.3 优缺点 2. CnOCR&#xff08;推荐指数&#xff1a;★★★★★&#xff09;2.1 简介2.2 使用2.3 优缺点 3. chinese_lite OCR&#xff08;推荐指数&#xff1…

积分图像、图像分割、Harris角点检测

目录 1、积分图像 2、图像分割--漫水填充 3、图像分割--分水岭法 4、Harris角点检测 1、积分图像 #include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;//积分图像 int test() {//创建一个1616全为1的矩阵,因为2561616M…

qgis添加地理地图书签,快速定位到想要的位置

我们打开qgis软件&#xff0c;一般这个功能区域默认在左侧的中间位置&#xff0c;如图&#xff1a; 如果没有的话&#xff0c;我们需要调出来&#xff0c;在软件上方的菜单栏的空白处&#xff0c;右键显示面板调试框&#xff0c;勾选空间书签管理器面板&#xff0c;即可&…

Perforce Helix Core新版本推出资源压力感知功能,提升服务器可用性,助力大规模开发

您的版本控制系统帮助团队进行主动监控吗&#xff1f; Perforce Helix Core的客户经常在不同维度上测试规模和性能的极限。其中一些维度包括文件数量、文件大小、用户数和并发事务数量。随着这些维度的压力增加&#xff0c;服务器资源&#xff08;如内存和CPU&#xff09;通常…