Windows Mobile デベロッパー センター > Windows Mobile 向けアプリケーション開発 フォーラム > Windows CE > WindowsCE6.0で、自分で用意したpngファイルやwavファイルを、ROMから直接読み込む方法を教えてください。
質問する質問する
 

質問WindowsCE6.0で、自分で用意したpngファイルやwavファイルを、ROMから直接読み込む方法を教えてください。

  • 2009年5月18日 9:18きはどん ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    はじめまして。 きはどんと申します。
    現在、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に置いたまま読み出したいのです。

    何か方法や参照先などございましたら ご教示いただけないでしょうか。

    よろしくお願いいたします。

すべての返信

  • 2009年5月22日 7:14Hiroshi Ota MSMSFT, モデレータユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    PNGファイルや、WAVファイルは、Application層から使うのですよね?
    WinCEのアプリプログラムは、仮想メモリにしかアクセスできません。
    プログラム実行中に書き換えないとしても、それらのファイルを表示する場合、結局RAM(勿論仮想メモリ)を使う様な気がするので、ROM→RAMのコピーをしないことで本当に動作中のメモリが節約されるのか疑問です。PNGファイルやWAVファイルを表示するプログラムも、仮想メモリに展開してアクセスするのでは?
    もし、PNGファイルやWAVファイルを処理するプログラムも自作して、ファイルの一部を細切れにアクセスするのであれば、カーネルモードのデバイスドライバを書いて、アプリにデータを供給するやり方はあるでしょう。

    エンベデッドエバンジェリスト
    太田

  • 2009年5月22日 8:18きはどん ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     



    太田様 回答ありがとうございます。
    そのとおり、PNGはWAVファイルはアプリケーションから使いたいです。
    あちこち調べると、プログラムにおいてはXIP(ROMのまま実行) 、ファイルにおいては BinFS (ROMのファイル?) というようなものが ROMを直接(直接でなくても、RAMにコピーせずに)
    使うことをサポートしている、、、ような気がしますが それはブートのときだけ使えるのか、アプリケーションからも使えるのか、、、そのへんがはっきりしなくて、、行き詰まってしまいました。
    たとえば、おっしゃるように 直接アクセスするのではなくて ROM用のファイルシステム用のデバイスドライバを書いて、それ経由でROM上のデータをファイルとしてアクセスできれば
    とても助かります。 ただし、OSの知らないROM領域にこっそりバイナリデータを用意して、それを独自デバイスドライバからバイナリとして読み出すというのではなくて
    合法的というか、「WinCE上のファイルとしてオープンできて読める」という方法が ないものか、皆さんのお力をお借りできればと思います。
    よろしくお願いいたします。

    きはどん。

  • 2009年6月1日 11:11hnakayam ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    「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
  • 2009年6月2日 2:54きはどん ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    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まわりの説明を、よみながら 考え中です。
    なかなかすすみません。。。




  • 2009年6月4日 15:13hnakayam ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    なんとなく意味がわかりました。

    前提として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
  • 2009年6月7日 23:48きはどん ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    hnakayamさま ありがとうございます。
    Multiple XIP Support
    http://msdn.microsoft.com/en-us/library/aa908998.aspx
    も参考に、また調べなおしています。
    デバッグ版のOSがデバッグ端末に吐くメッセージなどみながら
    設定とおっかけを くりかえしていこうかなと思っています。
    ながーく なりそうな予感が。。。
    できないことはなさうなので がんばります。
  • 2009年7月16日 7:04きはどん ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    ちょっと目先を変えて RAMディスク作成あたりからやっています。
    サンプルを参考にRAMの一部をディスクデバイスにみせかけるデバイスドライバを作成して、FATのRAMディスクとして読み書きできるところまでできました。

    次は、このRAMディスクをBINFSファイルシステムとしてフォーマットしてみたりしてBINFSに慣れて
    次はRAMのデバイスドライバをオンボートフラッシュメモリのデバイスドライバに差し替えて
    最終的にはROM(フラッシュメモリ)をRAMに転送することなくROMのまま一つのディスクとしてアクセスできるようにもっていこうと考えています。