iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、陀螺仪、CAN总线、RS485总线、500万摄像头等模块,稳定运行Android 4.0.3/Android 4.4操作,系统通用Linux-3.0.15+Qt操作系统(QT支持5.7版本),Ubuntu版本:12.04,接口智能分配 方便好用。
【交流群2】258811263(获取开源资料)
【迅为B站】北京迅为电子的个人空间-北京迅为电子个人主页-哔哩哔哩视频
第九十二章 最小Linux系统应用开发
92.1 使用Buildroot搭建最简单Linux文件系统
本文档介绍的是使用 buildroot 搭建最简单的 Linux 文件系统,Buildroot 是 Linux 平台上一个构建嵌入式 Linux 系统的框架。整个 Buildroot 是由 Makefile 脚本和 Kconfig 配置文件构成的。你可以和编译 Linux 内核一样,通过 buildroot 配置,menuconfig 修改,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件(包含 boot、kernel、rootfs 以及rootfs 中的各种库和应用程序)。
下面我们结合 iTop4412 开发板来讲解一下如何使用 buildroot 制作最小文件系统。
92.1.1 获取源码
我们从 buildroot 官网 http://buildroot.uclibc.org/download.html 获取 buildroot 源码包,笔者这里下的最新的是 buildroot-2018.02.4.tar.gz
首先拷贝“ buildroot-2018.02.4.tar.gz ”到我们的 Ubuntu 虚拟机上,然后在 Ubuntu 命令行,使用命令“tar -xcf buildroot-2018.02.4.tar.gz ”,解压完成后如下图。
92.1.2 配置
如下图使用命令“cd buildroot-2018.02.4”进入解压出来的源码目录下。
执行“make menuconfig”命令,进入配置界面,如下图所示。
进入“Target options”目录,将 Target Architecture 配置为 ARM(littlt endian), 将 Target Architecture Variant 配置为 cortex-A9,将 Target ABI 配置为 EABI,将 ARM instruction set 配置为 ARM,( 如果在其他开发板上测试, 修改 Target Architecture Variant 即可,4418,imx6q 为 cortex-A9,6818 为 cortex-A53,imx6ul 为 cortex-A7) 如下图所示。
再退回上一界面后, 进入 Toolchain 目录: 将 Toolchain type 配置为 External toolchain,然后在 Toolchain 中选择交叉编译工具的版本,这里我选 ARM 2014.05,在Toolchain origin 中选择 Toolchain to be downloaded and installed , 后面编译时, buildroot 将会自动下载对应的工具链并自动安装。选中 Enable MMU support。如下图所示。
退回上一界面后,进入 System configuration 界面,在 System hostname 一栏中输入开发板的名称,如 iTop-4412,在 Init system 中选择 BusyBox,在/devmanagement 中选择 Dynamic using mdev,即使用 mdev 动态加载设备节点的方式,然后在 Path to the permission tables 中 选 择 设 备 节 点 的 配 置 表 , 这 里 我 们 一 定 要 选 择system/device_table_dev.txt,否则后面在 dev 目录下将不会生成各种设备节点。当然我们也可以手动的配置该文件,添加必要的节点或删除不需要的节点。Root password 为配置进入 linux 控制台终端后的密码,为空则登录时不需要密码,默认登录用户名为 root。如下图所示。
选中 Run a getty(login prompt)after boot , 再进入该选项: 将 TTY port 配置为ttySAC2,将 baudrate 配置为 115200,对应 iTop4412 开发板的控制台打印串口(其他开发板控制台串口分别是 4418-ttyAMA0、6818-ttySAC0、iMX6Q&iMX6UL-ttymxc0)。如下图所示。
返回上一层, 再继续返回上一界面, 进入 Filesystem images 目录, 选中 tar the rootfilesystem,如下图所示。
最后保存当前的配置并退出,配置完成。如下图所示。用户也可以根据自己的实际需要进行配置。
92.1.3 编译
编译 buildroot,在 buildroot 根目录下直接执行 make 就可以完成了。
编译过程中会有如下报错。
我们使用命令“export FORCE_UNSAFE_CONFIGURE=1 && make”继续执行即可, 等待编译完成,第一次编译的过程中需要自动下载一些工具,所以要保持 Ubuntu 系统联网。如下图。
92.1.4 生成镜像
编译完成后,我们使用命令“cd output”,进入 output 文件,targer 就是我们编译生成的文件系统,当然 buildroot 会将其打包成相关镜像,但是格式种类有限(“menuconfig”中的“Filesystem images”目录下配置),镜像就放在 image 目录下, 我们还是回到“output”目录下,使用命令
make_ext4fs -s -l 314572800 -a root -L Linux target.img target/
生成文件系统镜像,如下图所示。
如果使用的其他开发板,参照开发板手册“制作最小文件系统镜像”相关章节,对“terger”目录下文件进行打包即可。
我们通过 fastboot 工具将镜像烧写进 iTop4412 开发板,只替换 qt 系统镜像中的system.img 文件即可,如下图所示。
等待开发板启动,输入“root”即可进入。如下图所示
92.2 最小Linux系统自动挂载SD/TF卡/U盘等存储设备
通过 mdev 工具实现 U 盘和 SD/TF 卡的自动挂载步骤如下:
92.2.1 配置内核
配置内核支持 USB 大容量存储
(1)先覆盖缺省文件cp config_for_linux_scp_elite .config
(2)make menuconfig
选择
Device Drivers -->
USB support -->
<*> Support for Host-side USB
<*> OHIC HCD support
<*> UHCI HCD (most Intel and VIA) support
<*> SL811HS HCD support
<*> USB Mass Storage support
选择完成后保存退出。
(3)接着开启内核热插拔, vim .config,在内核根目录下的.config 文件中添加如下内容
CONFIG_KALLSYMS=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_NET=y
保存退出,执行 make 命令生成 zImage 系统镜像。
92.2.2 配置 busybox
在系统编程文档的第二章中已经提供了搭建支持最小 Linux 的过程,这里就不过多解释说明。在这里我们我们只给出支持 usb 热插拔的相关配置。
1)make menuconfig
选择
Linux System Utilities --->
[*]mdev
[*] Support /etc/mdev.conf
[*] Support subdirs/symlinks
[*] Support regular expressions substitutions whenrenaming device addition/removal
[*] Support command execution at device
[*] Support loading of firmwares
保存退出,然后参照系统编程相关文档,使用命令编译生成 system.img 系统镜像。
92.2.3 修改文件系统
添加对热插拔事件响应,实现 U 盘自动挂载与卸载
将编译好的 system.img 和 zImage 镜像连同 u-boot-iTOP-4412.bin、ramdisk- uboot.img 烧写至开发板。
(1)创建 mdev.conf 文件:
vi /etc/mdev.conf 写入: | ||
sd[a-z][0-9] | 0:0 666 | @/etc/hotplug/usb/udisk_insert |
sd[a-z] | 0:0 666 | $/etc/hotplug/usb/udisk_remove |
(2)创建 udisk_insert 文件
mkdir -p /etc/hotplug/usb
vi /etc/hotplug/usb/udisk_insert
写入:
#!/bin/sh
echo "usbdisk insert!" > /dev/console
if [ -e "/dev/$MDEV" ] ; then
mkdir -p /mnt/usbdisk/$MDEV
mount /dev/$MDEV /mnt/usbdisk/$MDEV
fi
(3)创建 udisk_remove 文件
vi /etc/hotplug/usb/udisk_remove 写入:
#!/bin/sh
echo "usbdisk remove!" > /dev/console
umount -l /mnt/usbdisk/sd*
rm -rf /mnt/usbdisk/sd*
4)修改脚本权限
chmod 755 /etc/hotplug/usb/*
如下图所示插上 U 盘,此时就可以看到/mnt 目录下多了个 usbdisk 文件夹.
进入到 usbdisk 文件夹,看到 sda1 文件夹。说明我们已经成功将 U 盘挂载到开发板的/mnt/usbdisk 下的 sda1 目录。拔掉 U 盘就可以看到 sda1 目录消失。
92.2.4 实现 SD/TF 卡的自动挂载
- 在 mdev.conf 添加如下内容:
vi /etc/mdev.conf | ||
写入: | ||
mmcblk1p[0-9] | 0:0 666 | @/etc/hotplug/sd/sd_insert |
mmcblk1 | 0:0 666 | $/etc/hotplug/sd/sd_remove |
- 创建 sd_insert 文件
mkdir -p /etc/hotplug/sd
vi /etc/hotplug/sd/sd_insert
写入:
#!/bin/sh
echo "sd card insert!" > /dev/console
if [ -e "/dev/$MDEV" ]; then
mkdir -p /mnt/sdcard/sd
mount -rw /dev/$MDEV /mnt/sdcard/sd
fi
- 创建 sd_remove 文件
vi /etc/hotplug/sd/sd_remove
写入:
#!/bin/sh
echo "sd card remove!" > /dev/console
umount -l /mnt/sdcard/sd*
rm -rf /mnt/sdcard/sd*
- 修改脚本权限
chmod 755 /etc/hotplug/sd/*
如下图所示,插上 TF/SD 卡,此时就可以看到/mnt 目录下多了个 sdcard 文件夹。
进入到 sdcard 文件夹,就可以看到我们 TF 卡中的文件以及目录。说明我们已经成功将TF 卡挂载到开发板的/mnt/sdcard 下的 sd*目录。退出当前目录,拔掉 TF 卡就可以看目录消失(不退出当前目录就拔掉 TF 卡可能会造成系统重启)。
92.3 最小Linux系统的存储空间修改
这里以修改成 1G 存储空间为例来讲解修改方法,如果需要改成其他大小的存储空间,参照此方法修改即可。
首先连接好 iTOP-4412 开发板的调试串口到 pc 上,在 pc 的 windows 系统下打开串口调试工具。开发板上电,在串口调试工具里按任意 pc 键盘的任意按键使开发板进入 uboot 命令行模式,如下图所示。
然后在 uboot 输入分区命令:“fdisk -c 0 1024 300 300”,如下图所示。
上面图片里的命令是把 emmc 分区,其中的 1024 是 linux 的存储空间,单位是 MB,也就是 1G。如果想分配更大的空间修改这个值即可。
执行完上面的命令,如下图所示。
然后在 uboot 命令行分别输入下面的命令,格式化分区。
fatformat mmc 0:1
ext3format mmc 0:2
ext3format mmc 0:3
ext3format mmc 0:4
至此 EMMC 的分区已经只做好了,下面我们开始制作 linux 文件系统,拷贝光盘“08_源码_QtE 以及 qtopia2.2.0 文件系统”(xxxxxxxx 是版本日期,)到 Ubuntu 虚拟机上,例如我这里拷贝到了“/home/topeet/linux”目录,如下图所示。
然后使用“tar -xvf root_20140912.tar.gz”命令解压 linux 文件系统,如下图所示。
解压完成后,输入“ls”命令,可以看到生成了”root“文件夹,如下图所示。
接下来输入“make_ext4fs -s -l 996147200 -a root -L linux system.img root”命令生成“system.img”,如下图所示。
注意:使用”make_ext4fs“命令前,确认已经安装好编译 Linux 文件系统所需要的软件包,安装方法可以参照本手册的“13.3.5 生成 system.img”小节。
下面来看一下命令“make_ext4fs -s -l 996147200 -a root -L linux system.img root”,这个命令里面的“996147200”就是指定了 linux 存储空间的大小了,即:
996x1024x1024=996MB(在前面的分区里我们分配的是 1G 的空间,这里我们需要预留几兆的空间,所以设置为 996MB)
然后把生成的“system.img”烧写到 iTOP-4412 开发板,开发板启动进入到 linux 系统,输入“df”命令,可以看到 linux 存储空间变成 996MB 了,如下图所示。
通过上面的讲解我们已经清楚了怎么扩展存储空间,例如把存贮空间改成 2G,那我们只需要修改下两个地方。
1)fdisk -c 0 2048 300 300
2) make_ext4fs -s -l 2092957696 -a root -L linux system.img root
其中的 2092957696 是 1996x1024x1024=1996MB。
92.4 Python移植教程
Python 是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。
自从 20 世纪 90 年代初 Python 语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和 Web 编程。
Python 的创始人为荷兰人吉多·范罗苏姆 (Guido van Rossum)。1989 年圣诞节期间,在阿姆斯特丹,Guido 为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。之所以选中 Python(大蟒蛇的意思)作为该编程语言的名字,是取自英国 20 世纪 70 年代首播的电视喜剧《蒙提.派森的飞行马戏团》(Monty Python's Flying Circus)。
ABC 是由 Guido 参加设计的一种教学语言。就 Guido 本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是 ABC 语言并没有成功,究其原因,Guido 认为是其非开放造成的。Guido 决心在 Python 中避免这一错误。同时,他还想实现在 ABC 中闪现过但未曾实现的东西。
就这样,Python 在 Guido 手中诞生了。可以说,Python 是从 ABC 发展起来,主要受到了 Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell 和 C 的习惯。
Python 已经成为最受欢迎的程序设计语言之一。自从 2004 年以后,python 的使用率呈线性增长。Python 2 于 2000 年 10 月 16 日发布,稳定版本是 Python 2.7。Python 3 于2008 年 12 月 3 日发布,不完全兼容 Python 2。 2011 年 1 月,它被 TIOBE 编程语言排行榜评为 2010 年度语言。
由于 Python 语言的简洁性、易读性以及可扩展性,在国外用 Python 做科学计算的研究机构日益增多,一些知名大学已经采用 Python 来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用 Python 语言讲授。众多开源的科学计算软件包都提供了 Python 的调用接口,例如著名的计算机视觉库 OpenCV、三维可视化库VTK、医学图像处理库 ITK。而 Python 专用的科学计算扩展库就更多了,例如如下 3 个十分经典的科学计算扩展库:NumPy、SciPy 和matplotlib,它们分别为 Python 提供了快速数组处理、数值运算以及绘图功能。因此Python 语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。
下面我们介绍一下 Python 在 iTOP-4412 开发板上的移植过程:
92.4.1 下载源码包
去 Python 官网下载源码包 2.7.3,地址https://www.python.org/downloads/source/,或者使用压缩包中提供的源码。在网盘资料“iTOP4412开发板资料汇总(不含光盘内容)\iTOP-4412开发板系统开发资料\iTOP-4412开发板-linux系统-python移植教程_V1.0”目录下。
通过 ssh 将 Python-2.7.3.tar.bz2h 和补丁 Python-2.7.3-xcompile.patch 拷贝到ubuntu 系统的 home/miniLinux 目录下,使用命令”tar -vxf Python-2.7.3.tar.bz2”解压源码压缩包得到目录 Python-2.7.3。
92.4.2 编译 host 版解释器
编译 Python 的嵌入式版需要解释器解析 setup.py 从而编译 Python 的模块,因此需要先编译出 HOST 的解释器。
进入 Python-2.7.3 目录,执行命令”./configure”运行配置文件。
生成必要的 Makefile 等文件。
执行命令”make python Parser/pgen”,编译 PC 版 python Parser/pgen
执行命令”mv python hostpython”将生成的 PC 版移动至 hostpython执行命令”mv Parser/pgen Parser/hostpgen”将生成的 PC 版解释器移动至Parser/hostpgen
执行命令”make distclean”清除不必要的文件
92.4.3 打交叉编译补丁
交叉编译的补丁我们已经放到 minilinux 目录下,执行命令:
patch -p1 </home/minilinux/Python-2.7.3-xcompile.patch
进行打补丁。
92.4.4 交叉编译配置
在/home/miniLinux/Python-2.7.3#下执行以下命令进行设置
设置交叉编译器 “CC=arm-none-linux-gnueabi-gcc “
设置 C++交叉编译器 “CXX=arm-none-linux-gnueabi-g++”
设置 AR “ AR=arm-none-linux-gnueabi-ar”
设置 RANLIB “RANLIB=arm-none-linux-gnueabi-ranlib”
92.4.5 编译&安装
将压缩包中提供的编译好的 sqlite3 库 install_python 通过 ssh 拷贝到/home/minilinux 下;用户也可以自己编译 sqlite3 库,本文最后一小节介绍库的编译。
执行命令”cd /home/minilinux/Python-2.7.3”进入 Python-2.7.3,执行命令 vim setup.py 命令修改 setup.py。
在控制模式下输入 :/sqlite 搜索 sqlit 定位到 1024 行,向下找到 1044 行将 paths 改为install_python 所在路径。
此为作者路径“ '/home/minilinux/install_python' + '/include' ”,读者应根据自己的路径填写。
进入命令模式,输入/sqlit_python 定位到 1099 行,修改路径如下图。“'/home/minilinux/install_python' + '/lib' ” 。
执行命令”./configure --host=arm-none-linux-gnueabi --prefix=/python ”生成符合交叉编译器的 Makefile。
执 行 make 命 令 进 行 编 译 ”make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-none-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-none-linux-gnueabi- CROSS_COMPILE_TARGET=yes”
此时会提示缺失模块,忽略。
执行以下命令安装到指定文件:”make install HOSTPYTHON=./hostpython BLDSHARED="arm-none-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-none- linux-gnueabi- CROSS_COMPILE_TARGET=yes prefix=/home/minilinux/Python- 2.7.3/_install”。
其中 prefix=/home/minilinux/Python-2.7.3/_install 是指定的安装目录,用户根据实际情况更改。
使用命令”ls _install”查看结果:
执行命令”cp install_python/lib/libsqlite3.so.0 ./Python-2.7.3/_install/lib/”拷贝库文件 install_python/lib/libsqlite3.so.0 到/Python-2.7.3/_install/lib/下。
将_install 目录拷贝到开发板上的/data 目录下,笔者使用的是最小系统搭建的有 nfs 共享文件,用户也可以通过 U 盘拷贝过去。
用户使用 U 盘拷贝文件需要先将_install 进行压缩,使用命令”tar -cvf install.tar _install/”进行压缩,生成 install.tar 压缩包,使用 U 盘拷贝到开发板的/data 目录下进行解压。
在超级终端进入刚拷贝过来的_install 目录,使用命令
“export export LD_LIBRARY_PATH=/data/_install/lib:$LD_LIBRARY_PATH”
92.4.6 Python运行测试
进入_install/bin 目录下使用命令”./python”,然后使用 import 加载各模块如下图所示则 python 移植成功。
92.4.7 数据库测试
在提供的压缩包里提供的有 sqlite3 数据库的例程 sqlite3test.txt,例程解释如下。
执行命令”./python sqlite3test.txt” 可以看到生成了数据库文件 test.db 文件。
使用数据库查看软件查看到表中写入的数据如下。
92.4.8 time和datetime 测试
在提供的压缩包里提供的有 time 测试的例程 timetest.txt,通过 U 盘将测试例程拷贝到开发板的/data/_install/bin 下,执行命令“./python timetest.txt”可完成时间格式的转换和微秒级时间差的计算。
92.5 移植Sqlite3库
去 sqlite 官网下载最新的数据库,通过 ssh 拷贝到/home/minilinux 目录下,使用命令”tar -vxf sqlite-autoconf-3240000.tar.gz” 解压,如下图所示
解压后进入生成的生成 sqlite-autoconf-3240000,执行命令”./configure -- host=arm-none-linux-gnueabi --prefix=/home/minilinux/sqlite-autoconf- 3240000/install_python --enable-shared “
如下图所示,生成 Makefile 等必要文件,执行 make 命令进行编译。
执行命令 make install,会看到在 sqlite-autoconf-3240000 目录下产生文件夹install_python,执行命令”ls install_python”可以看到目录下有:bin include lib 三个文件夹。
至此 sqlite3 的库已经编译完成,用户需要其他的库文件也可以照此编译。
92.6 移植和使用modbus
本章介绍 modbus 库如何移植到 ARM 开发板上,以及如何使用测试程序。
92.6.1 什么是 modbus
网络上关于 modbus 介绍的文章非常多,还有专门介绍 modbus 的书籍,这些资料大家都可以利用起来,但是在这一小节中,作者希望帮助大家理解 modbus 的本质,modbus 到底是用来做什么,用来解决什么问题和存在的价值。
第一个要重点理解的是:modbus 是一个“纯数据协议”。
说到 modbus 协议,经常和 RS232 和 RS485 以及以太网联系到一起。那么 modbus 和RS485 协议有什么关系么?modbus 是纯粹的数据协议,和 RS232、RS485 和网络等协议没有一点关系,如果在串口 RS232 上使用 modbus 协议,modbus 只处理通过串口发送前和串口接收后的数据,串口只是在发送数据前使用 modbus 协议来转换数据,接收数据之后,将数据通过 modbus 协议转换出来。
第二个要重点理解的是:modbus 是一个“通用的纯数据协议”。
怎么理解通用的数据协议呢?作者在读书的时候,刚开始学习嵌入式,使用的是 51 单片机,当时要调试程序的时候,一般执行到哪一步,就点亮一个灯或者拉高一个 IO,后来觉得通过“点灯”调试程序是在太慢了,于是自己定义了“串口数据协议”,例如:执行到某一段代码,我就打印 0x01,这段代码出现错误就打印 0x02...现在大家学习了 linux,都知道 linux 控制台了,linux 控制台对于程序员来说,主要就是用来调试程序的,带代码中添加 print 函数就可以实现控制台打印字符串。
那么作者当年自己定义的“串口数据协议”,就不是一个通用的协议,只能自己使用,但是 linux 控制台,无论哪一个 linux 工程师,操作的方式都是类似的。那么 linux 控制台,在所有的 linux 设备上使用方法就是通用的。
modbus 可以类比为普通话,如下对应关系:
福建人→闽南语→普通话
广东人→粤语→普通话
东北人→东北话→普通话
四川人→四川话→普通话
“福建人”比作“RS232”,“广东人”和“东北人”比作 RS485,“四川人”比作“以太网”...那么“普通话”就是 modbus 协议。modbus 协议和“人”这个硬件没有关系,和“人”的说法方式没有关系,甚至机器人只要发声是“普通话”,这个普通话也是modbus 协议。
网上关于 modbus 的资料很多,有不少资料将 modbus 和 RS232 绑定,这一点是完全错误的,请大家务必注意,modbus 只是一个“通用的纯数据协议”。
modbus 是用于工业现场的总线协议,它不仅仅是在 PLC 或者单片机上可以使用,在任何可以跑代码的电子设备上都可以使用,因为 modbus 对硬件没有任何定义。当然, modbus 应用范围主要是在工业控制上。如果每一台工业控制设备,都有一种自定义的协 议,那将是很恐怖的,modbus 协议可以用在所有控制设备上,所有的工业控制设备都可以兼容 modbus 协议。
modbus 的本质是一个通用的纯数据协议,modbus 是用来规范工业现场各种控制设备的通信协议,通过 modbus 协议,控制设备通过网络(RS485 和以太网等)可以和其它设备之间通信,不同厂商的设备生产的设备可以很方便的连成工业网络。
92.6.2 modbus源码下载
可以从 libmodbus 官网 http://libmodbus.org/download/下载 3.1.4 版本,也可以用迅为提供的下载好的源码。在网盘资料“iTOP4412开发板资料汇总(不含光盘内容)\iTOP-4412开发板系统开发资料\iTOP-4412开发板-modbus移植和使用文档_V1.0”目录下。
作者将“libmodbus-3.1.4.tar.gz”下载,打包在“topeet_modbus.tar.gz”中,其中还有移植好文件。
92.6.3 交叉编译modbus源码
交叉编译使用的编译器是“arm-2009q3”,如下图所示。
通过 ssh 将下载好的源码压缩包“libmodbus-3.1.4.tar.gz”拷贝到 Ubuntu 上,使用命令“tar -vxf libmodbus-3.1.4.tar.gz”解压,解压后生成目录“libmodbus-3.1.4”,如下图所示。
使用命令“mkdir install”,新建 install 路径,用以安装生成的文件,如下图所示。
进入 libmodbus-3.1.4,执行命令:
./configure ac_cv_func_malloc_0_nonnull=yes -- host=arm-none-linux-gnueabi --enable-static --prefix=/home/minilinux/install/ 。
Host=后面的是编译器前缀,
--prefix=后面的是安装目录,可根据自己环境确定,如下图所示。
如下图所示,执行完毕。
执行编译命令“make”,如下图所示。
编译完成,如下图所示。
执行安装命令“make install”,则安装到./configure 指定的目录,作者这里是“/home/minilinux/install/”目录,如下图所示。
安装完成,如下图所示。
查看安装目录 install,在 install 生成三个目录:include、lib、share,如下图所示。
如下图所示,使用 file 命令查看 lib 目录下的库文件,可以发现其中的文件是 arm 架构的。
将编译出来的 lib 路径下的所有文件拷贝到开发板的“/lib”目录下。至此,modbus 的 arm-linux 的库文件编译完成。
92.6.4 开发板arm的测试程序
进入目录/home/minilinux/libmodbus-3.1.4/tests/,查看测试程序 random-test- server.c,如下图所示,已经编译出来了,但是还是需要修改一下源码中的几个参数,重新编译。
输入命令 vim random-test-server.c 打开测试程序,里面 23 行ctx =modbus_new_tcp("127.0.0.1", 1502); 改成 ctx = modbus_new_tcp(NULL, 1502); 即 server 监控所有的 ip 地址,端口是 1502。
然后执行命令交叉编译命令
arm-none-linux-gnueabi-gcc -o random-test-server random-test-server.c -L/home/minilinux/install/lib -lmodbus -I/home/minilinux/install/include/modbus 生成可执行文件 random-test-server,如下图所示。
如下图所示,可执行文件是 arm 架构的。
至此,arm 服务端的测试例程“random-test-server”编译完成。
92.6.5 x86-linux的modbus 移植和编译
在 minilinux 目录下再建一个文件夹,用于放 modbus 的 x86 的文件,如下图所示,使用命令“tar -vxf libmodbus-3.1.4.tar.gz -C x86-modbus/”,将源码解压到这个目录下。
进入解压出来的“/home/minilinux/x86-modbus/libmodbus-3.1.4”目录,如下图所示,执行命令“./configure”,不用加任何参数,默认就是 GCC-x86 配置。
配置完成,如下图所示。
执行“make”编译命令,然后执行安装命令“make install”,安装完成,如下图所示。
进入 test 目录,前面我们编译的 arm 下的测试程序是 server,那么 Ubuntu 下运行的就应该是 client 客户端,如下图所示。
客户端需要服务端的 IP 地址,如下图所示,作者的服务端(也就是开发板端)IP 是“192.168.2.20”。
接着,修改 x86-modbus 目录下的“random-test-client.c”文件,使用 vim 命令打开random-test-client.c 文件,将
ctx = modbus_new_tcp("127.0.0.1", 1502);
改成
ctx = modbus_new_tcp(开发板 IP, 1502);
如下图所示,然后保存退出。
执行命令:
gcc -o random-test-client random-test-client.c `pkg-config --libs --cflags libmodbus`
编译生成 random-test-client 可执行文件,如下图所示,编译出的可执行文件是 x86 的。
至此,x86 上的测试程序编译完成。
92.6.6 测试
首先确保开发板和虚拟机 Ubuntu 可以 ping 通,如下图所示,作者虚拟机的 IP 为“192.168.2.200”,通过开发板可以 ping 通 Ubuntu。
其次,注意将前面编译出的 arm 的库文件拷贝到开发板上,如下图所示。
在开发板上运行服务端程序,如下图所示。
在虚拟机 Ubuntu 上运行客户端程序“./random-test-client”,运行完毕如下图所示
服务端运行完毕,如下图所示。
至此,modbus 的移植和测试完成。