WindowsCE6.0で、自分で用意したpngファイルやwavファイルを、ROMから直接読み込む方法を教えてください。
はじめまして。 きはどんと申します。
現在、WindowsCE 6.0でアプリケーションを製作しています。
メモリは、フラッシュROM32MB, RAM32MB です。
現状では、OS、DLL、アプリケーション(exe)、PNGファイル および wavファイル 全てが RAMIMAGE に含まれています。
これをROMに焼いてから全てをRAMに転送してから起動しています。
config.bibはこのようになっています。
BOOTARGS 8C000000 00040000 RESERVED ; Common boot/oal structure( F-ROM 2 )
NK 8C040000 00F00000 RAMIMAGE ; For non-IMGFLASH images, this will be autosized
RAM 8CF40000 010C0000 RAM ; RAM
Platform.bibでは
MODULESセクションがたとえば
graphics.dll $(_FLATRELEASEDIR)\graphics.dll NK SHK
FILESセクションがたとえば
Bell.wav $(_FLATRELEASEDIR)\..\snd\Bell.wav NK
というふうに なにもかも NK にまとめられるような設定になっています。
今のシステムでは、PNGファイルもwavファイルも内容を書き換える必要はありません。
そこで、RAM領域を節約するために OS、DLL、アプリケーションは これまで通り
ROM->RAMコピーして使用し、PNGファイルや、wavファイルはRAMに転送せず、ROMに置いたまま読み出したいのです。
何か方法や参照先などございましたら ご教示いただけないでしょうか。
よろしくお願いいたします。
すべての返信
PNGファイルや、WAVファイルは、Application層から使うのですよね?
WinCEのアプリプログラムは、仮想メモリにしかアクセスできません。
プログラム実行中に書き換えないとしても、それらのファイルを表示する場合、結局RAM(勿論仮想メモリ)を使う様な気がするので、ROM→RAMのコピーをしないことで本当に動作中のメモリが節約されるのか疑問です。PNGファイルやWAVファイルを表示するプログラムも、仮想メモリに展開してアクセスするのでは?
もし、PNGファイルやWAVファイルを処理するプログラムも自作して、ファイルの一部を細切れにアクセスするのであれば、カーネルモードのデバイスドライバを書いて、アプリにデータを供給するやり方はあるでしょう。
エンベデッドエバンジェリスト
太田
太田様 回答ありがとうございます。
そのとおり、PNGはWAVファイルはアプリケーションから使いたいです。
あちこち調べると、プログラムにおいてはXIP(ROMのまま実行) 、ファイルにおいては BinFS (ROMのファイル?) というようなものが ROMを直接(直接でなくても、RAMにコピーせずに)
使うことをサポートしている、、、ような気がしますが それはブートのときだけ使えるのか、アプリケーションからも使えるのか、、、そのへんがはっきりしなくて、、行き詰まってしまいました。
たとえば、おっしゃるように 直接アクセスするのではなくて ROM用のファイルシステム用のデバイスドライバを書いて、それ経由でROM上のデータをファイルとしてアクセスできれば
とても助かります。 ただし、OSの知らないROM領域にこっそりバイナリデータを用意して、それを独自デバイスドライバからバイナリとして読み出すというのではなくて
合法的というか、「WinCE上のファイルとしてオープンできて読める」という方法が ないものか、皆さんのお力をお借りできればと思います。
よろしくお願いいたします。
きはどん。- 「RAMに転送する」という意味な以下のいずれでしょうか?
1. 「NK.BINをRAM上にロードしてからOSが起動するため、NK.BIN内のファイルはすべてRAM上にある」という意味
2. NK.BIN内にある"\Windows\bell.wav" を ReadFileでRAM上に読み込んだ後waveOutWrite 等を用いて再生する
もし、1のことを「RAMに転送する」と言っているのであれば、それをしないためにはNORフラッシュメモリを実装しているハードウエア上で、XIP実行が可能なOSをビルドする必要があります。アプリケーションレベルではこのような方式に直すことは不可能です。以前はこのようなシステムは結構ありました。
2. のことを「RAMに転送する」と言っているのであれば、bibファイルのFILESセクションで'U'フラグを付けてmakeimgすれば、そのファイルはUn-Compressになりますので、メモリマップファイルを用いて(もう一度データバッファに転送しないで)CPUからアクセスすることができます。(ちなみに圧縮されたWAVファイルを再生するには必ずバッファRAM上に一回読みだす必要があります。)
Windows CEのメモリシステムは一般的に言う「仮想メモリ」ではなく「MMUを利用するがBacking Storeがない」メモリシステムです。つまり、物理メモリと論理メモリのマッピング機能を利用しますが、UNIX的なスワップファイルの概念はサポートしていません。
hnakayam - hnakayamさま ありがとうございます。
現在は、
1. 「NK.BINをRAM上にロードしてからOSが起動するため、NK.BIN内のファイルはすべてRAM上にある」という意味
と
3(?) MyRomFile.BIN内にある"\Windows\bell.wav" を ReadFileでRAM上に読み込んだ後waveOutWrite 等を用いて再生する
という、虫のいい方法を考えています。MyRomFile.Bin内にはDLLやらアプリケーションやら、XIPなものも含められるようですが今はそれは考えず
「大きくなりそうなデータファイル(とりあえずwavとpng) 」だけを収めようと考えています。
config.bibに
ROMFILE 98000000 01040000 NANDIMAGE ;
NK 8C040000 00F00000 RAMIMAGE ;
RAM 8CF40000 010C0000 RAM ;
Platform.bibのFILESセクションに
TESTA.wav $(_FLATRELEASEDIR)\..\snd\TESTA.wav ROMFILE
TESTB.wav $(_FLATRELEASEDIR)\..\snd\TESTB.wav ROMFILE
と記述して、NK.binと ROMFILE.binを作るようにしています。。。が、、そのあとBinFSでROMFILE.bin
現在はhttp://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-pb/16080/BinFS-Multiple-XIP
の記事とMSDN内の BinFSまわりの説明を、よみながら 考え中です。
なかなかすすみません。。。 なんとなく意味がわかりました。
前提としてNOR FLASHが32MBあり、このうちたとえば前半16MBをRAM上へロードして実行するNK.BINの保存用として利用し、後半16MBを2つめのNK.BIN領域としてNOR FLASH上でXIP利用するということですね。確かにそのようにすると、RAM上に転送された部分は高速に実行され、XIPになっている後半部分はRAMにコピーしなくてもXIPデータとして利用できるはずです。
で、このような場合には Multiple XIP を構成すればよいはずで、BINFSは使用する必要はありません。
Multiple XIPを使用するのはブートローダーの改造やOALでOEMRomChainを使用するなど結構面倒なはずですが、がんばれば出来なくは無いと思います。
後半のXIP領域にあるファイルはそのままCreateFileでオープンできるはずで、"U"(非圧縮)で.bibファイルエントリを作成しておけばフラッシュ上で直接WAV再生できるはずです。Multiple XIPを使用する2つのNK.BINを作成する方法は以下を参考にしてみてください。
Multiple XIP Support
http://msdn.microsoft.com/en-us/library/aa908998.aspx
hnakayam- 回答としてマークされていない高橋 忍MSFT, モデレータ2009年6月16日 4:48
- 回答としてマーク高橋 忍MSFT, モデレータ2009年6月16日 4:48
- hnakayamさま ありがとうございます。
Multiple XIP Support
http://msdn.microsoft.com/en-us/library/aa908998.aspx
も参考に、また調べなおしています。
デバッグ版のOSがデバッグ端末に吐くメッセージなどみながら
設定とおっかけを くりかえしていこうかなと思っています。
ながーく なりそうな予感が。。。
できないことはなさうなので がんばります。 - ちょっと目先を変えて RAMディスク作成あたりからやっています。
サンプルを参考にRAMの一部をディスクデバイスにみせかけるデバイスドライバを作成して、FATのRAMディスクとして読み書きできるところまでできました。
次は、このRAMディスクをBINFSファイルシステムとしてフォーマットしてみたりしてBINFSに慣れて
次はRAMのデバイスドライバをオンボートフラッシュメモリのデバイスドライバに差し替えて
最終的にはROM(フラッシュメモリ)をRAMに転送することなくROMのまま一つのディスクとしてアクセスできるようにもっていこうと考えています。


