注:以下为本人操作安装过程中的过程记录,由于时间有限,个别地方可能没有很连贯,同时,该安装过程中有部分问题由于过去时间太久没记录下来,如在安装过程中遇到问题还需自行上网解决,敬请谅解!!!
参考博客
TI5728的igh ethercat master 移植_ti 观测器移植-CSDN博客
stm32mp157 rt-preempt测试-CSDN博客
【全志T113-S3_100ask】SD卡扩容_gdisk安装-CSDN博客
一、PREEMPT_RT实时核的安装
1.1 总思路
在STM32MP157上安装具有实时核的Ubuntu系统的总思路是在一台x86架构且装有Ubuntu系统的电脑中下载并解压好相关资源,然后给内核源码打实时核补丁,设置编译环境,编译内核,生成内核镜像文件和设备树,并使用新生成的内核镜像和设备树来替换SD卡的bootfs分区中原有文件,再将SD卡的rootfs分区中文件替换为Ubuntu18.04.5-base系统文件压缩包解压出的文件,随后使用该SD卡启动开发板,成功进入系统界面后查看内核,最后进行实时性测试。
1.2 具体步骤
(1)将出厂系统烧写至SD卡中(这里选择atk_sdcard-stm32mp157d-atk-qt.tsv进行烧写),以获得完整的磁盘分区。
**************************************************************************************************************************************以下操作为虚拟机上的操作
(2)给Linux内核源码打实时核补丁
下载补丁
补丁下载地址:Index of /pub/linux/kernel/projects/rt/5.4/older/
将实时补丁下载并放在与内核源码同一文件夹下。
打补丁
linux-5.4.31 为内核源码
patch-5.4.34-rt21.patch 为补丁文件
cd linux-5.4.31
patch -p1 < ../patch-5.4.34-rt21.patch
(3)Linux 源码根目录下新建shell 脚本并编译内核。
vi stm32mp157d_atk.sh
输入如下指令:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp1_atk_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- uImage dtbs
LOADADDR=0XC2000040 -j16 (w+q保存)
chmod 777 stm32mp157d_atk.sh
./stm32mp157d_atk.sh
编译过程中会弹出图形化配置界面,
在General setup->Preemption Model选择(X) Fully Preemptible Kernel (Real-Time)
然后保存退出,最终会生成实时系统镜像uImage和设备树
(4)下载解压Ubuntu系统,并给其安装基础资源包。
根 文 件 系 统 下 载 地 址 为 Index of /http://cdimage.ubuntu.com/ ,点击进入按下图所示操作。
点击release,进入下载界面进行下载。
cd /home/lzh/linux/nfs
mkdir ubuntu_rootfs
将上一小节下载得到的“ubuntu-base-18.04.5-base-armhf.tar.gz”拷贝到上面创建的
“ubuntu_rootfs”目录中,然后使用如下命令对其解压缩:
sudo tar -vzxf ubuntu-base-18.04.5-base-armhf.tar.gz
(5)在 PC 的 Ubuntu 上安装 qemu 工具
sudo apt-get install qemu-user-static
将刚刚安装的 qemu-user-static 拷贝到刚刚解压出来的 ubuntu base 目录中,也就
是 ubuntu_rootfs/usr/bin 目录下,命令如下:
cd /home/lzh/linux/nfs/ubuntu_rootfs
sudo cp /usr/bin/qemu-arm-static ./usr/bin/
(6)将 Ubuntu 主机下的 DNS 配置文件/etc/resolv.conf 拷贝到根文件系统中
cd /home/alientek/linux/nfs/ubuntu_rootfs
sudo cp /etc/resolv.conf ./etc/resolv.conf
(7)制作ubuntu base根文件系统
再编写一个卸载的脚本文件,新建名为 unmount.sh 的 shell 脚本,在里面输入如下所示
内容:
#!/bin/bash
echo "UNMOUNTING"
sudo umount /home/alientek/linux/nfs/ubuntu_rootfs/proc
sudo umount /home/alientek/linux/nfs/ubuntu_rootfs/sys
sudo umount /home/alientek/linux/nfs/ubuntu_rootfs/dev
sudo umount /home/alientek/linux/nfs/ubuntu_rootfs/dev/pts
在ubuntu_rootfs 目录下创建一个名为 mount.sh 的 shell 脚本,然后在里面输入如下所示
内容:
#!/bin/bash
echo "MOUNTING"
sudo mount -t proc /proc /home/alientek/linux/nfs/ubuntu_rootfs/proc
sudo mount -t sysfs /sys /home/alientek/linux/nfs/ubuntu_rootfs/sys
sudo mount -o bind /dev /home/alientek/linux/nfs/ubuntu_rootfs/dev
sudo mount -o bind /dev/pts /home/alientek/linux/nfs/ubuntu_rootfs/dev/pts
sudo chroot /home/alientek/linux/nfs/ubuntu_rootfs
再编写一个卸载的脚本文件,新建名为 unmount.sh 的 shell 脚本,在里面输入如下所示
内容:
#!/bin/bash
echo "UNMOUNTING"
sudo umount /home/alientek/linux/nfs/ubuntu_rootfs/proc
sudo umount /home/alientek/linux/nfs/ubuntu_rootfs/sys
sudo umount /home/alientek/linux/nfs/ubuntu_rootfs/dev
sudo umount /home/alientek/linux/nfs/ubuntu_rootfs/dev/pts
最后给予 mount.sh 和 unmount.sh 这两个 shell 脚本可执行权限并执行,命令如下:
sudo chmod 777 mount.sh unmount.sh
./mount.sh
这样,当前终端就可以将根文件系统切换到我们上面制作的 ubuntu_rootfs 根文件系统中。出现如图结果,即成功挂载文件系统
安装常用的命令和软件:
apt update
apt install sudo
apt install vim
apt install kmod
apt install net-tools
apt install ethtool
apt install ifupdown
apt install language-pack-en-base
apt install rsyslog
apt install htop
apt install iputils-ping
apt install systemd
apt install udev
#设置 root 用户密码和新建用户:
passwd root //设置 root 用户密码
#输入“passwd root”以后会让你输入 root 用户密码,输入两次。
#因为登录开发板的文件系统要用普通用户进行登录,所以也新建一个普通用户并设置
#密码,命令如下:
adduser jnu
#设置本机名称和 IP 地址:
#输入如下命令设置本机名称和 IP 地址:
echo "jnu" > /etc/hostname
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 jnu" >> /etc/hosts
#设置串口终端:
#ubuntu 根文件系统在开发板上启动以后我们通常也希望串口终端正常工作,这里根据网友
#的介绍需要创建一个链接。首先确定自己所使用的串口设备文件,比如正点原子的 stm32mp157
#开发 板 使 用 的 UART4 对 应 的 串 口 设 备 文 件 为 ttySTM0 , 我 们 需 要 添 加
#一 个 名 为 getty@ttySTM0.service 的链接,链接到 getty@.service 服务上,输入如下命令:
ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttySTM0.service
#设置好以后就可以退出根文件系统了,输入如下命令退出:
exit
#退出以后再执行一下 unmount.sh 脚本取消挂载,命令如下:
./unmount.sh
至此,ubuntu base根文件系统就已经制作好了,接下来就是挂载到开发板上去测试。
(8) 将烧录了出厂系统的SD卡中的bootfs与rootfs分区中的文件更换为上述步骤中的文件。
****************************************************************************************************************************************以下为开发板上操作
注意开发板一定要连路由器,这样才能访问外网使用apt命令下载资源包!!!
(9) 使用SD卡启动,进行实时性测试
将电脑和开发板分别连接在同一个路由器下,即使他们在同一网段下。再将SD卡插入TF卡插槽,设置好拨码开关后,复位启动,然后一直按回车键进入uboot模式。
进入uboot模式后,输入以下命令:
setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk2p3 rootwait rw'
saveenv
boot
即可成功进入ubuntu系统。
默认情况下新用户是不能使用 sudo 命令的,即使你输入了密码也不能使用 sudo,会
提示“alientek is not in the sudoers file. This incident will be reported.”错误。
按如下命令操作:
su
chmod u+w /etc/sudoers
jnu ALL=(ALL:ALL) ALL
修改完成以后保存退出,重新恢复/etc/sudoers 的只读属性,使用如下命令:
chmod u-w /etc/sudoers
这时还无法使用ping通外网,需要进行相关配置:
#我们默认没有配置 DHCP,因为 ubuntu 启动以后不能直接联网,需要手动启动网卡并设置 IP 地址。这里我#们配置一下网络DHCP,这样系统启动以后就会自动设置好网络。正点原子MP157 开发板只有 1 个网卡,在 #linux 系统下的网卡名字为 eth0,我们以 eth0 为例,讲解一下如何配置其 DHCP,输入如下命令:
su
echo auto eth0 > /etc/network/interfaces.d/eth0
echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
/etc/init.d/networking restart
#设置好以后重启开发板, eth0 网卡就会默认打开。
但是经过测试,网络仍然有问题 。经过检查,发现是DNS服务器无法解析域名。
#systemd-resolved服务通常用于系统的 DNS 解析,但在标准的桌面安装中,NetworkManager 可能已经集成#了对 DNS 的管理,因此 systemd-resolved 可能处于禁用状态。我这里安装的Ubuntu18.04,使用的网络管#理服务是systemd-resolved。系统网络管理服务的确认可以通过查看当前正在运行的服务来实现。你可以使##用以下命令来检查:
systemctl status systemd-resolved
#按照如下操作修改DNS服务器并重启systemd-resolved服务:
sudo vi /etc/systemd/resolved.conf
修改DNS=114.114.114.114 8.8.8.8
保存退出
#重新启动systemd-resolved服务:
sudo systemctl restart systemd-resolved
网络正常后,接下来使用apt指令安装make、gcc等安装包,至此,PREEMPT-RT安装及开发板环境配置完成。
进行实时性测试:
sudo apt-get install rt-tests
cyclictest参数说明如下图所示。
测试结果:
二、EtherCAT_Igh主站的安装
在已经加入实时核的Linux系统下安装EtherCAT_Igh主站的安装步骤如下所述:
Igh的安装分为虚拟机操作和开发板操作两部分。
*************************************以下操作在虚拟机端执行
将实时内核源码文件移至根文件目录/下,记录该内核源码所在目录为kernel_path,我这里就是/5.4.31-rt21。
#把ethercat_igh_github.tar.gz 放在根目录下并解压,
tar xzvf ethercat_igh_github.tar.gz
cd /ethercat_igh_github
./bootstrap
./configure --with-linux-dir=kernel_path --enable-8139too=no --enable-wildcards=yes --prefix=/opt/etherlab
目前碰到的错误需要安装(sudo apt-get install libtool、sudo apt-get install autoreconf)
#编译配置好的igh:
make -j4
make modules -j4
#编译通过会对应生成
#ethercat_igh_github/devices/ec_generic.ko和ethercat_igh_github/master/ec_master.ko
sudo make install
sudo make modules_install
#安装完成后,会在/opt/目录下生成一个etherlab文件夹,其中包括igh ethercat的库文件。在etherlab目##录下创建modules文件夹,并复制ec_generic.ko和ec_master.ko到modules下。
#然后使用scp命令将虚拟机/opt下的etherlab文件夹传输至开发板的/opt下。
#命令如下:
scp -r /opt/etherlab jnu@192.168.1.105:/opt
#注意:这个jnu是我的用户名,大家要对应的更改,@后的ip地址是大家开发板的ip地址。
*************************************以下操作在STM32MP157开发板进行
cd /opt/etherlab
#修改ethercat配置文件
sudo vim etc/sysconfig/ethercat
在MASTER0_DEVICE=“”填写希望配置成以太网网卡MAC地址(这里就填写开发板的网口的MAC地址),同时DEVICE_MODULES一栏,改为DEVICE_MODULES=“generic”,再按“ :键 ”+ “w键” +“ q键”保存并退出。
#在/etc目录下新建一个sysconfig文件夹,将修改后的ethercat文件复制到刚刚新建的文件中:
sudo mkdir /etc/sysconfig/
sudo cp /opt/etherlab/etc/sysconfig/ethercat /etc/sysconfig/
sudo ln -s /opt/etherlab/etc/init.d/ethercat /etc/init.d/
#检测模块的相依性,以供modprobe在安装模块时使用:
sudo depmod
#注意,这里我遇到了warning,我无视了,不清楚后续有无影响,目前没有问题。
#启动主站
/etc/init.d/ethercat start
#如果安装没有问题,会出现下面的提示:
Starting EtherCAT master 1.5.2 done
#让igh ethercat控制台工具能够直接在命令行运行
sudo ln -s /opt/etherlab/bin/ethercat /usr/local/bin/ethercat
#运行程序时,要打开/dev/EtherCAT0文件需要root权限,为了不每次都手动修改权限,进行设备权限设置
sudo vim /etc/udev/rules.d/99-ethercat.rules
#(这句如果报错,就自己创建该文件,再vim进去)
#添加如下的内容:
KERNEL=="EtherCAT[0-9]",MODE="0777"
#再按 :键 + w键 + q键保存并退出。
sudo udevadm control --reload-rules
sudo reboot
#设置EtherCAT 主站的开机自启动功能
sudo ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
sudo vim /etc/systemd/system/rc-local.service
#在文件末尾增加:
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
#再按 :键 + w键 + q键保存并退出。
#创建/etc/rc.local文件并对它进行编辑
sudo touch /etc/rc.local
sudo vim /etc/rc.local
#添加以下内容:
#!/bin/bash
sudo /etc/init.d/ethercat start
#再按 :键 + w键 + q键保存并退出。
#为rc.local文件增加可执行权限:
sudo chmod +x /etc/rc.local
#做完这一步后,把ubuntu重启就可以自启动ethercat。
sudo reboot
至此,整套机器人控制器环境搭建介绍结束。
补充:
使用SD卡启动时,查看磁盘空间发现并没有8GB,如下图所示。
按照如下操作进行SD卡扩容:
安装gdisk命令:sudo apt install gdisk
输入如下指令调整磁盘空间:resize2fs /dev/mmcblk2p3
调整后磁盘空间如下图所示。