RT-Threadレコード(2. RT-Threadカーネルの起動プロセス-起動ファイルとソースコードの分析)

在上一篇文章中,我们了解了RT-Thread的版本以及开发环境,使用RT-Thread Studio成功创建了一个工程。
但是要了解一个操作系统,内核的了解是必不可少的,
我们今天就在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程
.. 更新一个说明,SMP是对多核处理器的支持相关部分      		 2022/3/15

1.基本的な紹介

カーネル起動プロセスの公式紹介へのリンクは次のとおりです。

RT-Threadの公式カーネル起動プロセスの紹介

私のSTM32コラムには、STM32の起動に関する別のブログ投稿があります。

STM32起動プロセス(startup_xxxx.sファイル分析)

ベアメタルプログラムでは、通常、.sファイル_mainにジャンプしてmain()関数のスタートアップにジャンプしますが、RT-Threadのスタートアップは、最初にスタートアップ関数にジャンプして一連の必要な初期化rtthread_startup()を実行し、最後にmain()関数にジャンプします。

rtthread_startup()簡単に言うと、プログラムが起動したら、startup_xxxx.sファイル(アセンブリ言語)を介しrtthread_startup()RT-Thread起動関数(C言語)にジャンプし、次にmain()。を介して(C言語)関数にジャンプします。

公式の写真は、このプロセスを非常に詳細に示しています。

ここに画像の説明を挿入
RT-Threadでは、main()関数はスレッドとして扱われます。rtthread_startup()これによりスレッドがmain()作成され、さらに、スレッドとアイドルスレッドの2つのスレッドrtthread_startup()が作成されます。timer

上の図と組み合わせて、前の記事で作成したサンプルコードを使用してこのプロセスを説明しましょう。

2.ソースコード分析

2.1アセンブリ部分-startup_xxxx.sの説明

RT-Thread Studioプロジェクトを開きます。ここで、startup_xxxx.sファイル。次の図を参照してください。
ここに画像の説明を挿入

開いて表示できるスタートアップファイルが見つかりました。スタートアップファイルの説明は、他のブログ投稿で詳しく説明されています。

STM32の起動プロセス-startup_xxxx.sファイル分析(GCC環境での起動ファイル分析を更新します)

より詳細に説明されていますが、ここでは主なものについて簡単に説明します。上記の推奨ブログ投稿で述べたように、GCC環境を開始するには2つのファイルが必要です。1つはstartup_xxxx.sファイルで、もう1つは.ldリンクファイルです。最初にリンクファイルを見てみましょう。
ここに画像の説明を挿入

前述のように、GCCのリンクファイルは、主にエントリ関数、スタックサイズ、およびデータセグメントの全体的なレイアウトを定式化します。上の画像では、値がシステムスタックのサイズを定義し、ヒープのサイズを定義していないことがわかります。

ここでシステムスタックのみを定義するのはなぜですか?
他のブログ投稿でも、このmalloc関数しない場合はヒープを使用する必要はないと述べていますが、ヒープのサイズは使用するかどうかに応じて定義されるため、ここでは定義しません。後の初期化中ではありません。
手順については、このドキュメントの下のパネルレベルのハードウェア初期化セクションで説明しています。

次に、startup_xxxx.sファイル。最初に、電源がオンになったときに実行される最初のコマンドを見つけますReset_Handler(チップの電源がオンになり、電源オンリセットであり、直接トリガーされますReset_Handler)。

ここに画像の説明を挿入
上図の操作がわからない場合は、ブログ投稿をご覧ください。

STM32に関連するメモリ管理(メモリアーキテクチャ、メモリ管理、マップファイル分析)

データ転送が完了すると、次の図に示すように、システムの基本的な初期化になります。
ここに画像の説明を挿入
基本的な初期化が完了すると、MCUが実行され、上記の基本的な概要で説明したエントリ機能にジャンプできます。下の図に示すように:
ここに画像の説明を挿入
上記の手順を経て、最後に。sのアセンブリはC言語部分にジャンプし、入力rtthread_startup関数。rtthread_startup関数を入力した後のRT-Threadの動作を次のように説明します。前書き。

2.2セクションC-rtthread_startup説明

この記事の最初のセクションの基本的な紹介では、公式の写真に、rtthread_startup入力後に実行される操作が示されています。また、プロジェクトがrtthread_startup関数に入る方法と、関数rtthread_startupに入る後に実行される操作について、次のように説明しました。図:
ここに画像の説明を挿入
補足説明:上の図のSMPは、マルチコアプロセッサに関連する設定に関連しています。

上記のプロセスは簡単に理解できます。主なタスクは次のとおりです。

1.基本的なハードウェアの初期化。

2.メインスレッドが作成されます。

3.ソフトウェアタイマーが使用されているかどうかに応じてタイマースレッドを作成します。

4.アイドル状態のスレッドが作成されます。

5.スケジューラーを初期化します。

特定の操作を詳しく調べることができる初期化がいくつかあります。

2.2.1ボードハードウェアの初期化-rt_hw_board_init

rt_hw_board_initハードウェア関連の初期化は、以下に示すように、関数を使用して実行されます。
ここに画像の説明を挿入

2.2.2 RTスレッドのヒープとスタックスペースの説明(FreeRTOSとは異なります)

上の図では、ヒープスペースの初期化という特別なものがあります。以前に遭遇したのは、スタートアップファイルでスタックスペースを定義することです。上記のRT-Threadスタートアップファイルを分析したとき、定義したのはスタックスペース。、ヒープスペースは定義されていません。実際にはこの場所に配置されます
ここに画像の説明を挿入

当初、ここにはまだ疑問がありました。HEAPは残りのRAMをすべて使用します。以前の理解によれば、システムスタックは最後の位置にあるはずです。ここで何が起こっているのでしょうか。

システムスタックの位置については、ブログ投稿「RTOSタスクスタックとシステムスタック」を参照してください。

上記のソースコードで見た結論は、このブログ投稿で述べたものとは異なり(当時、ベアメタルとFreeRTOSが例として使用されていました)、RT-Threadの下で、システムスタックの位置はどこにあるので、私は振り返りデータセグメントの全体的なレイアウトを定義するリンクファイルを見てください。
ここに画像の説明を挿入
リンクファイルから.stackの場所を推測できるため、プログラムのコンパイル後に.mapファイルを表示できます。
ここに画像の説明を挿入

RAMデータセグメントでは、データが保存されている場所を表示し、システムスタックに関する場所の部分を見つけることができます。

ここに画像の説明を挿入
RT-Threadでは、システムスタックの位置が実際に.dataセグメントと.bssの間に格納されていることが確認されているため、ヒープスペースが残りのRAMスペースをすべて使用しても問題ありません。

2.2.3メインスレッドの作成-rt_application_init

RT-Threadでは、以下に示すように、関数内にある関数を呼び出すために、という名前"main"のれます。main()rtthread_startuprt_application_init()
ここに画像の説明を挿入

2.2.4スケジューラの説明

スケジューラはオペレーティングシステムのコアナレッジです。スケジューラはリンクリストに基づいて動作します。具体的な原理については、今後別の記事で説明します。ここでは、簡単に説明し、機能の目的を理解します。

このrtthread_startup関数では、rt_system_scheduler_init();初期化スケジューラを使用してスケジューラをrt_system_scheduler_start();オンにします。スケジューラをオンにすると、スレッドは特定のルール(タイムスライス、優先度)に従って切り替わります。

ここに画像の説明を挿入

スケジューラーをオンにすると、優先度が最も高いスレッドが準備完了リストで検出され、対応する位置にジャンプして、スレッドポインター(PSP)を設定して実行します。

スレッドポインタの意味は、ブログ投稿を参照できます:FreeRTOSレコード(3. FreeRTOSタスクスケジューリングの原理の分析_Systick、PendSV、SVC)
ここに画像の説明を挿入

この時点で、システム全体が正常に実行され、ユーザーは自分がやりたいことを実行し、メインで独自のアプリケーションコードを設計するか、スレッドを作成できます。

おすすめ

転載: blog.csdn.net/weixin_42328389/article/details/122989172