からの転送|羽林くん
基礎となるコードの記述では、最初のフレームワークの設計は常に選択に直面します。実際のハードウェア使用環境では、使用するソフトウェアフレームワークに多くの選択肢があります。今日は、適切なアーキテクチャを理解して選択できるように、より一般的に使用されるアーキテクチャのいくつかについて簡単に説明します。建築。
概要概要
1.プログラムの単純な順次実行:このタイプの書き込みは、ほとんどの人が使用する方法です。プログラムの特定の構造について考える必要はなく、実行順にアプリケーションを直接書き込むだけです。
2.フロントエンドおよびバックエンド実行プログラム:順次実行の場合に割り込みフロントエンド処理メカニズムを追加し、順番に実行される大規模なバックエンドループプログラムを構成し、それらをリアルタイムで応答できるプログラムに結合します。
3.タイムスライスラウンドロビン方式:フロントエンドおよびバックエンドの実行アーキテクチャでは、プログラムはカウンターを介してさらに計画され、特定のセグメントが定期的に実行されます。
4. リアルタイムオペレーティングシステム:リアルタイムオペレーティングシステムは、RTOS、リアルタイムとも呼ばれます。RTOSのカーネルは、すべてのタスクの管理を担当します。カーネルは、実行するタスクと、現在のタスクを停止して他のタスクに切り替えるタイミングを決定します。これは、カーネルのマルチタスク管理機能です。 。マルチタスク管理は、チップに複数のCPUがあるように感じます。マルチタスク管理は、CPUリソースの使用率を最大化します。マルチタスク管理は、プログラムのモジュール開発を実現し、複雑なリアルタイムアプリケーションを実現するのに役立ちます。
リアルタイムのパフォーマンスに加えて、剥奪可能なカーネルもあります。その名前が示すように、他のタスクからCPU使用権を剥奪する可能性があります。常に、準備完了タスクの中で最も優先度の高いタスクを実行します。
1.シンプルなシーケンス実行プログラム
この種のアプリケーションは比較的単純であり、一般に基本的な単純なリアルタイムとして使用され、それほど要求が厳しくないため、使用できます。プログラムのデザインは比較的シンプルで、考え方は比較的明確です。しかし、メインループのロジックがより複雑な場合、完全なフローチャートがないと、他の人がプログラムのロジックを理解することは困難です。
以下に順次実行するためのプログラムモデルを記述します
int main(void)
{
uint8 TaskValue;
InitSys(); // 初始化
while (1)
{
TaskValue= GetTaskValue();
switch (TaskValue)
{
case x:
TaskDispStatus();
break;
...
default:
break;
}
}
}
2.前後にプログラムを実行します
このプログラムの特徴は、デフォルトプログラムが常にバックグラウンドのラージループで実行され、割り込みサービスプログラム(ISR)が対応する割り込みマークを生成し、メインプログラムが割り込みマークに関連付けられたタスクプログラムを実行することです。一般的な実装には、次のアイデアがあります。
フラグ変数を設定し、フォアグラウンドが割り込みに応答したときにフラグ変数を設定またはリセットすることにより、イベントの信号取得が実現され、割り込みに対応するトランザクションまたはデータがバックグラウンドメインループで処理され、プログラムフローがメインプログラムに転送されます。 。
フロントエンドおよびバックエンドプログラム
void IRQHandler(void)
{
if(GetITStatus == 1)
{
SysFlag = 1;
GetITStatus = 0;
}
}
int main(void)
{
uint8 TaskValue;
InitSys(); // 初始化
while (1)
{
TaskValue= GetTaskValue();
switch (TaskValue)
{
case x:
if(SysFlag == 1)
{
TaskDispStatus();
SysFlag == 0;
}
break;
...
default:
break;
}
}
}
3.タイムスライスラウンドロビンアーキテクチャ
タイムスライスラウンドロビン法、それを見るとき、あなたは通常それをオペレーティングシステムと比較します。オペレーティングシステムにこの方法が含まれているわけではありませんが、フロントエンドプログラムとバックエンドプログラムが時間管理と連携して、タイムスライスラウンドロビンアーキテクチャを形成します。
このアーキテクチャは、RTOS、時間管理、割り込み管理、およびタスク管理に可能な限り近いものですが、RTOSは、遅延遅延のためのスレッドスイッチング、プリエンプティブタスクスイッチングなど、カーネルにさらに詳細な変更を加えます。より複雑な機能などに。
タイムスライスラウンドロビン
タイムスライス管理は、主にタイミングの多重化、タイマーのカウント、タイミングでのフラグの変更によって行われ、メインプログラムはフラグの真偽を判断して、異なる時間に異なるタスク状態の実行を実現します。
このアーキテクチャコードの方が優れているので、詳しく説明します。
ステップ
1:対応するタイマーを初期化します。チップの性能に応じて設定できるタイマーの間隔周波数の設定に注意してください。たとえば、タイミング割り込みを1msに設定するか、10msに設定できます。ラウンドロビンアーキテクチャのタイマー部分は、オペレーティングシステムのタイマー部分と同じ機能を持ちます。割り込みは頻繁すぎて、メインプログラムの実行効率に影響します。割り込み間隔が長すぎます。 、リアルタイムの応答が悪い。
2:タイミングプログラムで時間カウントとフラグ操作のためにタイマーによって実行されるタスクの機能構造フラグを設定します。
#define TaskTAB_NUM 6 //任务数量
__packed typedef struct{
u8 flag; //定时标志
u32 numcount;//按照定时中断进行计数
u32 target; //设置的定时目标数值
int(*fun)(void);//设置定时执行的目标任务函数
}TaskTimTypeDef
ステップ
3:タスクテーブルを作成し、構造テーブルの設定によりタスク実行のタイムテーブルを決定します。
変数を定義するとき、値を初期化しました。これらの値の初期化は非常に重要であり、特定の実行時間の優先順位と関係があります。これは自分で習得する必要があります。
/*MdmSendTimTab任务函数默认周期,单位5ms,TIM7*/
static TaskTimTypeDef TaskTimTab[TaskTAB_NUM] =
{
{1, 0, 30000, *Task00}, //Task00 3000数值是设置的定时目标值,如果觉得反应过慢,可以将此值设置小
{1, 0, 3000, *Task01}, //Task01
{1, 0, 300, *Task02}, //Task02
{1, 0, 30, *Task03}, //Task03
{1, 0, 3, *Task04}, //Task04
{1, 0, 0xFFFFFFFF, *Task05}, //Task05
//可以按照TaskTAB_NUM数量添加任务
};
int Task00(void)//按照结构体的函数模板(int(*fun)(void);)写任务函数
{...}//假设执行按键操作
int Task01(void)
{...}//假设执行USART发送任务
int Task02(void)
{...}//假设执行CAN通讯
int Task03(void)
{...}//假设执行继电器控制
int Task04(void)
{...}//假设执行网络解析
int Task06(void)
{...}//假设执行空
ステップ
4:タイミング割り込みサービス機能、必要な時間に応じたタイミング、フラグ操作。
//定时中断服务函数
void TimerInterrupt(void)
{
for(char i=0; i<TaskTAB_NUM; i++)
{
if(TaskTimTab[i].flag == 1)
{
(TaskTimTab[i].numcount< TaskTimTab[i].target)//比较目前定时计数与目标时间
(TaskTimTab[i].numcount++):(TaskTimTab[i].flag = 0);
}
}
}
ステップ
5:メイン関数はタスク関数の実行を実行します。
int main(void)
{
InitSys(); // 初始化
while (1)
{
for(char i=0; i<TaskTAB_NUM; i++) 任务处理
{
if(TaskTimTab[i].flag == 0)
{
if(TaskTimTab.flag == 0)
{
TaskTimTab[i].flag = 1;
TaskTimTab[i].numcount= 0;
TaskTimTab[i].fun();
}
}
}
}
4.オペレーティングシステムRTOS
組み込みオペレーティングシステムは、より最適化された実行フレームワークであり、マルチタスク、複雑な機能、および強力なスケーラビリティ要件に非常によく使用されます。RTOSは、さまざまなプロセッサ用に最適化された高効率のリアルタイムマルチタスクカーネルです。RTOSは、数十の一連の組み込みプロセッサMPU、MCU、DSP、SOCなどに同様のAPIインターフェイスを提供できます。これはデバイスの独立性に基づいています。アプリケーション開発の基盤。したがって、RTOSに基づくC言語プログラムは優れた移植性を備えています。現在、マイクロエンベデッドまたはシングルチップマイクロコンピュータのオペレーティングシステムには、VxWorks、UCOS、Free RTOS、および国内RTTが含まれます。これらのオペレーティングシステムは類似しており、タスク管理、タスク間の同期と通信、メモリ管理、リアルタイムクロックサービス、割り込みなどの基本機能が類似しています。管理サービス。
(画像ソースブログ)
RTOSは、関数の蓄積とさらなる最適化であるタイムラウンドロビンアーキテクチャに、タスクの一時停止と再開、スレッドのブロックと切り替えなどを引き続き追加します。これはRTOSの紹介ではないので、UCOS、RTT、Free RTOSなどのいくつかのオペレーティングシステムを学び、適用しました。スペースと時間が限られているため、詳細なRTOSシステムアーキテクチャを紹介します。
現在、多くのRTOSシステムがあり、多くのプロジェクトでRTOSを使用する傾向がありますが、いくつかのアーキテクチャを分析すると、プロジェクトごとに異なるアーキテクチャが必要であることがわかります。すべてのプロジェクトで必要なわけではなく、プロジェクト内のさまざまなタスクの結合など、すべてRTOSの使用に適しています。大きすぎる場合、RTOSを使用する場合は、多くのタスク同期が必要であり、スレッドを計画することすらできません。これはRTOSの意味を完全に失います。現時点では、ベアメタルアーキテクチャを使用する方が適切です。
2. Huaweiの5Gの秘密はトルコ人の手にありましたか?!
3.最新の半導体ランキングが発表され、Nvidiaは50%の成長を達成しました!
4. [MCU]「柔軟でリソースを節約する」IAPアップグレードプログラム
免責事項:この記事はオンラインで複製されており、著作権は元の作者に帰属します。著作権の問題が発生した場合は、お問い合わせください。ご提供いただいた著作権証明書に基づいて著作権を確認し、作者の報酬を支払うか、コンテンツを削除します。