想用S1作为机器人的控制器,为了控制机器人的关节伺服运动,需要跑Ethercat主站,为此需要构建实时操作系统。
本文移植xenomai,通过在linux的基础上添加一个RTOS内核cobalt,来提高linux的实时性。实时内核cobalt与非实时内核linux相结合,既能提供工业级RTOS的硬实时性能,又能利用linux操作系统非常出色的网络和图形界面服务,结构如下:
其中硬件抽象层ADEOS(ipipe-core或者dovetail)与硬件架构和具体linux版本相关,S1的linux内核版本为5.10.110。xenomai官方提供移植好dovetail的linux内核版本最为接近的是5.10.73。因此有两个方案:
一、 在官方移植好的linux内核版本适配SiRider S1开发板
二、 将xenomai官方在linux5.10.73的移植改动,移植到SiRider S1的内核
两种方案都有不小的移植难度,还有移植失败的风险。方案二的工作难度貌似小一些,本文选择方案二。
第一步、下载xenomai提供的基于5.10.76版本移植好dovetail的源码linux-dovetail-v5.10.76-dovetail3.tar.gz和linux 5.10.76内核源码以及linux5.10.110内核源码,用beyond compare 对比,发现移植dovetail需要改动的文件巨多。将改动移植到S1的内核时候,还要合并5.10.110对5.10.76的差异改动、以及SiRider S1内核与原生5.10.110内核的区别,移植工作量巨大。
第二步、移植
经过n多天的移植,调试。终于。。。。。。内核编译不报错了。
第三步、将xenomai导入到上述内核源码中
下载xenomai-v3.2.1源码,将源码放在se1000-sdk/src/kernel目录下,并解压.
导入内核,执行
cd se1000-sdk/src/kernel
sudo ./xenomai-v3.2.1/scripts/prepare-kernel.sh --arch=arm64
配置内核,执行
sudo make menuconfig
看到Xenomai已经导入到内核中了。
配置内核的过程中发现,CPU frequencu scaling、ACPI 下的Processor、CPU Idle等这些的影响实时性的选项竟然关不掉,这些先不管,以后再研究吧。
第四部、编译内核
cd se1000-sdk
Sebuilder lun0
lun0_fpt.bin包含了Ubuntu的内核和文件系统,这里只需要重新编译lun0即可。
这里吐槽下sebuilder的编译工具,如果编译失败,重新再编译,中间文件会变得越来越大,这个估计是缓存文件,建议编译工具编译前清理相关的缓存文件。
第五步、下载
按照文档《UG_SE1000_Download_Tool_User_Guide》使用PC端工具 下载lun0,重启。
启动过程停在下图位置,内核启动失败。。。。
就猜到移植过程不会这么顺利,还得再深入研究。
只是一个月测评时间到了,先提交测评报告吧。后续内核移植的进展再发布出来。