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

news2024/11/27 0:36:24

先说一下本人的基础,本人是一个小公司初来乍到的实习生,拿到这个任务的时候,不懂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.coloradmin.cn/o/764454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Hadoop集群hive库建表中文和表数据乱码问题

最近在测试环境,发现DDL建表后,发现中文注释和表数据乱码的问题,如下 查询元数据 原因是hive 的 metastore 支持的字符集是 latin1,所以中文写入的时候会有编码问题。 解决方案如下: 对MySQL的编码设置 [client]下面增加 default-character-set=utf8 在[mysqld]下面增…

Pytorch如何打印与Keras的model.summary()类似的输出

1 Keras的model.summary() 2 Pytorch实现 2.1 安装torchsummary包 pip install torchsummary2.2 代码 import torch import torch.nn as nn import torch.nn.functional as F from torchsummary import summaryclass Net(nn.Module):def __init__(self):super(Net, self).__…

微服务Gateway网关(自动定位/自定义过滤器/解决跨域)+nginx反向代理gateway集群

目录 Gateway网关 1.0.为什么需要网关? 1.1.如何使用gateway网关 1.2.网关从注册中心拉取服务 1.3.gateway自动定位 1.4.gateway常见的断言 1.5.gateway内置的过滤器 1.6.自定义过滤器-全局过滤器 1.7.解决跨域问题 2.nginx反向代理gateway集群 2.1.配置…

Matplotlib坐标轴格式

在一个函数图像中,有时自变量 x 与因变量 y 是指数对应关系,这时需要将坐标轴刻度设置为对数刻度。Matplotlib 通过 axes 对象的xscale或yscale属性来实现对坐标轴的格式设置。 示例:右侧的子图显示对数刻度,左侧子图则显示标量刻…

61、Mysql中MVCC是什么

什么是MVCC 多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁不冲突了,不同的事务session会看到自己特定版本的数据,版本链 MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作。…

apache ozone详细介绍

Ozone是哪路神 Apache Ozone https://github.com/apache/ozone Ozone是Apache软件基金会下的一个项目,其定位是:一个用户大数据分析和云原生应用、具有高扩展性、强一致性的分布式Key-Value对象存储。 HDFS是业界默认的大数据存储系统,在业…

ThunderScope开源示波器

简介 4CH,1GSa/S 开源示波器。前端很简洁,BUF802LMH6518,ADC是HMCAD1511,用Xilinx A7 FPGA进行控制,数据通过PCIE总线传输到上位机处理。目前这个项目已经被挂到了Xilinx官网,强。 设计日志:h…

设计自己的脚手架

如何设计自己的脚手架 前言前置知识如何搭建一个脚手架搭建自己的脚手架初始化项目安装依赖packagejson 配置lint 和typescript配置 加入bin字段调试npm link调试核心代码实现获取所有命令create实现 美化项目添加logo 发包源码仓库 前言 ​ 在工程中,不仅是软件工…

车载测试:CANoe中环境变量和系统变量的区别

目录 环境变量和系统变量相同点: 环境变量和系统变量不同点: 环境变量和系统变量相同点: 都可以作为ECU、面板和CAPL程序相连接的媒介。例如,在CAPL程序中,通过改变或监控某一环境变量的值可以触发特定的动作&#x…

Java处理doc类型的Word文档转换成html(按顺序保留格式+图片)

最新有个新需求,就是doc文档转换html内容倒不是很难,给大家分享一下,总体思路就是按doc转html的思路来走,唯一缺点是不会自动转换图片,图片是要手动转成base64,默认是有html、body、head、meta等等标签&…

基于深度学习的高精度农作物机器与行人目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度农作物机器与行人目标检测系统可用于日常生活中或野外来检测与定位农作物机器与行人目标,利用深度学习算法可实现图片、视频、摄像头等方式的农作物机器与行人目标检测识别,另外支持结果可视化与图片或视频检测结果…

查询自己档案存在哪里

查询自己档案存在哪里 百度搜索“全国人力资源和社会保障政务服务平台” 或者点击下方的官网链接登陆后点击“个人服务”,选择“档案存档情况查看”就可以看到自己的存档情况了。 全国人力资源和社会保障政务服务平台 http://zwfw.mohrss.gov.cn/portal/index

【Linux】生产者消费者模型 -- RingQueue

文章目录 1. 生产者消费者模型的理解1.1 生产者消费者模型的概念1.2 生产者消费者模型的特点1.3 生产者消费者模型的优点 2. 基于BlockQueue的生产者消费者模型 1. 生产者消费者模型的理解 1.1 生产者消费者模型的概念 生产者消费者模型就是通过一个容器来解决生产者和消费者的…

从iPhone恢复已删除音视频的5种主要方法

“我需要从iPhone恢复已删除的音视频。我真的很喜欢我的音视频文件。我玩了很多封面,并检查听我可以改进的地方和不可以改进的地方。 iPhone是我完成这项任务的首选手机,因为我喜欢保持非常简单,我喜欢听我的iPhone。但是,我确实删…

4.Cesium中实体Entity的增删改查及性能优化(超详细)

前言 Cesium 作为一个功能强大的 WebGL 三维地球仪库,内置了丰富的三维地图展示能力。在 Cesium 中,我们可以通过 Entity(实体)在三维场景中添加和控制各种三维对象,如点、线、面、模型等。本文将介绍 Cesium 中实体的增删改查操作。 概述 添加到场景中的实体都保存在 viewer.…

【AI绘画】Stable-Diffusion-Webui本地部署-简单绘画图片

这里写目录标题 前言一、Stable Diffusion是什么?二、安装stable-diffusion-webui1. python安装2. 下载模型3. 开始安装:4. 汉化:5. 模型使用:6. 下载新模型:7. 基础玩法 三、总结 前言 本文将借助stable-diffusion-w…

【idea】的一些使用指南

一、serializable自动生成id 1.打开File菜单,选择Settings选项 2.打开Editor->Inspections 3.在右边的搜索框中输入serialVersionUID关键字,出现以下选项,勾选"Serializable class without serialVersionUID",然后别…

攻不下dfs不参加比赛(十)

标题 为什么练dfs题目总结为什么练dfs 相信学过数据结构的朋友都知道dfs(深度优先搜索)是里面相当重要的一种搜索算法,可能直接说大家感受不到有条件的大家可以去看看一些算法比赛。这些比赛中每一届或多或少都会牵扯到dfs,可能提到dfs大家都知道但是我们为了避免眼高手低有…

非监督学习-K均值聚类-知识点扫盲

前言 在实际工作中,我们经常会遇到这样一类问题:给机器输入大量的特征数据,并期望机器通过学习找到数据中存在的某种共性特征或者结构,亦或是数据之间存在的某种关联。 例如,视频网站根据用户的观看行为对用户进行分组…

【MongoDB】SpringBoot整合MongoDB

【MongoDB】SpringBoot整合MongoDB 文章目录 【MongoDB】SpringBoot整合MongoDB0. 准备工作1. 集合操作1.1 创建集合1.2 删除集合 2. 相关注解3. 文档操作3.1 添加文档3.2 批量添加文档3.3 查询文档3.3.1 查询所有文档3.3.2 根据id查询3.3.3 等值查询3.3.4 范围查询3.3.5 and查…