
私が間違っている場合は訂正してください:
私がオンラインで検索した限り、マイクロコントローラ(Arduinoなど)とSBC(Raspberry Piなど)の主な違いは、マイクロコントローラが原子的であることです。つまり、コードを1行ずつ実行し、他の操作は実行しません。遅延。ただし、SBC(RPiなど)はオペレーティングシステムを実行し、オペレーティングシステムはアトミックではありません。つまり、オペレーティングシステムは他のタスクも実行する必要があるため、コードの実行をスケジュールし、コードがどのように実行されるかによって遅延する可能性があります。オペレーティングシステムが使用中です。
したがって、フライトコントローラなどの一部のプロジェクトでは、ドローンが遅延なく直ちにコマンドとセンサーデータに反応できるように、マイクロコントローラを使用する必要があります。
BeagleBoneなどの一部のマザーボードには、オペレーティングシステムを実行できるCPUと、アトミックタスクを実行できる1つ以上のマイクロコントローラがあります。これは、1つのボードで2つの世界を得ることができることを意味します。
今私の質問は次のとおりです。
Linuxオペレーティングシステムを実行しているマルチコアCPUで、Linuxカーネルにプロセスごとに1つのコアのみをスケジュールするように指示できますか? Raspberry Piでドローンを制御するPythonプログラムがあるとしましょう。 Linuxに4つのコアのうち3つを独自に使用し、1つのコアをフライトコントローラプログラムで使用するように指示できますか?話しますか?
私はLinuxタスクの優先順位といくつかのリアルタイムLinuxカーネルについて知っていますが、これらのオプションを詳しく見ていません。このトピックに関するガイダンスをいただきありがとうございます。ありがとうございます。
答え1
原則として、マイクロコントローラは汎用CPUと変わりません。マイクロコントローラはコードフローを先取りする割り込みも処理するため、正確なサイクルタイミングを期待することはできません。オペレーティングシステムによっては、マイクロコントローラにスケジューラをインストールすることもできます。あなたが言及したBeagleboneのPRU(Programmable Real-Time Unit)は、「一般的な」マイクロコントローラではなく、正確なサイクル動作のために設計された非常に特殊なプロセッサです。
プロセスを特定のCPUコアに固定できますが、これはプロセスがコアに排他的にアクセスできるという意味ではありません。 Linuxで実際に欲しいのはリアルタイムスケジューリングです。制御プロセスでより高い優先順位を使用すると、おそらく成功します。
答え2
私の考えは可能ですが、複雑であることがわかりました。
Linuxに通常のプロセススケジューリングから1つ以上のCPUを除外するように指示する2つの方法があります。
その後、プログラムは、次のシステムコールを介してそのCPUで実行したいとLinuxに通知できます。
#define _GNU_SOURCE
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t len, cpu_set_t *set);
これにより、特定のCPU(またはCPU)がそのプロセス(またはプロセス)でのみ使用されます。