開発日記

DMA descriptor

前回の下記の記述について.
ソフトが生成した descriptor は DMAC によって更新されてしまう

これは DMA の最後のサイクルに 2 度か 3 度同じ出力をするために、同じ descriptor を流用したところで想定とは違う動作をしていたために DMAC によって更新すると解釈した. 実際は DMAC が descritpor を更新するのは writeback だけで DMAC->BASEADDR は更新しない. 唯一の問題は descriptor の流用がダメ. 流用を修正したソースコードの定数管理が不適切で、シミュレータの assert を抜ける形で定義領域を超えた操作のため別の変数を操作していた. よって descriptor が勝手に更新されているように見えた.

自身の人為的ミスに気づかず原因調査のために時間を浪費してしまった. 今後同じようなミスをしないようにしたい.

progamming

この問題を修正したところちゃんと動き、2022-08-20 と同じ条件の programming の経過時間が 16.0 秒から 12.3 秒に改善した. polling 間隔は前回の 54 us から 30 us に改善した.

descriptor の再生成を省略すると 24 us 早くなる. descriptor は再利用できることがわかっているので同じ操作をするだけなら DMA channel の初期化なんてものは必要なく再度起動するだけで早くなる. などソフトの細かい最適化の幅がまだある.

programming の並列動作については現状の回路に問題がありデバッグをあきらめてしまった. REGION の切り替えに DMA を利用できない GPIO を利用しているのでこれも 74595 を追加して DMA で操作できるようにすると MCU の負担が減って本当に早くなる. 今回のソフトの改善も回路変更前提で作った.

作業の終わりが見えない.