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 件のコメント:
コメントを投稿