私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
先ほどポインタや構造体などの基礎知識についてお話しました。 この記事の冒頭では、これらの基本知識をキューなどの複雑な応用例としていくつか作成します。
実際、2018 年に私はプログラム アーキテクチャに関する一連のビデオを録画しました。このビデオには、キューの形成に関するステップバイステップのチュートリアルと、一連の実践的な高レベルのプログラミングの考え方とテクニックが含まれており、多くのファンやファンから好評を博しました。友達。 。
ただし、チュートリアルは比較的早い段階で録音されたため、音質は比較的悪く、細部が完璧ではありません。 そこで、Wijiマイコン特訓キャンプの熱心な受講生の皆様に、より効率的に、より良いものを学んでいただけるよう、この度、この基本的な内容を再編し、シリーズ化することを計画しています。ソフトウェア アーキテクチャ 2.0 のグラフィック/ビデオ チュートリアル。
研究開発エンジニアとして働いていたとき、産業用制御ボード、PDU、IoT などの通信製品によく遭遇しました。
一般に、この種の製品を作る場合、シリアル通信でも無線通信でも、データストリームの書き込みと受信が頭の痛い問題になります。
たとえば、STM32 はシリアル ポート データ ストリームを受信します。
初期の段階では、受信したデータ ストリームを処理するために配列と配列添字変数を定義しました。コードは次のとおりです。
この方法には多くの問題があり、コードを記述するエンジニアの複雑さが増大します。
コードのメンテナンスが面倒
範囲外エラーを避けるために配列バッファーの境界を手動でチェックする必要があるため、より複雑なデータ ストリームを処理したり、新しいデータ ソースを追加したりする必要がある場合、配列はキューほど拡張および維持するのが簡単ではありません。
データは混乱を招きやすい
割り込みサービス (ISR) でアレイを直接操作すると、メイン プログラムとのリソース競合が発生する可能性があります。複数のタスクが同じアレイにアクセスする場合、データ競合状態や不整合を回避するために追加の同期メカニズム (ミューテックス ロックなど) が必要になります。
データの受信と処理が同期していない場合、配列を使用するとデータの順序が混乱し、プログラムの問題によるデータ パケットの損失が発生する可能性があります。 この問題を解決するには追加のコードが必要で、経験もないし、苦労して作っても安定しません。
この種の問題は長い間私を悩ませていましたが、その後転職して他のエンジニアが書いたコードを読んで初めて、キューがこれらの問題点を解決できることに気づきました。 それ以来、私のデータ フローの処理方法は次のようになりました。
かなりシンプルになったように感じますか?実際、キューのデータ処理アルゴリズムも単純ではありません。キューを使用して、次回同様のニーズが発生したときに、それを直接使用できるようになります。これは、移植性と移植性を意味します。コードの再利用性が向上します。
これはキューの応用例の 1 つにすぎません。キューの本質は、データの入力とキューからの取り出しが先入れ先出しルールに従うことです。
つまり、最初にデータを保存し、CPU に空き時間があるとき、またはプログラムの特定の条件が満たされたときに、データを取り出して処理します。
この機能に基づいて、多くの実用的なアプリケーションを導き出すことができます。特に、データの順序を保証する必要があるアプリケーションを扱う場合はそうです。
よく使う場所をいくつかまとめてみました。
マイクロコントローラーがシリアル ポート経由でデータを受信する場合、通常はキューを使用して受信バイトをバッファリングします。これにより、メイン プログラムによって処理される前にデータが失われないことが保証されます。
オーディオ再生または録音デバイスでは、ターンバイターンの再生または録音を実装するためにオーディオ サンプル データをバッファリングするためにキューが使用されます。 例: たとえば、Wiji マイコン特別トレーニング キャンプのプロジェクト 6 では、WiFi および 4G アラーム ホストに音声プロンプト機能があります。たとえば、外出先で警戒ボタンを押すと、「外出中です」という音声が聞こえます。という音声が流れ、ホームにアーミングボタンを押すと「ホームにアーミング」の音声が流れます。
これら 2 つのボタンを素早く押すと、音声を完全に再生できるようにするために、最初にキー イベントをキュー キャッシュにスローして、音声を順番に完全に再生できるようにします。
RTOS を使用するシステムでは、キューはメッセージの配信とタスク間の同期に使用され、複雑なタスクのスケジューリングをサポートします。
キー イベントを検出した後、キーを押す速度が速すぎるためにキー イベントが失われるのを防ぐために、それらのイベントを最初にキューに入れることができ、メイン プログラムでこれらのイベントを処理できます。これは現在、プロジェクトで使用されています。
収集した ADC データは、適切なタイミングで処理または分析できるように、特定の処理後にキューに投入することもできます。
ファームウェア アップグレードのデータ インタラクションは比較的大きいため、データの整合性を確保するためにキューを使用するのに非常に適しています。プロジェクト 6 でも使用されています。ファームウェア アップグレード プロセス中に、ダウンロードされたファームウェア データ ブロックをキューに入れることができます。フラッシュメモリに順次書き込まれます。 同様のアプリケーションは数多くありますが、キューは私にとって多くの困難な問題を解決してくれました。
キューは、先入れ先出し (FIFO) 原則に従う線形データ構造です。つまり、キューに最初に入力されたデータが最初に削除されます。 キューでは通常、データはキューの末尾と呼ばれる一方の端でキューに入れられ、データはキューの先頭と呼ばれるもう一方の端でキューから取り出されます。 この構造により、キューはデータを順序立てて処理する必要がある状況に非常に適しています。
キューは、双方向のパイプにピンポン球を詰めることと考えることができます。このアクションは、キューイングと呼ばれます。 パイプの右側からピンポン球を取り出すこの動作をデキューと呼びます。
パイプの中のピンポン球が隊列を組んで並びます。 先に入った卓球ボールが先に出てくるのが先入れ先出しのルールです。
ピンポン球はデータにたとえられます。パイプラインがデータを格納できるキャッシュは、キャッシュに格納できるデータ量を意味します。上の図のキューは 4 つのデータを格納できます。これは Buff[4] に相当します。
キューのプログラム実装は、固定サイズの配列、先頭ポインター、および末尾ポインターを通じて行われます。 配列はデータの保存を担当します。 ヘッドポインタは、デキュー時にデータを取り出すアドレスを担当します。 テール ポインタは、データがキューに入れられるときにデータをどのアドレスに格納するかを決定します。 したがって、エンキューとデキューの操作は 2 つのポインターであり、配列内でデータ先入れ先出しアルゴリズムを実行します。
エンジニアが異なれば、キュー コードの実装も異なります。 プロジェクトの経験が豊富でない場合、またはこれまでキューを使用したことがない場合でも、キュー アルゴリズムを記述できなければならないことを恥ずかしがる必要はありません。
最初の頃は、他の人のキュー プログラムを直接移植し、自分のプロジェクトで使い続けました。その後、キュー アルゴリズムの実装の詳細なコードを研究し、自分で何度か書きました。
したがって、特別合宿のベテランの皆さん、最初から自分で書くのではなく、まず使い方を学び、1 つの例から推測し、さまざまなシナリオやプロジェクトに適用し、慣れてきたら自分で書いてみてください。これは非常に重要な学習シーケンスです。
無限マイコンプロジェクト特別合宿のキュープログラムを例に挙げると、全部で4つの機能があります。
キューが空です(x)
キュー関数をクリアします。キューを使用する前に、キューをクリアする必要があります。クリア関数は、デフォルトで先頭ポインタと末尾ポインタが配列の最初の要素を指すようにします。それ以外の場合は、ポインタを指します。アドレス例外が発生します。
正式なパラメータの説明: x - キュー構造変数です。
キューデータ入力(x,y,z)
データ エンキュー機能は、1 バイト以上のデータを指定されたキューにスローします。
正式なパラメータの説明:
x - キュー構造変数
y - データアドレス
z - キューに入れるデータの量 (バイト単位)。
知らせ:
①.入力できるデータはunsigned char型のみです。
②. キューがいっぱいでデータがキューに登録され続けると、データは最初のデータ位置から上書きされます。
キューデータ出力(x,y)
データ デキュー機能は、指定されたキューから 1 バイトのデータを取得します。
仮パラメータの説明: x - キュー構造変数 y - 取り出したデータ、格納するアドレス
注: デキュー関数は一度に 1 バイトのデータしか取得できません。
キューデータ長(x)
指定したキュー内のすべてのデータをクリアします。 正式なパラメータの説明: x - キュー構造変数
以下のコンテンツにはコードとビデオの説明が含まれており、編集するのが不便です。Feishu をより良い読書体験にするために私に連絡してください。
最近、多くのファンからマイコンの学習方法について質問を受けました。この業界での 10 年間の経験をもとに、「シングルチップ マイコン」を 1 か月かけて丁寧にまとめました。
マイクロコントローラーの最適な学習パス + マイクロコントローラーの入門レベルから上級チュートリアル + ツールキット」,すべて無料で熱心なファンと共有できます。 ! !
それとは別に、私は箱の底にあるものを涙ながらに共有します22 の人気のあるオープンソース プロジェクト、含むソースコード + 回路図 + PCB + ドキュメント、させてください早くマスターになろう!
チュートリアル パッケージと詳細な学習パスについては、私を参照してください。以下この記事の冒頭。
《マイクロコントローラーの入門レベルから高度なハッキングまでの学習パス (チュートリアル + ツール付き)》