0

atmel avr コントローラーを使用して LIN バスからデータを読み取ることに興味があります。残念ながら、そのようなバス上のメッセージには開始または終了の標識がなく、合理的な解決策は力ずくで解析することだけのようです。バスからの利用可能なデータは循環バッファにロードされ、ブルート フォース メソッドはバッファ内の有効なメッセージを見つけます。

64 バイトのバッファと 20MHZ の attiny を使用して、バッファ オーバーフローが発生する可能性があるかどうかを確認するためにコードのパフォーマンスをテストするにはどうすればよいですか? 追加: 私の懸念は、アルゴリズムの実行が遅くなるため、さらに多くのデータがバッファリングされることです。

ブルートフォースアルゴリズムについて少し。バッファの 2 番目の要素はメッセージ サイズと見なされます。たとえば、想定される長さが 22 の場合、最初の 21 バイトが XOR され、バッファ内の 22 番目のバイトに対してテストされます。チェックサムに合格すると、コードは最初の (SRC) バイトと 3 番目の (DST) バイトが本来あるべきものであるかどうかをチェックします。

4

2 に答える 2

1

AVR は、単純な命令セットと各命令の既知の命令実行時間を備えた RISC マシンであるため、パフォーマンス分析が最も簡単なマイクロコントローラーの 1 つです。

したがって、基本的な手順は、アセンブリ coude を使用して、さまざまなシナリオの計算を開始することです。基本的なレジスタ操作は 1 クロック サイクル、分岐は通常 2 サイクル、メモリ アクセスは 3 サイクルです。XOR サイクルは 1 バイトあたり 5 ~ 10 サイクルかかるため、比較的安価です。アセンブリ コードをどのように取得するかはコンパイラによって異なりますが、すべてのコンパイラは最終結果を合理的な読みやすい形式で提供する傾向があります。

通常、アルゴリズムを見て、タイミング要件について何も知らなければ、この種の質問に明確な答えを出すことはまったく不可能です。ただし、LIN バス速度は 20 kbit/s に制限されているため、各バイトに約 10,000 クロック サイクルが必要です。それはほとんど何でも十分です。


より難しい問題は、タイミングに依存する LIN フレーミングをどうするかということです。マイクロコントローラーの余分な労力が実際に必要になるため、これはあまり良い習慣ではありません。(9ビット目を使って何が悪いの?)

LIN フレームは、

  • ブレーク (少なくとも 13 ビット時間)
  • 同期区切り文字 (0x55)
  • メッセージ ID (8 ビット)
  • メッセージ (0..8 x 8 ビット)
  • チェックサム (8 ビット)

浮き沈みのある少なくとも 4 つの可能なアプローチがあります。

  1. (あなたのアプローチ。)すべての可能な開始位置から開始し、チェックサムメッセージがどこにあるかを把握してみてください。同期したら、これは必要ありません。(簡単ですが、確率 1/256 でゴースト メッセージを返します。同期フィールドを破棄することを忘れないでください。)

  2. 内部 UART を使用して同期フィールドを探します。区切り文字の後のデータが意味をなすかどうかを調べてみてください。(これは上記よりもエラーの可能性が低くなりますが、同期区切り文字が問題なく通過する必要があるため、メッセージを見逃す可能性があります。)

  3. 休憩を探してください。これを行う最も簡単な方法は、到着するすべてのバイトにタイムスタンプを付けることです。データレートが非常に低い (最大 2000 バイト/秒) ため、受信データをバッファリングする必要はほとんどありません。通常、フレームの最後の文字の終わりと次のフレームの最初の文字の始まりの間の距離は、少なくとも 13 ビットです。文字の受信には 10 ビットかかるため、前のメッセージの最後の文字の終わりと次のメッセージの最初の文字の終わりとの間の遅延は、公称少なくとも 23 ビットです。ビット タイミングに許容範囲を持たせるために、制限をたとえば 17 ビットに設定することができます。「文字受信」割り込み間の時間間隔がこの制限を超えると、文字は別のフレームに属します。中断を検出すると、新しいメッセージの収集を開始できます。

  4. 少しずつ自分でやる。スレーブとマスター間の同期が良好でない場合は、この方法を使用してマスター クロックを決定する必要があります。実装は非常に簡単ではありませんが、1 つの例は次のとおりです

私は#3で行きます。着信データの割り込みを作成し、データが来るたびに、現在のタイムスタンプ (カウンターが必要) を前の割り込みのタイムスタンプと比較します。文字間の時間が長すぎる場合は、新しいメッセージを開始します。それ以外の場合は、古いメッセージに追加します。次に、非常に長い割り込みルーチンを回避するために、メッセージ (収集中のメッセージと分析中のメッセージ) のダブル バッファリングが必要になる場合があります。

実際の実装は、コードの他の構造によって異なります。これにはそれほど時間はかかりません。

そして、あなたのクロックが最も多くのクロックと十分に同期されていること (+-4%) を確認できない場合は、#4 を見る必要があります。

于 2014-06-25T07:31:29.807 に答える