使用最新的openPOWERLINK 2.7.2源码,业余时间搞定了Powerlink协议在嵌入式linux上的移植和测试,并进行了下电脑和linux开发板之间的通信实验。添加了一个节点配置,跑通了源码中提供的主站和从站的两个demo。这里总结下移植过程分享给有需要的人。在嵌入式linux下的移植还是蛮简单的,相信即便移植到单片机中也不是什么难事。挺好玩的,感兴趣的可以尝试尝试。
测试结果
QT的demo运行在64位的win10 电脑上,从站的demo运行在嵌入式linux开发板上。板子的网口连接在局域网内的任一根网线。使用的linux开发板配置并不高也比较老了。周立功的EasyARM-iMX283开发板,板子不到一百块。主频454M,内存64M,FLASH 128M,板子系统内核linux-2.6.35.3。
先附一张测试的效果图,如下:
在测试demo的从站中,输入按键i,能看到主站上Digital Inputs的绿色灯发声了变化。(Press i to increase the digital input)PDO的映射关系如下:
运行demo:
chmod +x demo_cn_console
export LD_LIBRARY_PATH=$(pwd)
./demo_cn_console
linux板子上从站启动内容:
移植准备
1.电脑虚拟机中的linux环境,之前一直使用的是Ubuntu14.14和18.08,这次体验使用了下最新国产深度deepin系统社区版(23),体验真不错挺好用,界面也漂亮。deepin系统配置下阿里的镜像源(/etc/apt文件夹中的sources.list文件),添加阿里镜像:
deb [by-hash=force] https://mirrors.aliyun.com/deepin apricot main contrib non-free
内容如下:
## Generated by deepin-installer
deb https://community-packages.deepin.com/beige/ beige main commercial community
#deb-src https://community-packages.deepin.com/beige/ beige main commercial community
deb [by-hash=force] https://mirrors.aliyun.com/deepin apricot main contrib non-free
2.openpowerlink最新版本源码:Download openPOWERLINK
3.libpcap 库的交叉编译,我使用的 libpcap库是libpcap-1.10.4.tar.gz,下载地址:https://www.tcpdump.org/release/libpcap-1.10.4.tar.gz
4.cmake环境安装
deepin系统下安装cmake很简单的,直接sudo apt-get install cmake即可。
移植过程
交叉编译工具链配置
我使用的是板子配套提供的arm-gcc工具链gcc-4.4.4-glibc-2.11.1-multilib-1.0,放到了/opt/arm的目录下。在openpowerlink的源码的cmake目录下,新建文件:toolchain-imax283-arm-linux.cmake,用来配置你的交叉编译工具链。内容如下:
################################################################################
# Name of the target platform
#set(CMAKE_C_COMPILER "/opt/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gcc")
#set(CMAKE_CXX_COMPILER "/opt/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-g++")
SET(ARM_TOOLCHAIN_DIR /opt/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0 CACHE STRING "imax283 arm toolchain path")
################################################################################
# Name of the target platform
SET(CMAKE_SYSTEM ARM-linux-eabihf)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR arm)
# Version of the system
SET(CMAKE_SYSTEM_VERSION 1)
# specify the cross compiler
set(CMAKE_C_COMPILER "/opt/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "/opt/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-g++")
#SET(CMAKE_C_COMPILER arm-fsl-linux-gnueabi-gcc)
#SET(CMAKE_CXX_COMPILER arm-fsl-linux-gnueabi-g++)
#SET(CMAKE_ASM-ATT_COMPILER arm-fsl-linux-gnueabi-as)
SET(CMAKE_FIND_ROOT_PATH ${ARM_TOOLCHAIN_DIR}/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries in the target and build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
# for headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# cross compiler directives
SET(MAKE_KERNEL_ARCH arm)
SET(MAKE_KERNEL_CROSS_COMPILE ${ARM_TOOLCHAIN_DIR}/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-)
libpcap库的移植
在deepin系统下编译libpcap库源码需要先安装依赖bison和flex。
bison和flex这两个是啥?平常很少接触到,因为这两个看着有点儿高深,跟编译器开发相关的。如果你的deepin包更新错了,以下换个可能用到:
sudo dpkg -i --force-overwrite /var/cache/apt/archives/dbus_1.12.20.6-1+deepin_amd64.deb
以下内容作为科普,可以忽略:(Bison和Flex是生成解析器的工具。Bison是一种生成LR(1)语法分析器的工具,它可以根据语法规则和动作代码生成C代码的解析器。而Flex是一种用于生成词法分析器的工具,它可以将输入的词素(token)流转换为C代码的词法分析器。
Pcap库是一种用于网络数据包捕获和分析的C库。在编译安装Pcap库时,需要Bison和Flex工具的支持,这是因为Pcap库使用Bison和Flex来生成解析网络数据包的C代码。
在Pcap中,Bison和Flex主要用于将Pcap的数据包解析规则转换为C代码。由于Pcap支持多种协议,因此需要一种机制来定义这些协议的数据包格式。这就是Bison和Flex的作用所在。 具体来说,Bison用于解析语法规则和动作代码,然后生成C代码的解析器。而Flex则用于将数据包转换为词汇单元。这些词汇单元可以是Ethernet帧的源和目的MAC地址、IP包的源和目的IP地址等等。一旦词汇单元被产生,Bison就会使用它们来解析数据包的语法规则。 例如,假设我们想要解析网络中的HTTP数据包。我们需要定义HTTP数据包的格式,包括请求行、头部、正文等等。使用Bison和Flex,我们可以将HTTP数据包的格式转换为语法规则和动作代码,然后生成C代码的解析器。这个解析器可以将HTTP数据包转换为语法树,并提供一个易于使用的API,以便我们可以提取出HTTP请求的相关信息。)
安装依赖:
sudo apt-get install bison
sudo apt-get install flex
pacp源码编译:
接下来进入libpcap源码目录,设置临时环境变量,让能找到交叉编译工具链。
export PATH=/opt/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin:$PATH
接下来:
//1.
cd libpcap-1.10.4/
//2.
export CC=arm-fsl-linux-gnueabi-gcc
//3.
./configure --host=arm-linux --with-pcap=linux
//4.最后,make,make install
make
make install
openpowerlink库的移植
进入openpowerlink源码的stack的build目录,新建个arm-linux文件夹。进入到此文件夹下,开始执行cmake命令。这时之前配的交叉工具链toolchain-imax283-arm-linux.cmake派上了用途。如下:
cmake -DCMAKE_TOOLCHAIN_FILE=../../../cmake/toolchain-imax283-arm-linux.cmake ../.. -DCMAKE_BUILD_TYPE=Release -DCFG_COMPILE_LIB_[LIB_NAME]=ON -DCFG_COMPILE_LIB_[LIB_NAME]_LIB_DIR=[PATH_TO_HW_LIB]
最后把需要的liboplkcn.a这个协议栈静态库放到以下路径下,供编译从站的那个demo使用。
cp liboplkcn.a /home/test/openpowerlink/stack/lib/linux/liboplkcn.a
主站demo_mn_qt源码编译
主站demo_mn_qt的编译,这个简单就不介绍了。这个主站是跑在电脑上的,不用交叉编译。只要windows电脑上有cmake环境和msvc或mingw工具链,编译没什么问题,需要把stack协议栈库和demo_mn_qt都编译。
从站demo源码的编译
在以上条件都就绪的前提下,编译从站的那个demo也很简单了。直接进入apps/demo_cn_console目录下,同样再进入build目录,新建个arm-linux文件夹并进入。最后执行以下cmake指令即可。
cmake -DCMAKE_TOOLCHAIN_FILE=../../../cmake/toolchain-imax283-arm-linux.cmake ../.. -DCMAKE_BUILD_TYPE=Release
demo_cn_consloe交叉编译成功:
板子上运行验证
需要用到libpcap.so.1这个编译过的库,放到板子上。运行测试通信成功。按i键改变从站中的值可以看到主站这个demo界面上的Digital Inputs的绿色灯移动。
其他资源
openPOWERLINK: Building openPOWERLINK Stack Libraries
单片机+PHY芯片+Powerlink协议实现高效数据采集探究(工业总线485和CAN的升级)_特立独行的猫a的博客-CSDN博客
交叉编译libpcap_libpcap交叉编译_佚名网友的博客-CSDN博客
Generic Netlink分析和使用_庾志辉的博客-CSDN博客
flex与bison_百度百科
解决错误apt --fix-broken install_子翊寒的博客-CSDN博客
关于deepin应用商店一直显示正在安装&&安装时出现有未能满足的依赖关系的解决方法_deepin依赖关系不满足_ぃ未来可期的博客-CSDN博客