STM32MP157+Preemptive-RT实时核+igh安装过程详细记录

注:以下为本人操作安装过程中的过程记录,由于时间有限,个别地方可能没有很连贯,同时,该安装过程中有部分问题由于过去时间太久没记录下来,如在安装过程中遇到问题还需自行上网解决,敬请谅解!!!

参考博客

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 /icon-default.png?t=N7T8http://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

调整后磁盘空间如下图所示。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
preempt-rt是一个在Linux操作系统内中实施实时(real-time)功能的一个软件补丁(patch),用于提高Linux操作系统的实时性能。在普通的Linux内中,时间分片是通过时间片轮转法来实现的,这意味着任务可能会在中断的时候被打断,从而导致实时任务无法按时完成。而preempt-rt补丁则引入了抢占式调度(preemptive scheduling),可以在高优先级实时任务到来时,立即中断低优先级任务,从而确保实时任务按时完成。 preempt-rt补丁还引入了一些改进,比如提高了中断处理的实时性,减少了中断的延迟。此外,它还改进了内对多处理器的支持,能够更好地利用多处理器的性能,提高系统的响应能力。这使得Linux操作系统可以用于处理实时应用,比如工业控制、自动驾驶和机器人等领域。 preempt-rt补丁不仅仅是一个补丁,它还需要与其他实时工具和库一起使用,比如实时定时器和实时优先级调度策略等,来共同实现实时功能。有了preempt-rt补丁,Linux操作系统就可以满足实时性要求更高的应用需求,使得开发者可以更自由地选择Linux平台来开发实时应用。 但是需要注意的是,preempt-rt补丁并不适用于所有场景。由于引入了更严格的实时约束,它可能导致系统的稳定性下降,对内存和处理器资源的需求也相应增加。因此,在使用preempt-rt补丁时,需要对系统进行全面评估,并根据实际需求进行权衡。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值