ペリフェラルの初期化順序がおかしい

出張前からマイコンのあるペリフェラルの性能が微妙に悪いという話をしていて、

後処理とかでなんとかできますかねぇというので、こういう実験をしてはいかがですかという話をしていたが、

結局のところ、この問題に着手できたのは僕が出張に来てからのことだった。

一緒に顔突き合わせて作業できるのはよかったといえるけど。

で、やっと解決したのだが、ひどい話である。


結論から言えば、ペリフェラル同士の初期化順序が間違えていたという話である。Aの前にBを初期化しないといけないと。

今までマイコンのメーカーが提供する開発環境とライブラリを使って、

それで生成した初期化コード一式を自分で書いたプログラムに取り込んでいた。

よくある話だとは思うんですけどね。

これで自動生成されたコードの初期化順序だと性能がうまく出ないのである。

かといってエラーにもならないし、おおざっぱに言えばそれなりに動いてしまう。

高性能な測定器をいくつか組み合わせるとおかしな動きが見えてくるということで、

これは本当に根気強い調査のおかげだと思うんですけどね。


そもそもペリフェラルの初期化順序に制約があるってのが珍しいと思う。

動作原理を考えればなるほどねという感じではあったんだけど。

1つのペリフェラルの中でレジスタの操作順序が厳密に決まっているのはまぁあって、

そこはメーカーの提供するライブラリを使っておけば堅いと考えるわけである。

ところがペリフェラル同士の順序関係は意識できてなかったんですよね。

いや、これも手で書いていれば正しい順序で起動できてたかもしれない。

ところが自動生成されるコードでは正しくない順序に並んでしまうのである。

初期化順序を指定するオプションとかあったっけ? と思ったがそんなものはない。


この問題に気づいたのは本当に根気強い調査のたまものである。

いろいろ設定をガチャガチャする中で、評価ボード用のテストプログラムに立ち返ろうという話になり、

サンプルプログラムで測定すると、性能劣化が起きないという話が出てきた。

ある意味では当たり前なのだが、詳しく測定したことはなかったようである。

それでパラメータの差を丁寧に比較して、自分のコードに反映したが特に変化がない。

ペリフェラル毎の初期化コードはサンプルコードと全く差はない。

そりゃメーカーが提供しているツールが自動生成するコードだしね。

で、いよいよサンプルコードに忠実にターゲットボートのプログラムを書き換えて実験するか、

とコードの改造方法を考えていたら、順序の差に気づいたわけである。


この調査のためにアナログ回路の設計者にだいぶ時間を浪費させてしまい、

大変申し訳ないという思いもありつつ、まさかメーカーの提供するツールがダメとはまさか……

これ以前にもパラメータの設定がよくないところがいくつかあって、

それはメーカー側の技術者から情報提供を受けてパラメータ変更したりあったんだけどね。

このパラメータも経験則みたいな決め方でどうかと思うんですけどね。


まだ少し気になるところはあるので、出張最終日の明日に調査しようと思うけど、

深刻な問題ではなさそうなので、これでだいたいOKなんじゃないかなと。帰国後に継続調査でもいいし。

これに限らないのだが、出張前から抱えてた問題が出張中に次々解決していったのはよかったが、

これについてはどうにもモヤッとする話である。これはほぼエラッタみたいなもんだろ。

本来なら問題解決して気持ち良く帰れる話に思えるけど、これだけは納得いかん。