F9カーネルは実験的なマイクロカーネルの実装であり、有名なL4マイクロカーネルに触発されて柔軟な組み込みシステムを構築します。F9マイクロカーネルの開発の動機は、最新のカーネル設計のアイデアを使用して、ARM Cortex-Mシリーズのマイクロプロセッサでリアルタイムおよびタイムシェアリングアプリケーション(ワイヤレス通信アプリケーションなど)を実行し、アカウントの効率(パフォーマンス+消費電力)と安全性パフォーマンス(メモリ保護+分離実行)。以下の特徴があります
- F9は、マイクロカーネルの基本原則に従い、プロセッサ特権モードでアドレス空間、スレッド管理、およびIPC通信メカニズムのみを実装します。
- ARM Cortex-Mシリーズ用に設計およびカスタマイズされ、NVIC(ネストされたベクトル割り込みコントローラー)、ビットバンド、MPU(メモリ保護ユニット)をサポートします。
- 効率的なスケジューリングとティックレスメカニズムにより、ARM Cortex-Mは、所定の時間であろうと割り込みイベントであろうと、必要な場合にのみウェイクアップできます。したがって、常に動作する高周波クロックを必要とするシステムタイマーSysTickを使用する通常の方法よりも優れたエネルギー節約を実現します。
- KProbesメカニズムをサポートするKProbesは、Linuxカーネルに触発された動的検出システムであり、開発者はカーネルを再コンパイルまたは再起動することなく、カーネル操作に関する追加情報を収集できます。これにより、コードをカーネル内の位置に挿入できます。ARMコアが検出ポイントに遭遇すると、挿入されたコードが実行されます。インストルメントされたコードが実行されると、カーネルは引き続き正常に実行されます。
- 各スレッドには独自のTCB(スレッド制御ブロック)があり、そのグローバルIDによってアドレス指定されます。ディスパッチャは、コンテキストの切り替えを担当します。同じ優先度のスレッドは、ラウンドロビン方式で実行されます。
- メモリ管理には3つの方法があります
- 特定の属性を持つ物理アドレス空間の領域を表すメモリプール。
- フレキシブルページ(フレキシブルページ)。常にサイズが調整されているアドレス空間の領域を記述します。他のL4実装とは異なり、F9の柔軟なページがMPU領域に置き換わります。
- アドレス空間は、これらの柔軟なページで構成されています。
- アドレス空間を管理するためのシステムコールを提供する
- 付与:新しいユーザーにメモリページを付与し、以前のユーザーは使用できなくなります。
- マップ:これは共有メモリを実装します-メモリページは別のタスクに渡されますが、両方のタスクを使用できます。
- フラッシュ:他のユーザーにマップされたメモリページは、アドレス空間からフラッシュされます。
- ユーザースレッドとマイクロカーネル間の相互作用に関しては、UTCB(ユーザーレベルスレッド制御ブロック)の概念が採用されています。UTCBは、スレッド仮想アドレス空間内のスレッド固有の小さな領域であり、常にマップされます。したがって、UTCBにアクセスしてもページフォールトが発生することはなく、カーネルはシステムコールパラメータ、特にユーザースレッドとの間でコピーされるIPCペイロードに適切にアクセスできます。
- カーネルは同期IPC(プロセス間通信)を提供します。短いIPCはCPUレジスタ内のペイロードのみを伝送し、完全なIPCは通信するパーティのUTCBを介してメッセージペイロードを複製します。
- カーネルのデバッグと分析のメカニズムをサポートします。
- 構成可能なデバッグコンソール
- メモリダンプ
- スレッド分析:名前、稼働時間、割り当てられた/現在の/使用されたスタック
- メモリ分析:カーネルテーブル、プールの空き/割り当てサイズ、断片化
開発委員会:
この環境で使用される開発プラットフォームは、stm32f4-discoveryシリーズであるSTM32F407G-DISC1であり、メインコントロールはCortex-M4Fコアであり、オンボードst-linkデバッガーがサポートされています。開発ボードのリソースは次のとおりです。
- LQFP100パッケージのSTM32F407VGT6
- FPUを備えたARM®32ビットCortex®-M4CPU
- 最大CPU周波数168MHz
- 1MBフラッシュ
- 64Kバイトのコア結合メモリを含む192+ 4 KB SRAM
- 外部割り込み機能を備えたGPIO
- 24チャネルの3x12ビットADC
- 2x12ビットD / Aコンバーター
- USART / UART(6)
- .......
STM32F4DISCOVERYディスカバリーには6つのUARTがあります。デフォルト構成は1152008N1です。ST-Link仮想コムポートはチップシリアルポートに配線されていないことに注意してください。コンソール出力を有効にするには、シリアルピンケーブルを使用してUARTに接続する必要があります。 。
書き込み手順、STM32F4DISCOVERYDiscoveryにはST-LINK / V2デバッガーが搭載されており、OPENOCDと連携してベアメタル書き込みを実現できます。
カーネルを入手する:
f9カーネルはBSDオープンソース契約に従ってgithubでホストされており、カーネルは大きくなく、ダウンロードは単純なgitcloneコマンドで完了できます。
git clone https://github.com/f9micro/f9-kernel.git
カーネルを構成します。
f9カーネルのビルド環境依存関係はLinuxと同じで、どちらもmconfです。PCが以前にLinux開発環境をビルドしたことがある場合は、直接開発できます。それ以外の場合は、Linux開発標準に従って依存関係をインストールします。
make configを実行して、linuxと同様のmenuconfig構成インターフェースを呼び出します。
プラットフォームはSTM32F4を選択し、デフォルトのシリアルポート(usart4)、つまりオンボードのPA0およびPA1PINピンが使用されます。シリアルポートとピンの間のマッピング関係は次のとおりです。
カーネルをコンパイルします。
構成が完了したら、構成メニューを終了する前に「構成の保存」をクリックします。終了したら、コンソールのすぐ下でmakeコマンドを実行して、カーネルをコンパイルします。
make cleanを実行して、コンパイル中間ファイルとコンパイル結果をクリアします。
各ファイルのコンパイルの詳細を調べたい場合は、make V = 1を実行できます。
上図の出力詳細によると、出力ターゲットにはf9.elf、f9.elf.bin、f9.binが含まれ、そのうちf9.binとf9.elf.binはまったく同じであり、どちらもf9.elfバイナリファイルに対応しています。
カーネルを焼きます:
開発ボードはUSBシミュレーションディスク書き込み方式に対応しています。システム起動後、プラットフォームはPC側のディスクをシミュレートします。このとき、コンパイル結果ファイルf9.binを仮想ディスクにコピーできます。ディスク自体は仮想であり、コピープロセスは実際に実行されます。書き込みプロセス中、コピーが終了した後、再起動してファームウェアの書き込みを開始します。さらに、Zephyrの西部環境には、対応する書き込みツールがあり、f9カーネルの書き込みもサポートする必要があります。後で試すことができます。ここでは、最初に最初のディスク書き込み方法を使用します。
カーネルを仮想ディスクにコピーして、書き込みを完了します。
USB2TTLシリアルケーブルをUSART4(PA0、PA1)に接続し、minicomを使用して起動時のカーネル出力を監視します。
st-flashを使用してカーネルを書き込みます。
燃焼:
st-flash write f9.bin 0x8000000
読んだ:
st-flash read firmware.bin 0x8000000 0x1000
消去:
st-flash erase
zephyr環境に基づく書き込みとデバッグ:
zephyr環境を使用してf9カーネルを書き込み、デバッグしたいので、zephyrがこの開発ボードをどのように再生するかを見てみましょう。
最初のステップ:west、cmake、sdkツール、requirements.txtの依存関係のインストール、コードのダウンロードなど、公式のzephyrドキュメントに従ってzephyr開発環境をインストールします。
ステップ2:elftoolsをインストールする必要があります。そうしないと、DISCO1開発ボードプロジェクトのコンパイル時にエラーが報告されます。requirements.txtにインストールがリストされていない理由がわかりません。pip3installpyelftoolsを実行してください。
ステップ3:コンパイル:
最初にwestbuild -t cleanを実行して、最後のコンパイル結果ファイルをクリアします
次に、以下に示すように、west build -b stm32f4_disco samples / basic / blinkyを実行して、blinkyプロジェクトをコンパイルします。
ステップ4:燃焼
Zephyrの書き込みは、上記で使用した仮想ディスクメカニズムに依存していませんが、ocdとstlinkに基づいています。
USBポートを接続し、ウェストフラッシュを実行します
ga
印刷された情報を観察し、zephyrが使用するシリアルポートがf9カーネルとは異なることに注意してください。ZephyrはPA2 / PA3であるシリアルポートusart2を使用します。
ステップ4:デバッグ
west build -b stm32f4_disco samples / hello_world
ウェストフラッシュ
シリアルポート情報、ファームウェアが焼き付けられています:
その後、west debugを実行して、helloworldプログラムをデバッグします。
終わり!