Kernel

Linux 可以使用 CPU 核心作為微控制器嗎?

  • July 17, 2021

如我錯了請糾正我:

據我在網上搜尋,微控制器(如 Arduino)和 SBC(如 Raspberry Pi)之間的主要區別在於微控制器是原子的,這意味著它逐行執行您的程式碼,並且什麼也不做,沒有延遲。但是 SBC(例如 RPi)執行作業系統,並且作業系統不是原子的,這意味著它將安排您的程式碼執行,因為作業系統也必須執行其他工作,您的程式碼可能會延遲執行,具體取決於如何作業系統很忙。

因此,對於某些項目,例如飛行控制器,我們應該使用微控制器,這樣無人機就會立即對我們的命令和感測器數據做出反應,而不會有任何延遲。

有一些像 BeagleBone 這樣的板子有一個能夠執行作業系統的 CPU,以及一個或多個能夠執行原子操作的微控制器。這意味著您可以通過一塊板獲得兩個世界。

現在這是我的問題:

在執行 Linux 作業系統的多核 CPU 上,我們可以告訴 Linux 核心為一個程序保留一個核心嗎?假設我有一個控制 Raspberry Pi 上的無人機的 Python 程序,我可以告訴 Linux 為自己使用四個核心中的三個,而只為我的飛行控制器程序使用一個核心嗎?我說得有道理嗎?

我知道 Linux 工作優先級和一些實時 Linux 核心,但我沒有詳細研究這些選項。我將不勝感激有關此主題的任何指導,謝謝。

事實證明,我的想法是有可能的(但它很複雜)。

我們有兩種方法可以告訴 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)將僅用於該程序(或程序)。

微控制器原則上與通用 CPU 沒有區別。微控制器還處理中斷,這會搶占程式碼流,因此您不能指望精確的周期計時。您還可以在微控制器上安裝調度程序,這取決於作業系統。您提到的 Beaglebone 上的可程式實時單元 (PRU) 是一個非常專業的處理器,專為周期精確操作而設計,而不是“普通”微控制器。

您可以將程序固定到特定的 CPU 核心,但這並不意味著該程序可以獨占訪問該核心。在 Linux 上你真正想要的是實時調度。只需為控製過程使用更高的優先級,您可能會成功。

引用自:https://unix.stackexchange.com/questions/637869