Linux 可以使用 CPU 内核作为微控制器吗?

Linux 可以使用 CPU 内核作为微控制器吗?

如我错了请纠正我:

据我在网上搜索,微控制器(如 Arduino)和 SBC(如 Raspberry Pi)之间的主要区别在于,微控制器是原子的,这意味着它逐行运行代码,不执行任何其他操作,没有延迟。但是SBC(例如RPi)运行一个操作系统,并且操作系统不是原子的,这意味着它将安排您的代码运行,因为操作系统还必须执行其他工作,您的代码可能会延迟运行,具体取决于如何操作系统很忙。

因此,对于一些项目,例如飞行控制器,我们应该使用微控制器,以便无人机能够立即对我们的命令和传感器数据做出反应,没有任何延迟。

有些主板(例如 BeagleBone)具有能够运行操作系统的 CPU,以及一个或多个能够执行原子操作的微控制器。这意味着您可以用一块板获得两个世界。

现在这是我的问题:

在运行Linux操作系统的多核CPU上,我们可以告诉Linux内核只为一个进程保留一个核心吗?假设我有一个在 Raspberry Pi 上控制无人机的 Python 程序,我可以告诉 Linux 为自己使用四个核心中的三个,并为我的飞行控制器程序使用一个核心吗?我说得有道理吗?

我知道 Linux 作业优先级和一些实时 Linux 内核,但我还没有详细研究这些选项。我将不胜感激有关此主题的任何指导,谢谢。

答案1

原则上,微控制器与通用 CPU 没有什么不同。微控制器还处理中断,这会抢占代码流,因此您不能指望精确的周期计时。您还可以在微控制器上安装调度程序,这取决于操作系统。您提到的 Beaglebone 上的可编程实时单元 (PRU) 是一个非常专业的处理器,专为周期精确操作而设计,而不是“普通”微控制器。

您也许能够将进程固定到特定的 CPU 核心,但这并不意味着该进程可以获得对核心的独占访问权限。在 Linux 上你真正想要的是实时调度。只需对控制过程使用更高的优先级,您就可能会成功。

答案2

事实证明,我的想法是有可能的(但很复杂)。

我们有两种方法告诉 Linux 将一个或多个 CPU 从其正常的进程调度中排除。

  1. 启动isolcpus选项(文档

  2. Linux 特定的cpusets(文档

之后,程序可以通过以下系统调用告诉 Linux 它想要在该 CPU 上运行:

#define _GNU_SOURCE
#include <sched.h>

int sched_setaffinity(pid_t pid, size_t len, cpu_set_t *set);

这样,特定的 CPU(或多个 CPU)将仅用于该进程(或多个进程)。

相关内容