2020年1月20日月曜日

user_diskio.c

 SDカードのSPIアクセスのFatFs周り、とりあえずシングル/マルチブロックリードだけ実装してリードオンリーで動くようになった。
 CubeMXでコードを生成しようとすると、SDIOやUSBメモリはFatFsの接続もCubeで作ってくれるが、SPIアクセスだと自分で書く必要がある。(ちなみにSTBee F4miniはピン割当が悪くてSDIOが使えない)

 自前でFatFsの接続を作る場合、user_diskio.cというファイルが作られて、この中に一通りの低レベルアクセスを書く必要がある。
 が、SPIアクセスのライブラリはC++で書いてるので、Cでは直接触ることができない。
 一旦*.cppでラッパー作るか、とも思ったが、そもそもuser_diskio.cの関数群の定義を削除して、適当なCPPでextern "C" DSTATUS USER_initialize(BYTE pdrv)とかで定義してやれば、勝手にそいつを読んでくれる。
 あとは、普通にFatFsでファイルアクセスを作ればいい。さすがにシステム関数をラップしてfopenとかで開くのは作ってない。メンドクセ。。。

 CubeのFatFsってなかなか面倒なラッパーをかませてるので、面倒。というか、HAL自体が面倒なんだよなぁ。どーしてDMA転送命令はDMA転送終了待ちの機能が提供されていないのかね? DMA_Poll呼ぶとタイムアウトするし。。。

***





 1枚目は起動からファイル読み出しの全体。2枚目は初期化終了付近からの拡大。
 すでに初期化してあるカードなので、初期化待ち1発(5msecの区間)で初期化が終了している。

 一番下の紫はMPUの使用状況で、Hなら無負荷、Lなら何らかのタスクが動いてる、という雰囲気。時々2.36msecくらいのタスクが走ってるのはHUB75の処理。SDカードのアクセス中はデータ転送リクエストのビジーを50usec毎に処理しているので、その間に少し使える時間がある。とはいえ、コンテキストスイッチとか考えると無いも同然だが。意外とコンテキストスイッチが高コストで、ざっくり2000命令くらい使ってるっぽい。ブロック転送中はDMAで処理しているので、その間はMPUはほぼフリーに使える。


 とりあえず、JPEGデコーダ(TJpgDec)を入れて固定フレームレートのアニメーションを最低限再生したいな、という段階。

***

 そーいえば、ハードウェア実装のRTOSの話ってどうなったんだ?と思ってぐぐってみたら、ルネサスが製品ラインナップにしてるらしい。「詳しくはこちら!」が404だったりするあたり、ルネサスゥゥゥゥ……って感じだけど。
 youtubeに解説がある。現行は疎結合で、バス経由でコアレジスタを書き換えるらしい。将来的に密結合で直接レジスタ書き換える、みたいな話も。Cortex系だけど、Cortexってそのあたり結構自由に作れるのか。ARMってどのあたりの決め事なのかね? まさか命令セットだけってこともあるまい……

0 件のコメント:

コメントを投稿