Orangepi实时性能优化
- 提高实时性的方法
- 打内核 RT 补丁、使用 wiringpi 包 解决卡顿问题
- 使用 "isoclpus =xx" 禁用核心 解决卡顿问题
- 问题解析!
- cmdline.txt问题
- 写入 /proc/cmdlline 文件出错
提高实时性的方法
首先,本人使用的是 orangepi one (就像下面的一样) 使用的是 Linux系统。
我们都知道 Linux 系统并不是硬实时系统,有时系统会先处理一些其他的事情从而暂缓处理用户的程序,而我最近想用 orangepi one 来调试 MPU6050,发现程序一直发现卡卡的,如果我用 stm32 来处理当然容易, 几个中断,再分配一下优先级基本就解决卡顿的问题了,但是现在使用的是Linux系统,所以我就在网上搜索如何增加 Linux 系统的实时性。Orangepi 的同类产品当然就是树莓派啦!于是我就在网上搜索"如何提高树莓派的实时性"。
给出的答案是这样的
- 第一种方法:在 /boot/cmdline.txt 最后一行里面添加 isolcpus=xx(你想要禁用的核心) 然后把你需要的任务安排在禁用的核心上,这样你的任务就绑定了一个独立 CPU 核心。意味着这个 CPU 核心基本就只执行你这个任务啦,这样就达成了提高实时性的需求。
- 第二种方法:打内核 RT 补丁。据说是这样的,他们提供一个最底层的精简的调度器,然后每有一个实时任务的时候,就会打断正在执行的任务从而转向执行实时任务,然后执行完成后,其他任务再执行。
- 第三种方法:使用wiringpi包,这个包简单来说就是改变了当前进程的调度策略及优先级。使用 import wiringpi 来给你的 python 代码添加这个包。
基本上就是以上这三种方法来提高实时性了。其实把,我觉得只有第一种方法能够最大限度地提升程序的运行效率诶。因为你看这块芯片都给你让出一个核心了,意味着你的程序不需要和别人抢饭吃了(好耶!)
打内核 RT 补丁、使用 wiringpi 包 解决卡顿问题
因为我没用过,所以不写这段了,你们可以去看看其他博主的文章吧
使用 “isoclpus =xx” 禁用核心 解决卡顿问题
首先,如果看过 orangepi 的用户指南,那么应该对 orangepiEnv.txt 文件不陌生,因为开 i2c 和 uart 的接口都是要在这个文件里面写上一段解锁代码的,然后你的板子就能够在特定的接口识别到外部设备了。我起初以为这个文件也可以控制 CPU 的核心调度,于是我就在 orangepiEnv.txt 文件下加了一段 isoclpus =3(0 ~ 3分别代表1 ~ 4),这里表示我想要禁用 CPU 的核心4,但是重启后发现没用…。👇👇你看下面的图👇👇,四个核心都有在运行任务啊~。看来,失败了。
然后我就继续寻找解决办法,在一片博客下面发现,要在 boot 文件夹下的 cmdline.txt 中加上 isoclpus = xx 才能够成功禁用核心!好耶!我立马就去看!然后发现在orangepi one 的 boot 文件夹下并没有 cmdline.txt 文件,我反复看了几遍后确定没有这个文件👇
后面经过我不懈的努力,终于在 /proc 文件夹下发现了 cmdline 文件,虽然没有 .txt 的后缀,但是应该不影响,然后我就直接,sudo vim cmdline,然后在最后加上了 isoclpus = 3,后面发现保存失败了!👇👇并且报错这个👇👇
E45: ‘readonly’ option is set (add ! to override)
检查后发现这个文件是只读的!没关系。我用 sudo chmod a+w cmdline 这条语句给他加上权限!然后继续 sudo vim cmdline,但是依旧失败了!👇👇他说这个👇👇
“cmdline” E667: Fsync failed
WARNING: Original file may be lost or damaged
don’t quit the editor until the file is successfully written!
原来这个文件是个空的文件啊!!!这个文件可能已经被删除了!?
但是,依旧别伤心!我直接去官网看!👇👇在 orangepi 的官网我发现了这么一段话。👇👇
官方的意思大概是这样的,这个版本的 uboot 支持 boot.scr ,…巴拉巴拉讲一堆…, 然后最后一段最重要的话的意思是: boot.scr 包含了加载 script.bin、内核所需的 uboot 命令。 initrd(可选),设置内核参数和引导。 也许我们可以将我们的 isoclpus = 3 放进去?也许有用??让我们试一下吧!
经过我的不断试错,我直接告诉你们答案:首先你得去 /boot 目录下 然后你们需要把 isolcpus = xx 放进 boot.cmd 中的 setenv bootargs 的任意一个位置里。👇👇就像下面的一样👇👇。
然后和官网的操作一样,运行这一段话进行编译!!然后 reboot 重启看看
mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
惊喜!!!好像成功了!我把第四个核心禁用了,果然在 htop 里面第四个核心没有任务正在进行!!
问题解析!
cmdline.txt问题
首先引导分区中的文件 “cmdline.txt”(在引导系统中显示为文件夹)是树莓派的东西,而不是linux的标准(该文件由 树莓派的引导加载程序读取,这是树莓派的板子独有的)。 Linux 中的文本文件没有任何“.txt”扩展名。
写入 /proc/cmdlline 文件出错
/proc/cmdline 是由内核创建的只读和虚拟文件,用于以简单的方式与应用程序通信数据,就像 /proc 和 /sys 中的所有其他内容一样,编辑器无法读取它,我们也是无法更改它的!
不同的设备有不同的方式来启动 Linux 系统,orangepi 官方提供了文档让我观看,发现把我的命令添加到boot.cmd,然后执行编译将文本文件转换为 boot.scr 文件。重启,解决!
下一阶段就开始编写程序并把它放在第四核心上运行!试一下是不是真的实时!!