ようこそ!JQ2RVNのブログです。
PICを使っていろいろな物を作ろうと画策中です。
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 CCS Cコンパイラを使っている時、 まず、以下のような処理を考えます。 UARTで8ビットのデータを送信するとき、 通常ならば、while文を使うところですが、 順当に書けばこんな感じでしょうか? i++; if( i > 8 ) しかし、この場合if( i > 8 )の計算のために
逆にiを減算していったほうが、処理としてはスマートになります。 i--; if( i == 0 ) こうしておくと、 どうやら、i==0と比較しようとすると、
このあたりを考慮すると、if文内はビット演算として書かないといけないようです。 さらに、デクリメント演算はif文の中に入れてしまう。 まとめると、 if( ! --i ) と書きます。 コンパイルされたアセンブラは以下のようになります。 decfsz i,f 処理B else 処理B end_if decfszは、
論理を逆にして
ポイントをまとめると
この原則を守ると、可読性が失われる時もありますが、
PR
今日はAX.25のSSIDについて書きます。
プロトコルの仕様書を読めばわかるのですが、英語なので・・・ AX.25において、送信元コールサイン、宛先コールサイン、デジコールサイン、 これらは7ビット構成でフォーマットも同じです。 最初の6バイトはコールサインが入っています。 ただし、ASCIIコードが左に1回シフトされています。 よって、基本的には最下位ビットは0になります。 つぎの1バイトにはSSIDが入っています。 ビットの構成は HRRSSSSF となります。 H ・・・ デジピート済みを表します。 RR ・・・ 予約 SSSS ・・・ SSID。これによりSSIDは0~15の値になります。 F ・・・ デジの最終地点を表します。 それぞれの解説していきます。 まず、SSSS。 受信の際にはSSIDバイトを1回右シフトして、0x0FのANDを取れば、 SSIDの数値を得ることができます。 逆に送信時には、SSIDを1回左シフトして、ORを取ります。 Fビット。 ここが1になっている場合、次のバイトはControl Fieldで、 さらに次はProtcolIDであるとわかります。 コールサイン部分を左にシフトするのは、実はこのためのようです。 つまり、最終ビットをみていって、1が出てきたら、アドレス類は終了だと判断できますから。 AX.25の場合、アドレスは7バイト固定なので、SSIDバイトをみればいいのですが、 昔の名残とか、そんなやつなんでしょうか?? 最後にHビットです。 ここのフラグが1になっていれば、そのアドレスまではデジピートされていることがわかります。 デジピータは、先頭からスキャンしていき、このフラグが1になっているところを探します。 もし見つかったら、その次のバイトから7バイトが、 自局のコールサイン・エイリアスに合致しているか調べます。 合致していたら、その部分をコールサイン置換するなりします。 そして、ひとつ前のアドレスのH=1をH=0に変更し、 自分のSSIDフィールドのHを1とします。 ちなみに、APRSなどのパケットでコールサインの後ろに'*'がついていることがありますが これは、Hビットが1だった場合、コールサインの後に*をつけ、 人間の視覚上わかりやすくしています。 以上で、SSIDバイトの解析は終わりです。 |
カレンダー
プロフィール
コールサイン:
JQ2RVN
性別:
男性
自己紹介:
PICの開発を勉強中です。
目標はPICTNCの高性能版を作ること。 まずは、本家を解析しています。
カテゴリー
最新記事
最新コメント
[04/23 Eolande]
[04/16 太田和巳(JF2UJG)]
[09/10 je7ifp]
[08/06 JQ2RVN]
[08/03 OVC]
最新トラックバック
ブログ内検索
最古記事
(05/18)
(05/19)
(05/19)
(05/20)
(05/21)
アクセス解析
|