少し真面目にプログラミング作業中。
9軸センサでAHRS。ある程度動くようになってきたけど、磁気センサのノイズがヤバい。まぁ、たぶん動いてるんじゃないかなぁ。そのうち外に出て磁気ノイズ少ない場所で試してみよう。
FreeRTOSのStreamBuffer、いまいち使いづらい。単位が1バイトでブロック転送、入り切らない場合はそれが通知されるので自前で解消する必要がある。例えば、データの途中が欠損しても問題ないファイル形式を使うか、確実にデータを収納できる十分な大きさを確保する、といった感じ。
UARTのRXバッファに使おうと思っていた。1バイト受信割り込みでStreamBufferへ1バイトずつ転送する、という使い方。ただ、この方法だと、受信側で100バイトをタイムアウト100ミリ秒で待機、という場合に、StreamBufferに1バイトが入ると、受信側では1バイトだけ読み出して即時帰る、という挙動になる(しきい値が1の場合)。受信タイムアウトは、溜め込んだデータがしきい値を超えるまでに待つ期間で、タイムアウトまでに閾値を超えれば、要求されたデータ数に満たなくても直ちに帰る、という感じらしい。なので、receiveを呼び出す側は10ミリ秒とか50ミリ秒とか、十分なインターバルで呼び出したほうが、効率的に処理できるはず。
本来は、UARTをDMA経由でアクセスして、一気に数十バイトをStreamに入れたほうが、効率がいい。ただ、DMA単体だと可変長のデータには不向きだし、Idleとかを使うとDMAとの同期が面倒になる。今回は9600bpsと低速なこともあって、割り込み単体で使ってみた。気が向いたらUART x DMAもがんばる。。。
以前、UART x DMAの組み合わせも使っていたけど、そのときはDMAをリングバッファ代わりに使って、非同期で1バイトずつ読み出す、というような処理だった。そういう使い方は、それほど面倒じゃない。効率的にやろうとすると面倒なだけで。
STM32F4のDMA、あんまり真面目に考えて使ってなかったけど、かなり使いやすい。F1のDMAっていちいち初期化しなきゃ使えないイメージだった(記憶が合ってるか怪しいけど)。F4のDMAは、1回初期化してしまえば、アドレス書き換えて長さ書き込んで有効化するだけで使える。DMAを使うコストは圧倒的に小さい。HAL経由するとアホみたいにコストかかるけど、そもそもシリーズが同じなら移植性は高いし、シリーズが違えば移植性は低いし、いちいちHAL経由する必要性ってあんまり感じてないんだよなぁ。ということで、直接レジスタ叩いて、ガンガンDMA使っていこう!と気持ちを新たにした次第。
SPIはビットレートが高くて、数MHzから数十MHzくらいと、DMAの必要性がかなり高い部類。んで、送信専用は問題なく動くんだが、受信専用の使い方がわからない。512バイトを受信する、みたいな使い方をしたいんだけど、BIDIMODEとかRXONLYとかつけると、無制限に受信しっぱなしになってしまう。結局、送信DMAのMEMINCをクリアして特定の1バイト(0xFFとか)を送信させて、SPIのクロックはTx側のDMAで停止させる、という感じでお茶を濁した。もうちょっと上手いやり方がありそうな気がするんだけど。レジスタ直接アクセスなら一挙動でMEMINCのセット/クリアができるので、躊躇せず使える。
SPIでアクセスする某リムーバブルディスクのドライバを作成中。当然ながら、DMA多用。
何故か動かん。。。
結局、スタックがCCMRAMだから、DMA転送はできない、というオチ。ナンテコッタ
小さいデータ(数バイト程度)もDMAで転送していたのが仇になった。
DMA使わずに回すか、CCMRAM外にコピーして回すか、選ばないといけない。たぶんポーリングのオーバーヘッドはかなりでかいので、適当な場所にコピーしたほうが早そう。あるいは、そこまでRAMキチキチじゃないから、タスク類全部CCMRAMの外に出すか。
小さいデータ領域が欲しくて、試しにFatFsをPCで走らせて、どのくらいのセクタサイズを作れるのか試してみた。最小で200セクタx512オクテット、あたりが限界らしい。もっと小さくしようとするとmkfsでコケる。200セクタだと100KiB。
バックアップSRAMの4KiBをファイルアクセスで使えれば便利かな、とか思ったんだけど、そうは問屋が卸さない。いくら昔のシステムは容量が小さかったとはいえ、今の時代まで生き残った規格は数MiB程度以上が前提らしい。
大昔のファイルシステムってどんなモノだったんだろうか? カセットテープとかの時代なんだろうか。
とりあえず、作りたいやつの形は見えてきた。カロリー高い処理が残ってるけど、前に書いたコードをコピペしてきて使えるはず。もうひとがんばり…… これ、デバッグ中はPCで操作してるけど、実際に使うときはUIどーすんだろ??
0 件のコメント:
コメントを投稿