Linux 可以使用 CPU 核心作為微控制器嗎?
如我錯了請糾正我:
據我在網上搜尋,微控制器(如 Arduino)和 SBC(如 Raspberry Pi)之間的主要區別在於微控制器是原子的,這意味著它逐行執行您的程式碼,並且什麼也不做,沒有延遲。但是 SBC(例如 RPi)執行作業系統,並且作業系統不是原子的,這意味著它將安排您的程式碼執行,因為作業系統也必須執行其他工作,您的程式碼可能會延遲執行,具體取決於如何作業系統很忙。
因此,對於某些項目,例如飛行控制器,我們應該使用微控制器,這樣無人機就會立即對我們的命令和感測器數據做出反應,而不會有任何延遲。
有一些像 BeagleBone 這樣的板子有一個能夠執行作業系統的 CPU,以及一個或多個能夠執行原子操作的微控制器。這意味著您可以通過一塊板獲得兩個世界。
現在這是我的問題:
在執行 Linux 作業系統的多核 CPU 上,我們可以告訴 Linux 核心為一個程序保留一個核心嗎?假設我有一個控制 Raspberry Pi 上的無人機的 Python 程序,我可以告訴 Linux 為自己使用四個核心中的三個,而只為我的飛行控制器程序使用一個核心嗎?我說得有道理嗎?
我知道 Linux 工作優先級和一些實時 Linux 核心,但我沒有詳細研究這些選項。我將不勝感激有關此主題的任何指導,謝謝。
事實證明,我的想法是有可能的(但它很複雜)。
我們有兩種方法可以告訴 Linux 從其正常的程序調度中排除一個或多個 CPU。
之後,程序可以通過以下系統呼叫告訴 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 上你真正想要的是實時調度。只需為控製過程使用更高的優先級,您可能會成功。