大家常用的Linux系统基本是分时系统,任务调度比较慢,当处理紧急的任务的时候可能就会捉襟见肘了。比如,EtherCAT。之前公司使用和Linux非常类似的QNX操作系统,实时性较好,不过昂贵的费用却让小公司望而却步。这里给大家介绍免费的嵌入式Real-time Linux开发的方案,就是PREEMPT_RT Linux项目,这个也是开源Linux项目之一。
给嵌入式设备开发实时内核的话,首先确定设备的内核版本。
查看Linux内核版本命令:
root@myir:~# cat /proc/version
Linux version 5.4.31 (oe-user@oe-host) (gcc version 9.3.0 (GCC)) #1 SMP PREEMPT Tue Nov 2 07:05:34 UTC 2021
root@myir:~# uname -a
Linux myir 5.4.31 #1 SMP PREEMPT Tue Nov 2 07:05:34 UTC 2021 armv7l armv7l armv7l GNU/Linux
然后,在开源Linux项目网站上找对应的内核补丁包。
有两个git存储库托管着Linux主线内核版本的源代码,并附加了PREEMPT_RT补丁。
http://git.kernel.org/cgit/linux/kernel/git/rt/linux-rt-devel.git
http://git.kernel.org/cgit/linux/kernel/git/rt/linux-stable-rt.git
第一个补丁包含当前开发的PREEMPT_RT补丁和相应的Linux主线源代码。当焦点切换到下一个主线版本时,特定版本的开发通常会停止。一旦一个新的稳定的候选者被释放,这种情况就会发生。在此之后,开发版本被转移到第二个存储库,并由Steven Rostedt维护。第一个git库的维护者是Sebastian Siewior和Thomas Gleixner。
PREEMPT_RT补丁的不同版本还可以作为tar球使用。它们托管在kernel.org网站上。
https://cdn.kernel.org/pub/linux/kernel/projects/rt/
下载好实时内核补丁以后,针对嵌入式arm板的内核源码打实时补丁。可以使用patch,或者手动修改源码。
配置内核
交叉编译内核,解决编译问题。下载验证。
将编译生成的内核文件,拷贝到arm板对应的目录下面。注意加rt补丁号。比如:5.4.31-rt20
可以看到驱动模块成功加载,并且版本名字也改为实时Linux版本。
注意:
不要把实时内核里面的文件拷贝到之前的内核文件夹中,比如5.4.31。否则会有模块无法加载的问题。执行sudo dmesg命令,会有disagrees about version of symbol module_layout的错误。