Yaosは、特にMMU仮想化のないシングルコアプロセッサ向けのインターネット(IoT)デバイス用の組み込みオペレーティングシステムです。エネルギー効率とハードウェア独立した開発のために設計されています。
コンパイル、移植、APIなどの詳細については、 /Documentationディレクトリを参照してください。
フィードバックは[email protected]に歓迎します。そして、私があなたに手を差し伸べることができるように、あなたの誰かが新しいMCUに移植することに興味があるかどうかを教えてください。
git clone git://github.com/onkwon/yaos
まだインストールされていない場合は、ここから入手してください。または、ソースコードからコンパイルして、より多くの労力を費やしますが、これは推奨されませんが、試してみる価値があります。
make clean
make stm32f1 (or specify your board. e.g. mango-z1)
make
make burn
現在サポートされているボードは次のとおりです。
- マンゴーZ1
- myCortex-STM32F4
- NRF52
- STM32F429I-DISCO
- STM32F469I-DISCO
- STM32-LCD
- UST-MPB-STM32F103
- STM32F1-MIN
エラーメッセージを取得した場合、 undefined reference to __aeabi_uidivのようなものは、以下でmakeときにライブラリパスを指定します。
make LD_LIBRARY_PATH=/usr/local/arm/lib/gcc/arm-none-eabi/4.9.2
パスは開発環境に依存します。
コードがどのように見えるかを味わうために、LEDを点滅させる例を挙げましょう。
ユーザータスクは /タスクの下に配置されます(タスク /My-First-Task.cなど):
void main()
{
int fd, led = 0;
if ((fd = open("/dev/gpio20", O_WRONLY)) <= 0) {
printf("can not open, %xn", fd);
return;
}
while (1) {
write(fd, &led, 1);
led ^= 1;
sleep(1);
}
close(fd);
}
REGISTER_TASK(main, 0, DEFAULT_PRIORITY, STACK_SIZE_DEFAULT);
2種類のタスクが処理されます:通常のタスクとリアルタイムタスク。通常のタスク用のラウンドロビンスケジューラリアルタイムタスクの優先スケジューラ。各タスクには、 set_task_pri()で動的に変更できる優先事項が与えられます。リアルタイムのタスクの場合、より高い優先度タスクは常に低い優先度のタスクを先取りしますが、同じ優先度タスクはラウンドロビンスケジューリングの下で順番に行われます。スケジューラを停止して、時間の重要なタスクの場合、スケジューリングオーバーヘッドを減らすこともできます。一方、通常のタスクは、単純化された公正なスケジューラによって実行される機会を得るため、次のタスクが実行されるためにランタイムの最小値を選択します。
タスクは常に5つの州のいずれかにあります:ランニング、停止、待機、睡眠、またはゾンビ。また、実行時に静的および動的にタスクを作成できます。
システムリソースは、ユーザータスクがユーザー(特権)モードで実行されるため、特権モードを入力するシステムコールインターフェイスによってアクセスされます。
仮想ファイルシステム(VFS)の概念が実装されています。 SOCの埋め込まれたフラッシュROMは、ルートファイルシステム(embedFS)としてマウントでき、RAMFはデバイスノードのdevfsとしてマウントされます。
空のフラッシュメモリは、ユーザーが通常のファイルシステムと同じように使用できるように、embedfsとして登録されています。
ページはメモリ管理の単位ですが、代替メモリマネージャーは、このようなメモリ不足のシステムで使用できます。
Buddy AllocatorとFirst-Fit Allocatorが実装されています。
Softirqsは、優先度が高いときに実際の割り込みに対する応答を除く作業を先取りします。実際、Softirqは、割り込みを有効にして実行しているカーネルタスクであり、睡眠をとることができますが、実行中のタスクの中で最優先事項が最も高くなっています。
セマフォ、スピンロックなどの同期プリミティブ。