通信系の活動記録

出典: Wikimura

ほとんど本人にしか分からない内容ですが...主にソフトウェアFSKモデムの変調側を作る過程が見られます。

解決すべき課題/作るもの:

  • DDS実装→完了
  • FSK下位レイヤ→ほぼ完了
  • FSK上位レイヤ(USART型簡易版)→これから
  • FSK上位レイヤ(AX.25 UIフレーム簡易版)→CANの後で
  • CAN通信(簡易プロトコル版)

目次

09/08/15

今日は用事のためあまり進まず。CANペリフェラルについて大分理解できた。CANはノード間通信ではなく、何らかの情報をバス全体に伝える「放送(broadcast)」の形式をとっているのが印象的だった。

これまでノード間通信だとばかり思っていたので、C&DHと通信系間でプロトコルを考えなくてはならないと考えていた。しかし放送の形式ならば、例えばセンサボードからセンサデータだけを発信したり、各基板のステータスを定期的に発信するなどして、これらを聞き取るノードがテレメトリを作り、発信すればよいのでは?と考えた。かなり遅れてしまったが、C&DH系の担当者と話し合う必要がありそうだ。

CANでメッセージを送信・受信するテストをマイコンだけで行うのは大変なので、何とかしなくてはならない。 対話的にCANを操作できるよう、STM32上で動くCANモニタプログラムを作ろうと思う。

DMAをUSARTで使うコツについてのメモ

以前「DMAは便利だが、USARTでの使い方がいまいち分からない。H8のような割り込みで処理した方がやりやすい」という話を聞いた。 確かにその通りだった。PCからのコマンドで動作させる場合、改行文字が来るのを監視し、見つけ次第動作を開始しないといけない。GPSをつなぐ場合、データのヘッダを探さなくてはならない。これはバッファにためてから一括処理するには不適当だった。

こうした用途の場合、割り込みを使って文字を監視することは不可欠だ。しかし、DMAを使うことで余裕を持たせることが可能だと考えた。その方法は、割り込みハンドラでは主にやってくるデータの監視をさせ、処理の本体は別の場所で行うというもの。

PCからの操作に適したDMAの使い方: データ終端を監視する

PCからのシリアル通信で操作する場合、PCからやってくるデータを漏らさずとっておき、終了文字を検出次第処理に入るのが普通だと思う。この場合、以下のようにDMAを使うと良いのではないかと考えた。

  • 1行分の文字が格納できるバッファ、ラインバッファを何個か用意する
  • シリアル通信でやってくるデータをラインバッファにDMAでデータを蓄える
    • 転送先はラインバッファの先頭から末尾まで。はみ出したらバッファオーバーフロー発生
  • 割り込みハンドラで1文字ずつ監視する
  • 改行文字を検出したら、DMAを停止し、転送先を次のラインバッファへ切り替える
  • それまで転送先だったラインバッファには、最新の行が格納されている
  • 最新の行の処理を、割り込みハンドラ以外で行う

こうすれば、割り込みハンドラで大きな処理をするのを避け、取りこぼしの発生を防げるのではないかと考えた。割と昔からありそうなので改めて書くことではないかもしれない。


GPSデータ受信に適したDMAの使い方: データ開始を監視する

GPSからのデータを受信する場合、データの途中から読み込んでも仕方がない。下のようにDMAを使うと良いのではないかと考えた。

  • データを格納しきれるサイズのバッファをいくつか用意する
  • 割り込みハンドラで開始コードの監視を行う
  • 常にDMAでバッファの先頭だけにデータを格納し続ける
    • 開始コードを取りこぼさないため
    • サーキュラモードが適している
  • 開始コードを検出したら、DMAを設定し直し転送開始
    • 転送先先頭アドレス: バッファの先頭アドレスの次(先頭は開始コードが入ってる)
    • 転送サイズ: バッファサイズ - 1
  • 転送が終了したら格納先を次のバッファに設定し直し、監視に戻る
    • データ数が既知ならばDMA転送終了割り込みで終了を検出できる

09/08/16-17

TOPPERS/ASP Kernel Release 1.3.2 for CQ-STARM(STM32F103) (Aug 17 2009, 22:09:14)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2008 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN
System logging task is started on port 2.
Sample program starts (exinf = 0).
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |
task1 is running (004).   |
task1 is running (005).   |
task1 is running (006).   |
task1 is running (007).   |
個人用ツール