0からFreeRTOS-1を学び始めます

我々は(シングルコア)マイクロコントローラは一度に一つのことを行うことができることを知っている下では、マイクロコントローラのリソースの無駄になりますが、対応する十分でない時があるかもしれないので、リアルタイムでは、比較的大きなプログラムがあるかの要件が比較的高い中で、私たちは、オペレーティング・システムを移植することができます。そのためこの場合、ベアメタル、高効率よりもずっと簡単にオペレーティングシステムインチ 以下に、JJはFreeRTOSカジュアルルックの世界にお連れします。

ここでは、この記事を開始しました。

私たちは、オペレーティング・システムを使用していない前に、マイクロコントローラは順次、つまり、非常に多くの場合、この問題の実装では、マイクロコントローラは、別のものに切り替えることはできません行われる実行します。これは資源の無駄が生じ、かつ信号バーストを逃しました。だから、時間・オペレーティング・システムを過ごす、このような問題を回避することは容易です。

非常に単純な、気持ちから、同じ多くの時間や物のシングルチップのように、なぜそれのように、MCUの実行速度はすぐに近づいているため、我々は単にそれを感じることができないが、同時に2つのことを行うことは不可能です、 (シングルコア)マイクロコントローラで、そのハードウェア構成は、CPUのみなど、一度に一つのことを行うことができ決定するので。
ないOS

小さな通り、我々は単に違いを見分けることができないとして、このチャートとして、これらの事のすべてを実行するために、その時の各タスク(イベント)が無限小と仮定すると、我々はこれらの6つのことを行うと同時に、マイクロコントローラを感じます。

すべてのタスクが実行されているかのように、実際には1つのタスクだけは、一度に実行するために:真実はこれです

もしそうなら、割り込みシステムを追加し、それが下の図のように理解することができます。
インクルード

フロントデスクシステムとバックオフィスシステム:プログラムは、通常は2つの部分に分けられます。シンプルで小さなシステムは、通常はフロントで、バックオフィスシステムは、このようなプログラムは無限ループといくつかの割り込みサービス・ルーチンを含む:アプリケーションが目的の操作を完了するために、API関数を呼び出す無限ループで、これはサイクルのバックエンド・システムと呼ばれています。受信システムである非同期イベント処理システムのための割り込みサービスルーチン。レセプションには背景がタスクレベルで、割り込みレベルです。簡単に言えば、それはプログラムが割り込み(フォアグラウンド)のものへの割り込みを行うために実行されたことです。物事は、割り込み(フォアグラウンド)を処理し、それが継続するために戻って大きなサイクル(バックグラウンド)にあります。

そこで問題は、このようなシステムは確かに良いシステムではないと、私は第四タスクは、単に、ああ行うことはできません実際には、行うことができ、プログラムの実行ポインタのcpポイントを聞かせたときに最初の作業をしたいんですリストの4番目の作業。しかし、複雑な作業と、その後、構造、移植性、およびプロジェクト全体のコードの可読性が、それは確かに悪くなります。

 FreeRTOS

そして、オペレーティングシステムは、移植の不可欠な部分です。RTOSとは何ですか?:リアルタイムOS、リアルタイム・オペレーティング・システム、重点は、リアルタイムで作業を何時間を指定することです。だから、同じ時間ならば、私たちはどのようにするために、2つの以上のタスクを実行する必要があります。その後、我々は、人工的に、フロントは常にマイクロコントローラは、同時に2つのことを行うことができないことを強調しているため、ある瞬間にだけ一つのことを行うことができ、最初に行うには、重要な課題である優先順位付けを、タスクすることができます。

だから、FreeRTOSは、それを操作する方法ですか?FreeRTOSカーネルはそれを見て:

FreeRTOSは、カット、プリエンプティブマルチタスクカーネルで、タスクの数に制限はありません。FreeRTOSは、リソース管理、同期、通信、その他のタスクを含むリアルタイム・オペレーティング・システムに必要なすべての機能を提供します。FreeRTOSは、そのほとんどがCで書かれている、Cおよびアセンブリで書かれ、そして密接コードのプロセッサの一部に関連付けられているのほんの一握りは、アセンブラで書かれ、FreeRTOS簡単な構造、非常に読み取り可能!RTOSカーネルがすべてのタスクを管理する責任があり、カーネルは別のタスクに現在のタスクスイッチを停止するとき、実行するためにどのタスクを決定し、これはマルチタスク管理機能カーネルです。

プリエンプティブカーネル名を示しているが、他のタスクにCPUを使用する権利を奪うことで、それは常に準備作業で最も優先度の高いタスクが実行されます。
FreeRTOS

FreeRTOSに各タスクが無限ループであり、一般に、タスクの実行の終了できなくなり、デューティに戻ることが許されない、タスク構造は、一般的に

While(1)
{
/****一直在循环执行*****/
}

あなたは、このタスクを実行し、それを削除した場合。

チュートリアル移植は、私はライン上で多くのことを行うために、既存のチュートリアルに従って、超簡単で、書いていません。(あなたはリソースを持っていない場合、あなたはバックグラウンドで私を見つけることができ、私は移植のチュートリアル/ソースを与えます)

実際には、FreeRTOSと簡単なの使用は、自分の希望に成功した移植合わせを構成することができ、かつマニュアルFreeRTOSがたくさんあり、下手な英語のが、私はGoogleが翻訳持っています!ハッハッハ

それは、タスクタスクと言われているので、タスクを作成、タスクああを持っている必要があります。

// task. h  task.c
BaseType_t xTaskCreate(      TaskFunction_t pvTaskCode,
                              const char * const pcName,
                              uint16_t usStackDepth,
                              void *pvParameters,
                              UBaseType_t uxPriority,
                              TaskHandle_t *pvCreatedTask
                          );

文字通り理解されるように関数プロトタイプは、持っています

TaskFunction_t pvTaskCode        //传递进来的是任务函数
const char * const pcName         //传递进来的是任务Name
uint16_t usStackDepth            //传入的是堆栈的大小

ここでは、割り込みが発生したときに、我々は関係なく、とにかくローカル変数やグローバル変数の定義は、使用することができ、ベアメタルの開発に、説明するのは、関数は、我々は気にしない、送信先のアドレスを返します。しかし、オペレーティング・システムでは、我々はパラメータが格納されているか把握する必要があり、その大きさは、我々は、スタックのサイズを定義する必要がどのくらいです。我々はこれらの事を格納するために使用されます。これは、例外が発生するスタックオーバーフローが生じ、小さすぎます。(マイクロコントローラのRAMスタック内部の連続したメモリ空間です)

マルチタスクシステムでは、各タスクが非干渉、独立しているので、その結果、各タスクのための別個のスタック領域を割り当てること。

void *pvParameters              //传递给任务函数的参数
UBaseType_t uxPriority          //任务优先级
TaskHandle_t *pvCreatedTask     //任务句柄

タスクハンドルも非常に重要なものである、我々はタスクを削除それらがどのように、どのタスクを実行するためにどのタスクを知る前に、何を、あなたの使命、判定タスクハンドルに依存しなければならないタスクハンドルは、実際に、分かりやすく、私のオペレーティングシステムはどのようにあなたは知っています使用することですそれは中断されます。で次のタスクが実行され、その上のタスクハンドルですられます。

そして、これらのものを使用するには、我々はそれを達成するために確信している、優先順位を定義するには、以下に定義され得ることである、サイズをスタック、タスク、機能や他のタスクを処理します。

//任务优先级
#define LED_TASK_PRIO           2
//任务堆栈大小     
#define LED_STK_SIZE             50
//任务句柄
TaskHandle_t LED_Task_Handler;
//任务函数
void LED_Task(void *pvParameters);

タスクを作成したら、タスクスケジューラを開くことができ、その後、システムが実行を開始します。

xTaskCreate((TaskFunction_t )LED_Task,    //任务函数
            (const char*    )"led_task",   //任务名称
            (uint16_t       )LED_STK_SIZE, //任务堆栈大小
            (void*          )NULL, //传递给任务函数的参数
            (UBaseType_t    )START_TASK_PRIO, //任务优先级
            (TaskHandle_t*  )&LED_Task_Handler);//任务句柄 
 vTaskStartScheduler();          //开启任务调度

値を返すタスクを作成するには、この機能をXTaskCreate、戻り値の型がBaseType_tです。

我々は、説明を見てください:

// @return pdPASS if the task was successfully created and added to a readylist, otherwise an error code defined in the file projdefs.h

実際には、我々は戻り値についてのスケジューリング時間を決定することができ、彼らは成功を構築するかどうかを知っているので、pdPASSは、タスクを作成することです。そして、デバッグなどの印刷情報。セマフォは、コード堅牢な数を作る、セマフォが正常に作成されているかどうかを知っている必要があり、これらの後者の使用しているため。それは何も隠されたバグではありません。

そして、私たちの使命はLED_Taskをやっていることの具体的な実現は、

もちろん、あなたが複数のタスクを実装することができます。それは非常に簡単です。

//LED任务函数
void LED_Task(void *pvParameters)
{
    while(1)
    {
        LED0  =  !LED0;
        vTaskDelay(1000);
    }
}

これは、オペレーティングシステムの簡単な概要です。

次に、具体的なプロセスは、タスクスケジューリングとタスク切り替えについてオープンにしてください。

これは、「0-1からUCOS-IIIを書くためにあなたを教える」本の山火事を参照することができます

私は世間の注目号を歓迎します

詳細については懸念「物事のIoT開発、」公共の番号を喜ばせます!

おすすめ

転載: www.cnblogs.com/iot-dev/p/11680785.html