表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
57/61

7. PSRAMディスクへのRAWアクセスを行った後データが化けまくる

性能も大分上がったので、いろんなパターンの性能も取ってみようと、ファイルシステムを経由せず、直接readblocks() で未使用の領域をテストしてみた。

ちゃんと読み書きはエラーにならず、性能もファイルシステム経由より速い。妥当だ。

と喜んだが、テストを実行した後、それ以降のアクセスで read データが異常な値になる。具体的には同じ値が連続する。333333とか"""""""とか

PSRAMが誤動作してんのかな?

と思って性能測定プログラム内でデータ確認すると、その時点でデータが化けてる。ダメじゃん。


色々試してみたがreadblocks() を実行した後にダメになるのは確定。原因がわからないと気持ち悪くて使えない。

しばらく悩んだがさっぱりわからないんで、放置することにした。

バグったソフトは時間を置くといいアイデアが出ることがあるし。


<数日後>


ドライバの構造を見直してて気が付いた。

PsramDevice というクラスを定義したドライバだが、PIOやDMAを使う部分はクラスで共通でアクセスしたいのでクラスメソッドにしていた。一方、ファイルシステムで使用するPSRAMのサイズを指定したいので __init__ の引数で指定した。

つまり、クラスメソッドとインスタンスメソッドが混在した作りになっている。

これだけなら良かったが、3.PIOのトラブルまみれ と同じことをやらかしてた。


__init__ の先頭でCSやCLK信号ピンの初期化をして、PSRAMのリセットなどの後、PIOとDMAの初期化をしていた。ファイルシステムとして使っている間は、これで問題ない。


ただ性能測定用にこのクラスをimport をして ps = psram_dma.PsramDevice() と別のインスタンスを作成したのがアウト。 __init__では CLK 信号ピンの初期化を行っているので、PIOの設定後にGPIOの初期化を行っていたことになる。


なるほど、CLK信号が出ていない状態でQSPIで 4bit の入力を繰り返してるから、全く同じデータが連続するわけだ。


原因がわかってすっきりしたし、初期化済みフラグをクラス変数に記憶すれば解決。

あとは、どこまでクロックを上げられるかを確認して、安心して使える数値を割り出す感じで。

評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ