0

私は組み込みシステム プロジェクトに取り組んでいます。ARM M3-Cortex プラットフォーム上にあります。私が使用している機器は、測定コントローラーです。PC に接続でき、いくつかのコマンドを実行できます。コマンドパーサーを設計しようとしていますが、インターネット上でまったく異なるアプローチを見てきました。30 以上のコマンドがあります。各コマンドには異なる引数を指定できます。例: command Date:? は日付を要求するので、デバイスの LCD には日付が表示されますが、コマンド Date:2012,05,30 で日付を設定する必要があります。一部のコマンドはさらに複雑で、さまざまなタイプの引数を持ちます。つまり、アルゴリズムとデータ構造をインテリジェントに設計する必要があります。手がかりや推奨事項はありますか。ありがとう仲間:)

4

2 に答える 2

4

わかりました、ここに事があります。

プロトコルを実装する必要があります。そして、テキストプロトコルだと思います(コマンド要件のため: Date:?)。既存のものを使用したくない場合 (これは非常に混乱します)、少なくともそれらの実装と設計を確認する必要があります。

これまでのところ、私が強くお勧めできるのは、DCON プロトコル(PDF がありますが、見つけるのが少し難しいです。興味がある場合は、検索します)、Modbus ASCIIを調べることです。プロトコル (これは非常に優れたオプションであり、世界中で使用されています)。次に、Siemens SPA (Serial Protocol ASCII) も興味深いものです。

独自のプロトコルを実装する場合(たとえば、バイナリ プロトコルを実装する場合)、設計時に考慮すべき主な点は次のとおりです。

  • バイトおよび/またはワードのエンディアン
  • 浮動小数点表現 ( IEEE754または固定小数点))
  • 開始/終了メッセージ マーカーと ByteStuffing またはBitStuffing (注: 開始/終了マーカーの存在のみ)
  • コマンドのバイト/バイト (たとえば、0x01コイルの読み取り用、コイル0x02の書き込み用など)
  • ACK/NASKバイト/確認メッセージ
  • メッセージの有効性をチェックするCRCコード

もちろん、そのようなプロトコルはたくさんあり、そのうちのいくつかに慣れることは、より良い設計 (または既存のプロトコルの使用) に間違いなく役立ちます。

更新

パーサー/レクサー (追加のライブラリーのために harald が言及したもの以外) を使用してパーサーを実装する場合は、必ず SO の質問「 Is there an alternative for flex/bison that is used on 8-bit embedded systems」を読む必要があります。

于 2012-06-20T12:46:31.283 に答える
4

あなたが望んでいるように見えるのは、パーサージェネレーターです。これは、コマンド言語の文法をかなり簡単に指定できるツールであり、この文法を解析するためのサース コードを生成します。YaccまたはBisonを見てください。ライセンスがあなたの作品と互換性がある場合、彼らはあなたのためにこれを行うことができるはずです。

また、混合物にレクサー (Lexx/Flexx) を追加することもできます。これにより、パーサーが噛むために文字ストリームを辞書的トークンに簡単に変換できます。

アップデート:

絶対的に最も基本的なパーサーとは別に、ジェネレーターはおそらくあなたの人生を楽にしてくれるでしょう。もちろん、提供されたリソースの制約やライセンスの問題が邪魔になることはありません。優れたパーサー ジェネレーターは、とにかく手動で行うよりもはるかに多くのリソースを必要としないはずです。@gahcepが彼の回答で指摘したように、Yacc と Bison には、商用の代替品を含む他の代替品もありますおそらく、それらのいくつかはあなたにより適しているでしょう。

パーサー ジェネレーターを使用する利点のいくつかは次のとおりです。

  • どのように構文解析するかではなく、文法に集中できます
  • 生成されたコードは、多くの場合、単純な 1 回限りのパーサーよりも最適な方法で問題を解決します。
  • 生成されたコードには、実質的にバグがないはずです。

欠点は、生成されたコードをデバッグするのが難しく、自分でコードを作成することで不要になる依存関係が発生する可能性があることです。周りをチェックして、あなたとプロジェクトに最適なものを見つけてください。

幸運を!

于 2012-06-20T13:32:27.987 に答える