良い記憶は悪いペンほど良くはありません。移植の経験を記録するために要約して洗練することも、他の人が迂回を避けることができるように共有することも簡単です。
まず、移植フレームワークを整理します。FreeRTOSは依然として非常にシンプルです。RT-ThreadやNuttxなどのヘビーデューティーシステムよりもはるかに軽量です。したがって、FreeRTOSは通常、MMUを使用するヘビーデューティーソリューションでは使用されません。産業などの産業で。制御や家電製品などの組み込みアプリケーション。
全体的な移植の枠組みは次のとおりです。
特定の移植手順について話しましょう:
- 構築環境を設定し、すでに構築されているメリス環境を使用する準備をして、「チキン」を借ります。目標はFreeRTOSシステムを移植することなので、この部分は記録に焦点を当てていません。つまり、環境が構築されています。
- Melisと比較して、FreeRTOSによって構築されたシステムははるかに単純であるため、当面はsbiを使用し、後で最適化しますか?MMUをサポートしないと、FreeRTOSシステム全体とアプリケーションがMモードで実行され、sbiが失われますその存在。必要ですが、最初にそれを維持し、移植が完了した後にそれを最適化することにしました。主な考慮事項は3つあります。1。リンクスクリプト、一部のコンパイルなど、環境とsbiの間に依存関係があります。現時点では触れたくありません。2。SBI自体がいくつかのベンダー拡張インターフェイスを提供します。当面は定かではありません。使用しません。省略した場合、必要に応じて何らかの形で追加し直すことができ、面倒です。したがって、一時的にSBIから始めて、徐々に減算を行います。3. sbiでカプセル化されたシリアルポートドライバーを使用して、最小システムを起動します。SBIを開始するには、SBIファームウェアにいくつかの小さな変更を加える必要があります。変更は次のとおりです。
-
diff --git a/firmware/fw_jump.S b/firmware/fw_jump.S index afbcec0..79b3de8 100644 --- a/firmware/fw_jump.S +++ b/firmware/fw_jump.S @@ -84,7 +84,7 @@ fw_next_addr: * The next address should be returned in 'a0' */ fw_next_mode: - li a0, PRV_S + li a0, PRV_M ret
fw_next_addrの実装を変更し、返された次のステータスをPRV_Mに使用します。つまり、次のステージはM-Mode、LinuxおよびMelisによって実行されないS-Modeです。検証は次のとおりです。0x40010600はOS_starです。アドレスの場合、SBIから正しくジャンプしてこのアドレスを入力すると、次のCPUブートを実行できることを示します。 、
-
次の図は、現在のプロセッサ機能コンポーネントのオープン状態を表しています。I/ DキャッシュとPMU関連のメカニズムがオンになっていることがわかります。
-
mxstatusビット30ビット31は0b11であり、システムがマシンモードで実行されていることを示します。
-
-
- 次の図に示すように、リンクスクリプトを作成して、最終リンク後のELFファイルのレイアウト分布を決定します。MMUが有効になっていないため、全体的なVA = PAになります。
- 起動プロセスに関する考慮事項
- GPRSやFPUを含め、すべてのISA定義レジスタは特定の状態にあります。
- TLBを初期化しますが、Mモードはページテーブルにアクセスしません。これは、Sモードで上位メモリアドレスにアクセスするためです。これは、MMUを介してマッピングした後、物理メモリがによって定義された39ビットだけでなく40ビットにもアクセスできるためです。 VPA。
- ページテーブルはメモリではなくTLBに組み込まれているため、TLBはここで直接初期化されます。物理メモリにはページテーブルエントリがないため、TLBのページテーブルをフラッシュすることはできません(これは簡単に満たすことができます。マッピングとアクセス範囲がTLB未満です。マッピングできる容量、TLBエントリはスワップアウトされません。もちろん、TLBロックオプションがある場合は、より保証されます。)
- LinuxカーネルのFPUへの恐ろしいアクセスとは異なり、FreeRTOSをフルスピードで実行するために、カーネルFPUユニットのアクセラレーションを完全にサポートし、SR_SDを使用してFPUレジスタの状態を次のように設定します。遅延保存/復元を実現します(-mabi = lp64dまたは-mabi = lb64vコンパイルを使用します。Linuxカーネルは、-mabi = lp64でのみコンパイルでき、ユーザーモードでのみ選択できます)、
- 事故を防ぐために、起動スタックを初期化し、「ebreak」命令を入力します。
- カーネルに渡されるパラメーターには、起動時間、misaおよびsbiの場所が含まれ、これらは後でSBIによって最適化されます。
- 仕事を上手くやりたいのなら、まず工具を研ぐ必要があります。印刷に関しては、cを入力した後、最も見たいのは印刷です。すべての問題のデバッグとアセンブリの効率はまだ比較的低いです。ここでは、newlibcのprintf印刷関数を使用し、最下層が_write_rをsbiのデバッグ済みシリアルポートドライバーに接続します。途中でエピソードが発生しました。出力用にprintfを呼び出したときに、実際に例外handle_exceptionを入力しました。分析の結果、元の_write_rがSモードのSBIパッケージで使用され、ecall命令が呼び出されたことがわかりました。このメソッドは、Sモードでも確かに可能ですが、問題は、MモードでFreeRTOSを実行することです。 、プログラム自体はSBIのようなMモードで実行され、Mモードのmtvecレジスタは上記のプロセスで新しいhandle_exceptionに変更されています。もちろん、SBIリクエストはここでは処理されません。解決策は「ecall」命令に基づくSBIsbi関数を直接呼び出すように変更されました。分析プロセスを次の図に示します。
- handle_exceptionsの入り口で強制的に停止し、mepcを出力し、
- mepcが0x4001b65aを指していることを確認し、elfファイルを逆コンパイルして対応する場所を見つけ、それが「ecall」命令であることを確認します。
- SBIのプリントドライバをシステムに移植し、次の情報を入手します。
- タイマーを設定し、内蔵のクリックアーチタイマーを使用します。このタイマーは、外部の24M水晶発振器によって駆動され、直接使用できます。後で、定期的なスケジューリングを駆動するためのシステムハートビートの割り込みソースとして使用されます。
- アーチタイマー割り込み機能を開発し、clicの比較値レジスタをクロックハートビートソースとして使用すると、値は24Mで駆動されます。値と比較が等しい場合、割り込みがトリガーされます。このとき、次のトリガーポイントは割り込み処理で設定する必要があります。値、増分計算方法は24000000 / CONFIG_HZ、つまり2つの割り込みごとのサイクル数です。まず、Linuxのアプローチを参照して、trap_initでマシンモードのタイマー割り込みと外部割り込み機能を有効にします。
- クリックアーチタイマーをオンにします。MtimeレジスタとCompareレジスタはMIPSのティック生成メカニズムに似ていることに注意してください。これはSIFiveの設計であり、多くのベンダーがこれに準拠しています。
- セグメントの完全なフローを次の図に示します。最後のステップでスケジューラーがトリガーされます。
- カスタマイズが必要なインターフェイスには、 xPortStartScheduler、pxPortInitialiseStack、vPortSetupTimerInterrupt、xPortStartFirstTaskの4つのインターフェイスがあり、アーチタイマー割り込みの接続に注意してください。
- タスクスケジューリングサイトのコンテキストレイアウト:
- portasmHANDLE_INTERRUPT、vPortSetupTimerInterrupt定義を実装し、タイマー割り込みとペリフェラル割り込み処理インターフェイスを有効にするために使用します。configCPU_CLOCK_HZ、configTICK_RATE_HZセットティック割り込みサイクル
- 例外処理と割り込み処理を実現し、上記のタイマー割り込みインターフェースとペリフェラル割り込みインターフェースを例外処理プロセスに接続します。
- 割り込みサイトのスタック構成は、タスクスケジューリングサイトのスタック構成と同じであり、タスクの初期化時のスタックレイアウトとも一致していることに注意してください。プリエンプションスケジューリングとアクティブスケジューリングの両方が異常なパスを介して入力されるため、freeRTOSでの処理は非常に一貫性があり、次の図に示すように、それが割り込みディスパッチサイトであるか、タスクがアクティブに転送されるディスパッチサイトであるかを区別する必要はありません。
主なスケジューラスケジューリングロジック:
15:移植結果:
概要:T-HEAD ICEに関しては、以前にも多くのICEを使用していましたが、共通点が1つあると思います。それは、XILINX FPGAが多くの高コストのICEエミュレーターに組み込まれていることです。ICEの主な機能は、PCを変換することです。 JTAGへのデバッグ命令。タイミング信号の場合、FT232などの既製の変換チップが多数あります。XILINXもプロトコル変換の役割を果たしますが、電源がオフになるとFPGAロジックは消えます。ICEはどのようにしてデバッグロジックを保証しますか。消えない?同僚と通信した後、FPGAの物理検証フェーズで使用されるビットファイルと同様に、固化したロジックを格納するためにICEに一般的にフラッシュまたはEEPROMが組み込まれていることを知りました。FPGAの電源を入れるたびに、ビットファイルの設計ロジックはEEPROMからロードされます。ただし、CKLinkProがメインコントロールとしてXINLINXFPGAを使用しているにもかかわらず、CKLink Liteが驚くほど節約でき、メインコントロールとしてSTM32のみを使用していることは少しナンセンスです。価格からも明らかな違いがあり、前者は淘宝網1200、後者はわずか200、メインコントロールが変更され、1,000元が出ています。