내가 틀렸다면 정정해주세요:
내가 온라인으로 검색한 한, 마이크로 컨트롤러(예: Arduino)와 SBC(예: Raspberry Pi)의 주요 차이점은 마이크로 컨트롤러가 원자적이라는 것입니다. 즉, 코드를 한 줄씩 실행하고 다른 작업은 수행하지 않습니다. 지연. 그러나 SBC(예: RPi)는 운영 체제를 실행하며 운영 체제는 원자적이지 않습니다. 즉, 운영 체제가 다른 작업도 수행해야 하기 때문에 코드 실행을 예약하고 코드가 어떻게 실행되는지에 따라 지연될 수 있습니다. 운영 체제가 사용 중입니다.
따라서 비행 컨트롤러와 같은 일부 프로젝트의 경우 드론이 지연 없이 즉시 명령과 센서 데이터에 반응할 수 있도록 마이크로컨트롤러를 사용해야 합니다.
BeagleBone과 같은 일부 마더보드에는 운영 체제를 실행할 수 있는 CPU와 원자적 작업을 수행할 수 있는 하나 이상의 마이크로 컨트롤러가 있습니다. 이는 하나의 보드로 두 개의 세계를 얻을 수 있음을 의미합니다.
이제 내 질문은 다음과 같습니다.
Linux 운영 체제를 실행하는 멀티 코어 CPU에서 Linux 커널에 프로세스당 하나의 코어만 예약하도록 지시할 수 있습니까? Raspberry Pi에서 드론을 제어하는 Python 프로그램이 있다고 가정해 보겠습니다. Linux에 4개의 코어 중 3개를 자체적으로 사용하고 하나의 코어를 비행 컨트롤러 프로그램에 사용하도록 지시할 수 있습니까? 말이 되나요?
저는 Linux 작업 우선순위와 일부 실시간 Linux 커널에 대해 알고 있지만 이러한 옵션을 자세히 살펴보지는 않았습니다. 이 주제에 대한 지침을 주시면 감사하겠습니다. 감사합니다.
답변1
원칙적으로 마이크로컨트롤러는 범용 CPU와 다르지 않습니다. 마이크로컨트롤러는 코드 흐름을 선점하는 인터럽트도 처리하므로 정확한 사이클 타이밍을 기대할 수 없습니다. 운영 체제에 따라 마이크로컨트롤러에 스케줄러를 설치할 수도 있습니다. 귀하가 언급한 Beaglebone의 PRU(Programmable Real-Time Unit)는 "일반" 마이크로컨트롤러가 아니라 정확한 주기 작동을 위해 설계된 매우 특수한 프로세서입니다.
프로세스를 특정 CPU 코어에 고정할 수 있지만 이것이 프로세스가 코어에 독점적으로 액세스할 수 있다는 의미는 아닙니다. Linux에서 실제로 원하는 것은 실시간 스케줄링입니다. 제어 프로세스에 더 높은 우선순위를 사용하면 아마도 성공할 것입니다.
답변2
내 생각은 가능하지만 복잡하다는 것이 밝혀졌습니다.
Linux가 정상적인 프로세스 스케줄링에서 하나 이상의 CPU를 제외하도록 지시하는 두 가지 방법이 있습니다.
그 후에 프로그램은 다음 시스템 호출을 통해 해당 CPU에서 실행되기를 원한다고 Linux에 알릴 수 있습니다.
#define _GNU_SOURCE
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t len, cpu_set_t *set);
이렇게 하면 특정 CPU(또는 CPU)가 해당 프로세스(또는 프로세스)에만 사용됩니다.