Blackfin - ライブラリとメモリ超過

投稿 2015年04月12日 18時35分36秒 | Blackfin | hotall


私が学生だった頃、マイコンのメモリはKbyte単位でした。
この時代では、常にプログラムサイズを意識しながらのプログラミングです。

使用言語は高級言語もありましたが、アセンブラがメインですから、ソースコードの行数で大体のサイズがわかるので、そろそろ危ないのではないかと、ヒヤヒヤしながらコードを追加していました。

あれから、月日が経ち、汎用パソコンのプログラミンばかりを手がけていると、メモリサイズがMbyte、Gbyteとなるにつれ、プログラムサイズへの関心は薄れていきました。

実際、過去には作成したプログラムのリファクタリングで、プログラムサイズを削減するのに多くの時間を費やしていました。しかし、現在ではパフォーマンスのチューニングはあっても、プログラムサイズそのものの調整はほどんどありません。

私がBlackfinの調査の一環として雛形プログラムを作成を進めていた時、それはやってきました。

VisualDSP++にはメーカが提供するライブラリがあります。
各機能を抽象化し、内部レジスタを意識することなくプログラミングできることは、作業効率を高めるだけでなく、ハードウェアが持つ振る舞いの癖などに悩まされず済みます。この分野には「おまじない」というコードが存在するのも実装の困難さを象徴しています。
ですから、メーカーが提供するライブラリを極力使うのは自然な流れです。

今回も、この方針で雛形プログラムを作成していました。
割込み管理、遅延コールバック、電源管理、DMA管理、タイマー管理・・・と機能を増やしながら逐次コンパイル・テストを行い、順調に作業は進んでいましたが、ある時、コンパイラが文法エラー以外のエラーを吐きました。
[Error li1040]:Out of memory in output section 'L1_code' in processor 'p0'
Total of 0x1924 word(s) were not mapped.
メモリ超過です。

ツールのメモリマップウィンドウでLDFファイルをダブルクリックすると詳細が表示されます。
L1_code区画が赤く表示されています。これを更にダブルクリックすると、包含モジュールの一覧が表示されます。
すると使用領域がはみ出しているのが分かります。一番大きなモジュールがlibc532y.dlbで、L1_code領域をほとんど埋めています。
左のInput Sections画面からこのライブラリモジュールを展開表示すると、かなり多くの関数群が含まれているのがわかります。
試しに電源管理の使用をやめると、エラーはなくなりました。

更に詳細を調べるため、メモリマップリストを作成します。
[プロジェクトオプション]-[Link]-[General]-[AdditionalOutput]-[Generate symbol map]をチェックするとmap.xmlファイルが出力されます。
出力された<プロジェクト名>.map.xmlファイルの<MEMORY>要素にファイルのメモリ使用量が記述されています。
<OUTPUT_SECTION name='L1_code' id='033CC810' memory_id='02A89B00' type='SHT_PROGBITS' 
start_address='0xffa00000' word_size='0x7274' word_size_unmapped='0x1924'
word_size_reserved='0x0' >
<MEMORY id='02B99ED0' name='MEM_L1_CODE' start_address='0xffa00000'
end_address='0xffa07fff' type='' qualifier='RAM' width='0x8' words_used='0x7274'
words_unused='0xd8c' >
使用が0x7274で未使用が0xd8cということは残り10%です。
このライブラリを使用すると、ユーザーが使用できる領域はほんの僅かということです。
ADSP-BF59Xのメモリマップ上、プログラムコードが使用できるのは0xFFA00000-0xFFA07FFFまでの32KBYTEしかありません。

サービス別のオブジェクトサイズは次の通りです。
サービスのコードサイズ(%=x/32768)
遅延コールバック:libssl592-ay.dlb[adi_dcb.doj:2202(6.7%)
DMA管理:libssl592-ay.dlb[adi_dma.doj:8628(26.3%)
フラグ入出力:libssl592-ay.dlb[adi_flag.doj:2464(7.5%)
割込み管理:libssl592-ay.dlb[adi_int.doj:2028(6.2%)
割込み管理:libssl592-ay.dlb[adi_int_asm.doj:1824(5.6%)
ポート入出力:libssl592-ay.dlb[adi_ports.doj:698(2.1%)
電源管理:libssl592-ay.dlb[adi_pwr.doj:6132(18.7%)
電源管理:libssl592-ay.dlb[adi_pwr_asm.doj:192(0.6%)
タイマー管理:libssl592-ay.dlb[adi_tmr.doj:3482(10.6%)

試しに今度はReleaseモードでコンパイルしてみました
<MSG id='034042C0' mid='li3201' type='Informational' suppressed=''>
<TEXT><![CDATA[Successfully eliminated 16036 bytes in processor 'p0']]></TEXT>
16Kbyteに縮小されました。
しかし、Debugモードが使えない開発は開発効率上、現実的ではありません。

ここで疑問が湧きます。サンプルプログラムにはすべての機能を網羅したPower_On_Self_Testがあります。これは一体どうなっているのでしょう。
因みにこのプログラムをコンパイルして、サイズを調べてみます。
debugモード:0x6542(25922byte)
残り=32768-25922=6846(21%)

メモリは残り2割を残して、収まっています。
それでも残り2割とは。ここにアプリケーションを収めるには厳しいと感じざるを得ません。
しかも、中を調べてみると、ライブラリはほとんど使っておらず、ほぼスクラッチでコーディングされています。

ここで、私はようやく気づきました。このメモリサイズではライブラリは使えないと。
Blackfinは外部メモリを拡張できますが、今回はオンチップメモリ上で動作さなければならない制約があります。
ここに多くの機能を実装する今回の仕様では、ライブラリの使用を断念せざるを得なくなりました。

Blackfin - 開発ツール(VisualDSP++5.0)のインストール

投稿 2015年04月10日 12時21分29秒 | Blackfin | hotall


開発の容易性を決定する重要な要素は、開発ツールです。
今回使用するBlackfin用の開発ツールは、メーカーが提供するVisualDSP++です。
名前から推測されるのはMicrosoftの開発ツールを意識していること、そしてC++をサポートしていることです。

Microsoftの開発ツールは使い慣れています。
C++で高度に抽象化したプログラミングも捨てがたいのですが、メモリ制限が厳しい組み込みソフトでは、オーバーヘッドが大きくなりがちなこれらの言語は今回は避けようと思います。

ライブラリやサンプルプログラムも用意されているのは嬉しいです。
ライブラリは内部の入出力ユニットの複雑な操作を容易にしてくれるはずですし、サンプルプログラムは、確実に動作するひな形として利用できます。
しかし、後でわかるのですが、この楽観的な考えの向うに困難が控えているのです。

デバッグに関しては、JTAGインターフェースが用意されており、オンチップ・エミュレータによりオンボード/リアルタイムデバッグが可能となっています。
特に、今回貸し出された評価ボードではUSBインターフェース経由でのデバッグが可能となっていたので、特別なインターフェースを用意しなくてもデバッグはできそうです。

それでは、開発環境の構築から始めます。
今回使用するVisualDSP++5.0はメーカーサイトからダウンロードできます。
有償ソフトですが、Webからユーザー登録すれば90日間のテスト用ライセンスが取得できます。
サイトにはWindows7までしかサポートしていませんが、現在の私のPC環境であるWindows8.1/32bitにインストールしてみます。

インストール


Webからもダウンロードできるのですが、今回は開発キット(ADSP-BF592 EZ-KIT LITE)に付属のCD-ROMからインストールしました。
インストールするとライセンスの入力を求められます。
メーカーサイトにアクセスし、テストライセンスを取得します。
スタート画面から[Manage Licenses]を起動し、取得したserialNoを入力します。
今回は開発キットを使用するので、このキット関連の機能を使用するため、キットのシリアル番号を入力し、バリデーションコードをテストライセンスと同様にWebから取得します。

次にツールのアップデートをします。
まずメーカーサイトからUpdateSoftwareをダウンロードします。
http://www.analog.com/jp/content/visualdsp_tools_upgrades/fca.html#vdsp50

マニュアルには[Maintain this Installation]メニューからアップデートするように書かれているのですが、このメニューが見つからないのです。おそらくOSのバージョンの問題と思われます。
色々試してみると、セットアッププログラムからアップデートできることがわかりました。

インストールディレクトリのセットアッププログラム(Program Files\Analog Devices\VisualDSP 5.0\Setup.exe)を起動し、[Apply Dounloaded update file]を選択します。ダウンロードしたファイルを指定して実行します。

デバッグ環境の設定として[VisualDSP Configurator]でPloatformを追加します。
type:ADSP-BF592 (1 processor) via HPUSB-ICE
Device ID:0


ビルド

操作方法はMicrosoftのVisual Studioと似ています。
試しに、スタートアップマニュアルに書かれてある、サンプルプログラムをビルドしてみます。
ところが、コンパイルエラーが発生します。
[Error ea1011] "command-line":1 'K': Already saw input filename C:\Users\.

これは関連フォルダパスに日本語が含まれる場合に発生するようで、日本語のない名前でユーザーを作成し、サインインすることで解決しました。しかし、未だに言語依存するプログラムがあることに驚きです。

ライブラリ

メーカーが開発ツールとして提供しているライブラリには次のものがあります。

C/C++標準ランタイムライブラリ
言わずと知れたANSI標準ライブラリです。

DSPランタイムライブラリ
信号処理用の演算ライブラリです。

サービス
プロセッサの各種機能(特にIOインターフェース機能)を抽象化し、利用を容易にします。

デバイスドライバ
IO機器を共通の操作関数で操作できるように抽象化し、制御を容易にします。
これはサービスに含まれるデバイス管理機能にプラグインされるもので、名前からもわかる通り、、WindowsやLinuxのデバイスドライバと同じ位置づけとなります。

サンプルプログラム

開発ツールには開発キット毎にサンプルプログラムが用意されています。
インストールディレクトリ(\Program Files\Analog Devices\VisualDSP 5.0\Blackfin\Examples\ADSP-BF592 EZ-KIT Lite)にあります。
+ background_telemetry
+ Drivers
| + Ppi
| + Spi
| + Sport
| + Uart
| + Autobaud
| + Echo
+ Flash Programmer
| + Serial
+ Power_On_Self_Text

他の開発キットに比べれば、サンプル数は少ないですが、取りあえず、すべての機能のサンプルプログラムはありそうです。

中を調べてみると、Driver関連以外は、ライブラリをほとんど使わないレジスタを直接操作するプリミティブな方法でコーディングされています。
折角、動作確認されているライブラリコードがあるのに使わないのは不思議と思いつつ、これらサンプルコードとライブラリマニュアルと睨めっこしながら、調査を続けます。
(後々、サンプルプログラムがライブラリを使用しない理由は判明することになるのですが。)

Blackfinとは

投稿 2015年04月09日 15時25分41秒 | Blackfin | hotall


DSPと言えば名前の通り、画像処理や音声処理などの信号処理を行うために開発された特別なプロセッサです。デジタルフィルタやフーリエ変換などの積和演算を高速に行えるような構造になっています。

かつては、DSPソフトウェアは組み込みソフトでも特殊な分野であり、我々汎用プロセッサのソフトウェアエンジニアにはなじみが薄く、むしろハードウェアエンジニアが手掛けることが多かったのではないでしょうか。

実際、要求されるプログラムのスタイルも、汎用プロセッサがイベント主体の処理に対し、DSPは連続的な行列計算を主体とするため、設計方法も異質なものになっています。
むしろ、PLAに近く、ある特別な処理を専用に行う、カスタムロジックモジュールとしての扱いとなっていました。

今回の案件では、信号処理はメーカー側から提供されるライブラリを使用するので、複雑なパイプラインによる積和演算アルゴリズムを設計することはなく、その周りのインターフェース部分が主な開発対象となります。
したがって、話が出た当初は従来通りの汎用プロセッサと変わらない案件と高を括っていました。

今回使用するDSPはANALOG DEVICESのBlackfinです。
初めてのプロセッサなので、まずはマニュアル一式をダウンロードして内容を理解します。



概略構成図をざっと見てわかることは、まず、昔の単機能のDSPとは異なり、様々な入出力インターフェースを含んでいます。
この構成を見る限り、高機能なワンチップマイコンのように見えます。

組み込みプログラム製作者にとって、これら周辺インターフェースユニットの理解は重要です。
制御対象となる周辺装置は様々なインタフェースで繋がり、それぞれのインターフェースをハードウェアレベルでサポートするのがこれらインタフェースユニットです。

インターフェースユニットは同じ入出力仕様であってもプロセッサ毎に実装が異なるため、これらの使い方を理解せずにプログラムを作成することはできません。
つまり、インターフェース毎に異なる処理を記述するのは勿論、同じインターフェースであっても、それぞれのCPUの実装に応じた処理を書かなくてはならないのです。


演算ユニットの内部ブロック図を見ると、二つの汎用演算器のそれぞれの入力に乗算器と二つのビデオ処理用演算器が繋がっているのが特徴的です。
高速性を要求される信号処理用を専用の演算器で処理させ、その周辺の処理を汎用演算器で行うという意図でしょう。

しかし、高級言語を使うプログラマから見れば、どのような演算ユニット構成であっても、演算処理についてはコンパイラがレジスタの割り当てや演算ユニットのスケジューリングを行うので、アプリケーションとしてはそれほど意識しないで済むはずです。特に今回は、信号処理をライブラリに頼るので、演算ユニット内の処理は隠蔽されています。

演算器から外へ視線を向けると、演算器とのデータのやり取り行うL1メモリには、多数のDMAユニットが配置されています。
これは、演算器に比べて低速なメモリアクセスにプロセッサコアを使用せず、裏でDMAにやらせるという意図があります。
つまり、この使い方を習熟することが、このCPUを効率的に処理させるのに欠かせないと云えます。

以上のように、入出力インターフェースとDMAの使用方法、特にDMAと入出力インターフェースとの連携については、かなり癖があることは容易に想像できます。
このプロセッサを使用する技術的なリスクはこの辺にありそうです。

新しい案件とBlackfin

投稿 2014年08月27日 16時11分11秒 | Blackfin | hotall


見知らぬ土地に旅に出ると、迷うことが多く、予定通りにゆったりと過ごすことができません。
苦労が多い反面、新しい経験にわくわくしたり、思い出も多く残せます。

ソフトウェア開発という仕事は、適用分野が違えば、全く異なるスキルが必要とされます。
適用業務、ターゲットハードウェア、開発言語・環境、どれも多種多用です。
ですから、どれだけスキルを積んでも、依頼される仕事によっては、一から知識の修得が必要とされることが度々あります。

私は長らく請負の仕事から遠ざかっていましたが、久々に組み込みソフトの案件が入ってきました。
今回のターゲットはBlackFinという私にとって未知のCPUでなので、仕事を受ける前提として必要に迫られ、このCPUを調査しました。
残念ながらこの案件は成約には至りませんでしたが、折角の経験ですから調査内容をこのブログに載せることにしました。

ウィジット

投稿 2012年12月21日 13時40分15秒 | ほたるメモとは | hotall


先日、久々にテレビで洋画を見ました。
主人公の周りで、不可解な出来事が次々と起こり、主人公の冷蔵庫には知らぬ間にメモが貼られ、それが最終的にすべての謎を解くというストーリーです。
冷蔵庫にメモを貼るのは万国共通なようです。

常に目につく所にメモを貼るのは、大切な事を忘れないための良い方法です。
ディスプレーの縁、コルクボードや手帳の表紙など、我々は短いメモを付箋という形で習慣的に貼り付けます。


スマホやタブレットのホーム画面は、最初に表示される最も目につく場所です。
今回、ほたるメモで作成したメモの先頭行を一覧で表示するウィジットをサポートしました。

サイズは限られていますので、表示できるのは最新の数件ですが、Android3.0以上ならスクロールして表示できます。さらにAndroid4.0以上ならウィジットのサイズも変更できます。

ウィジット機能により、メモのタイトルを付箋のようにホーム画面に貼りつけることができるようになりました。

また、本来のメモ画面へのアクセスも容易になります。
項目行をクリックして元のメモ画面の呼び出しや、フォルダアイコンをクリックしてメモ一覧画面の呼び出しだけでなく、追加アイコンをクリックして新しいメモを即座に作成できます。

現在、ほたるメモをお使いの方には、ぜひ試していただきたい機能です。
«Prev || 1 | 2 | 3 | 4 | 5 | 6 || Next»