間が空いてしまいました。いいわけでしかありませんが、仕事のトラブルがおきると長距離通勤者はもうダメですね。仕事と通勤でごっそり体力を持って行かれます。若い頃はそれでも何とかなったものですが。というか、トラブルが無くても平日は家に帰ったらもう、ぐったりしています。
さて近況報告。
ブート問題再び
「お前、ブート問題は自分の問題じゃ無いって書いたろ」
はい、書きました。
あの問題は別プラットホームでは再現しないことを確認し、システム設計者にレポートを提出しました。で、5月に対策版のシステム・バイナリ(FPGAイメージを含むSHのソースコード)をもらって解決を確認しました。
が、違う問題が発生しています。
前回の問題はまったく同じバイナリ(LEDが点滅し、シリアルからデータを垂れ流すだけの小さなプログラム)が
- TRX-305ではブートしない
- 別プラットホーム(mbed+Kobanzame)ではブートする
というものでした。今回、修正版のSHコードをいただき、上記の小さな検証用Blackfinプログラムがブートすることを確認しています。ところが、TOPPERS/JSPがブートをしないのです。
- TRX-305でTOPPERS/JSPがブートしない
- 別プラットホーム(mbed+Kobanzame)でもブートしない
なんてこった。明らかに今回の問題はこちら側にあります。
TOPPERS/JSPはかなり古くからメンテしているプログラムです。Blackfinブートローダーに関しては、パラレル・フラッシュ、シリアル・フラッシュ(SPIマスター)、UARTスレーブのそれぞれのブートで実績があります。
今回SPIスレーブ・ブートで問題が生じている原因がどこにあるかは不明ですが、これまでの調査ではそもそもメモリーへの転送が完了していない節があります。ツールの不備まで視野に入れて腰をすえて対策するしかありません。
送受信非同期問題は解決
ブート問題の他は、じりじりと前進しています。
かなり長い間頭を悩ました「送受信の非同期」は解決しました。原因は、結局送信側のスペックを私が読み違えていたことでした。同期信号は「送信のフレーム信号を除いてすべて外部生成」なのですが、これを「すべて外部生成」と勘違いしていたのです。修正後は両者の非同期問題は消えました。なお、この問題はTOPPERS/JSPのデータキューAPIからのエラーですぐに検出できており、RTOSをつかったかいがありました。
10MHzクロックへの対応
上記ブート問題(その1)の対策コードが来た際、DSPの入力クロックに変更がありましたが、ここで躓いてしまいました。デバッグの結果わかったことは、10MHz入力のときにはPLLの初期化が行われていないということです。これは不思議なことです。PLLの初期化コードは、随分前に実装してこれも多くの実績があります。実際、PLLの初期化には問題が無く、今回発覚したのは「そもそも初期化コードを実行しない場合がある」という事でした。
Blackfinはブートの状況により、PLLの初期化の要不要がことなります。一番面倒な場合は、
- 外部SDRAMを持ち
- コードがそこに展開される
場合です。普通だろと侮るなかれ、この場合はブートコードがSDRAMにコードを展開する前に、SDRAMとPLLの初期化を行わなければなりません。この初期化を行う部分は、当たり前ですがブートされるコードには存在していません。ブートローダーが認識できる別領域に小さな初期化コードを入れておき、二段ブートを行うことで解決します。
そして、この「小さな初期化コード」は当然ですがGDBからはロードされません。そんなこんなで、「SDRAMで走るアプリケーションのデバッグ用」に、TOPPERS/JSP for BlackfinのPLL初期化コードには「外部でPLL/SDRAMが初期化されたか」検出するコードがあります。これまで問題無く動作していたこの判別コードが今回に限り誤動作したのが問題の根本原因でした。10MHz入力の時には、Blackfinの動作が多少不安定なのかもしれません。ともかく、この問題は解決しており、現在プログラムは10Mhzで動作しています。
RXパラメタAPI実装済み
また、デコーダー・アルゴリズムから各種パラメータを参照するAPIも実装しました。TRX-305はSHで解析したコマンドをFPGA経由でDSPに送ります。これらは復調モードの他、スケルチなどいくつかのパラメータを含みます。これらのコードをFPGAから受け取り、内部に展開してデコーダー・アルゴリズムから参照できるようにしています。
ほとんどのAPIが返す値については、トランジスタ技術誌2014年11月号で紹介された一覧表と対応が取れていますが、一部はっきりとしないものもあります。これらの解析についてはフレームワーク開発の手に余りますので、単に値を渡すだけで、フレームワーク側では何も解釈を入れない設計としています。
浮動小数点ライブラリのリンクも完了しています。このフレームは固定小数点信号処理を想定していますが、浮動小数点演算が全く使えないというのも無粋ですし、なにより実験一つ出来ないのは不便です。これはこれで、門司に書くと簡単ですが、Makefileの書き方にとldコマンドの特性から来るトラブルで半日ほど頭を抱えていました。今は動いています。
微速前進中
そんなこんなで、今は開発中のフレームワーク内部でsin波を生成して外で聞くことが出来る程度に開発が進んでいます。まだ出力されてくる音が変ですが、ともかくプロジェクトは前進しています。