通信系の活動記録
出典: Wikimura
ほとんど本人にしか分からない内容ですが...主にソフトウェアFSKモデムの変調側を作る過程が見られます。
解決すべき課題/作るもの:
- DDS実装→完了
- FSK下位レイヤ→ほぼ完了
- FSK上位レイヤ(USART型簡易版)→これから
- FSK上位レイヤ(AX.25 UIフレーム簡易版)→CANの後で
- CAN通信(簡易プロトコル版)
- 通信系の活動記録 09/08/01 - 09/08/07 <--- マイコンのペリフェラルでDDSっぽい物を作り、FSKができることを確認
- 通信系の活動記録 09/08/08 - 09/08/14 <--- FSK下位レイヤ完成
- 通信系の活動記録 09/08/15 - 09/08/21
- 通信系の活動記録 09/08/22 - 09/08/28
- 通信系の活動記録 09/08/29以降
目次 |
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). |

