(57)【特許請求の範囲】
【請求項１】
プロセッサ、前記プロセッサが実行する制御プログラムを格納するための不揮発性メモリ、及び、前記プロセッサが前記制御プログラムを実行する際に使用する揮発性メモリを備える電子装置であって、
前記不揮発性メモリには、
＜ａ＞前記プロセッサが実行可能な制御プログラムを構成するプログラムモジュール群（ここで、各プログラムモジュールは少なくとも１つの関数プログラムを含み、前記プログラムモジュールのうち少なくとも１つは可逆圧縮されている）と、
＜ｂ＞各プログラムモジュールごとに、前記揮発性メモリ上の展開開始アドレス情報、各関数プログラムのうち他のプログラムモジュールから参照される関数プログラムの実行開始アドレス情報、及び、非圧縮状態か圧縮状態かを示す格納状態情報と、
が記憶されており、
前記電子装置の電源投入時に、前記不揮発性メモリを参照することで、
＜ｉ＞各プログラムモジュールに含まれる各関数プログラムの実行開始アドレス情報に基づき、前記揮発性メモリ上の各関数プログラムの実行開始アドレス位置に、該関数プログラムを含むプログラムモジュールを前記揮発性メモリへ展開させる制御命令コードを書き込む制御コード書き込み手段と、
＜ｉｉ＞前記制御プログラムを開始させるため、前記揮発性メモリにおける前記制御プログラムの実行開始アドレス位置から処理を開始する実行開始手段と、
＜ｉｉｉ＞前記実行開始手段で処理が開始された後、前記制御命令コードを実行した際に、前記不揮発性メモリ内の、当該制御命令コードに対応する関数プログラムを含む注目プログラムモジュールを特定することで、前記注目プログラムモジュールの展開開始アドレス情報と格納状態情報とを取得し、
取得した格納状態情報が非圧縮状態であることを示す場合には、前記注目プログラムモジュールを前記揮発性メモリの展開開始アドレス位置に展開し、取得した格納状態情報が圧縮状態であることを示す場合には、前記注目プログラムモジュールを伸長してから、前記揮発性メモリの展開開始アドレス位置に展開し、
前記注目プログラムモジュールの前記揮発性メモリへの展開が完了した後、前記制御命令コードを実行したアドレス位置から処理を再開させる制御手段と、
を備えることを特徴とする電子装置。
【請求項２】
プロセッサ、前記プロセッサが実行する制御プログラムを格納するための不揮発性メモリ、及び、前記プロセッサが前記制御プログラムを実行する際に使用する揮発性メモリを備える電子装置であって、
前記不揮発性メモリには、
＜ａ＞前記プロセッサが実行可能な制御プログラムを構成するプログラムモジュール群（ここで、各プログラムモジュールは少なくとも１つの関数プログラムを含み、前記プログラムモジュールはすべて可逆圧縮されている）と、
＜ｂ＞各プログラムモジュールごとに、前記揮発性メモリ上の展開開始アドレス情報、及び、各関数プログラムのうち他のプログラムモジュールから参照される関数プログラムの実行開始アドレス情報と、
が記憶されており、
前記電子装置の電源投入時に、前記不揮発性メモリを参照することで、
＜ｉ＞各プログラムモジュールに含まれる各関数プログラムの実行開始アドレス情報に基づき、前記揮発性メモリ上の各関数プログラムの実行開始アドレス位置に、該関数プログラムを含むプログラムモジュールを前記揮発性メモリへ展開させる制御命令コードを書き込む制御コード書き込み手段と、
＜ｉｉ＞前記制御プログラムを開始させるため、前記揮発性メモリにおける前記制御プログラムの実行開始アドレス位置から処理を開始する実行開始手段と、
＜ｉｉｉ＞前記実行開始手段で処理が開始された後、前記制御命令コードを実行した際に、前記不揮発性メモリ内の、当該制御命令コードに対応する関数プログラムを含む注目プログラムモジュールを特定することで、前記注目プログラムモジュールの展開開始アドレス情報を取得し、
前記注目プログラムモジュールを伸長してから、前記揮発性メモリの展開開始アドレス位置に展開し、
前記注目プログラムモジュールの前記揮発性メモリへの展開が完了した後、前記制御命令コードを実行したアドレス位置から処理を再開させる制御手段と、
を備えることを特徴とする電子装置。
【請求項３】
前記制御手段は、前記制御命令コードが配置されているアドレスと、各プログラムモジュールそれぞれに対応する前記展開開始アドレス情報とを比較し、
前記制御命令コードが配置されているアドレスと前記展開開始アドレス情報とが一致するプログラムモジュールが存在すれば、該プログラムモジュールを前記注目プログラムモジュールとして特定し、
前記制御命令コードが配置されているアドレスと前記展開開始アドレス情報とが一致するプログラムモジュールが存在しなければ、前記展開開始アドレス情報として、前記制御命令コードが配置されているアドレスよりも上位でかつ最も近いアドレスを示すプログラムモジュールを前記注目プログラムモジュールとして特定することを特徴とする請求項１又は２に記載の電子装置。
【請求項４】
さらに、前記プロセッサのアイドル時間に、前記プログラムモジュールのうち前記制御手段によって前記揮発性メモリに展開されていないプログラムモジュールを、前記展開開始アドレス情報を参照して、前記揮発性メモリの前記展開開始位置に展開するバックグラウンド展開手段を備えることを特徴とする請求項１乃至３のいずれか１項に記載の電子装置。
【請求項５】
前記プログラムモジュールはすべて単一の関数プログラムから構成され、前記実行開始アドレス情報はすべての関数プログラムについて対応する実行開始アドレス位置を含むことを特徴とする請求項１乃至４のいずれか１項に記載の電子装置。
【請求項６】
プロセッサ、前記プロセッサが実行する制御プログラムを格納するための不揮発性メモリ、及び、前記プロセッサが前記制御プログラムを実行する際に使用する揮発性メモリを備える電子装置を制御する方法であって、
前記不揮発性メモリには、
＜ａ＞前記プロセッサが実行可能な制御プログラムを構成するプログラムモジュール群（ここで、各プログラムモジュールは少なくとも１つの関数プログラムを含み、前記プログラムモジュールのうち少なくとも１つは可逆圧縮されている）と、
＜ｂ＞各プログラムモジュールごとに、前記揮発性メモリ上の展開開始アドレス情報、各関数プログラムのうち他のプログラムモジュールから参照される関数プログラムの実行開始アドレス情報、及び、非圧縮状態か圧縮状態かを示す格納状態情報と、
が記憶されており、
前記電子装置の電源投入時に、前記不揮発性メモリを参照することにより実行される、
＜ｉ＞各プログラムモジュールに含まれる各関数プログラムの実行開始アドレス情報に基づき、前記揮発性メモリ上の各関数プログラムの実行開始アドレス位置に、該関数プログラムを含むプログラムモジュールを前記揮発性メモリへ展開させる制御命令コードを書き込む制御コード書き込み工程と、
＜ｉｉ＞前記制御プログラムを開始させるため、前記揮発性メモリにおける前記制御プログラムの実行開始アドレス位置から処理を開始する実行開始工程と、
＜ｉｉｉ＞前記実行開始工程で処理が開始された後、前記制御命令コードを実行した際に、前記不揮発性メモリ内の、当該制御命令コードに対応する関数プログラムを含む注目プログラムモジュールを特定することで、前記注目プログラムモジュールの展開開始アドレス情報と格納状態情報とを取得し、
取得した格納状態情報が非圧縮状態であることを示す場合には、前記注目プログラムモジュールを前記揮発性メモリの展開開始アドレス位置に展開し、取得した格納状態情報が圧縮状態であることを示す場合には、前記注目プログラムモジュールを伸長してから、前記揮発性メモリの展開開始アドレス位置に展開し、
前記注目プログラムモジュールの前記揮発性メモリへの展開が完了した後、前記制御命令コードを実行したアドレス位置から処理を再開させる制御工程と、
を備えることを特徴とする制御方法。
【請求項７】
プロセッサ、前記プロセッサが実行する制御プログラムを格納するための不揮発性メモリ、及び、前記プロセッサが前記制御プログラムを実行する際に使用する揮発性メモリを備える電子装置を制御する方法であって、
前記不揮発性メモリには、
＜ａ＞前記プロセッサが実行可能な制御プログラムを構成するプログラムモジュール群（ここで、各プログラムモジュールは少なくとも１つの関数プログラムを含み、前記プログラムモジュールはすべて可逆圧縮されている）と、
＜ｂ＞各プログラムモジュールごとに、前記揮発性メモリ上の展開開始アドレス情報、及び、各関数プログラムのうち他のプログラムモジュールから参照される関数プログラムの実行開始アドレス情報と、
が記憶されており、
前記電子装置の電源投入時に、前記不揮発性メモリを参照することにより実行される、
＜ｉ＞各プログラムモジュールに含まれる各関数プログラムの実行開始アドレス情報に基づき、前記揮発性メモリ上の各関数プログラムの実行開始アドレス位置に、該関数プログラムを含むプログラムモジュールを前記揮発性メモリへ展開させる制御命令コードを書き込む制御コード書き込み工程と、
＜ｉｉ＞前記制御プログラムを開始させるため、前記揮発性メモリにおける前記制御プログラムの実行開始アドレス位置から処理を開始する実行開始工程と、
＜ｉｉｉ＞前記実行開始工程で処理が開始された後、前記制御命令コードを実行した際に、前記不揮発性メモリ内の、当該制御命令コードに対応する関数プログラムを含む注目プログラムモジュールを特定することで、前記注目プログラムモジュールの展開開始アドレス情報を取得し、
前記注目プログラムモジュールを伸長してから、前記揮発性メモリの展開開始アドレス位置に展開し、
前記注目プログラムモジュールの前記揮発性メモリへの展開が完了した後、前記制御命令コードを実行したアドレス位置から処理を再開させる制御工程と、
を備えることを特徴とする制御方法。
【請求項８】
請求項６又は７に記載の制御方法の各工程をコンピュータに実行させるためのプログラム。
【請求項９】
請求項８に記載のプログラムを記録したコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体メモリに格納される電子装置の制御プログラムを圧縮・伸長する技術に関する。
【背景技術】
【０００２】
デジタルカメラなどの電子装置は、ＣＰＵ及び半導体メモリ（ＲＯＭやＲＡＭ）を備え、ＲＯＭが保持する制御プログラムをＣＰＵが実行することにより電子装置を制御することが一般的である。このような電子装置では、例えばＣＰＵとしての３２ビットＲＩＳＣプロセッサや大容量のＲＡＭを小型の電池によって駆動しなければならない。したがって、電子装置を使用しない時は電源をＯＦＦにしておくことが望ましい。一方、例えばデジタルカメラにおいては、シャッターチャンスを逃さないために、電源を投入してから撮像可能となるまでの時間である、起動時間を短くしなければならない。
【０００３】
なお、ＲＩＳＣは、”Ｒｅｄｕｃｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ”の略であり、ＲＯＭは、”Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ”の略であり、ＲＡＭは、”Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ”の略である。
【０００４】
近年の電子装置は、ユーザインタフェースとしてウインドウシステムを使ったＧＵＩ（グラフィカルユーザインタフェース）を採用する場合が多い。また、電子装置の制御プログラムは、ＴＣＰ／ＩＰなどに代表されるネットワークアーキテクチャの通信プログラムを含むなど、高機能化が進んでいる。そのため、ＲＯＭに格納される制御プログラムのサイズが増大しつつある。
【０００５】
制御プログラムの大規模化に伴い、電子装置が備えるＲＯＭも大容量化しなければならない。しかしながら、ＲＯＭはＲＡＭに比べて記憶容量あたりのコストが高い傾向にある。また、ＲＯＭの設計上の制約により、ＲＯＭを大容量化する場合、容量が４Ｍバイトの次は８Ｍバイトといったように、容量を倍にする必要がある。したがって、ＲＯＭの大容量化に伴うコストの増大は深刻な問題である。
【０００６】
そこで、制御プログラムを圧縮（以下、特に断らなければ、圧縮とは可逆圧縮を意味する）してＲＯＭに格納する技術が提案されている（特許文献１参照）。特許文献１に記載の技術によれば、あらかじめ圧縮された制御プログラムと、圧縮された制御プログラムを伸長する伸長プログラムをＲＯＭに格納する。制御プログラムを実行する際は、伸長プログラムが圧縮された制御プログラムをＲＡＭ上に伸長してから実行する。
【０００７】
また、特許文献１は、制御プログラムをいくつかのパーツに分割して圧縮してＲＯＭに格納し、実行するパーツだけをＲＡＭに展開するという技術も開示している。この技術によれば、伸長プログラムを制御する管理プログラムは、制御プログラムのパーツを実行する順番を知っている。制御プログラムのあるパーツの実行が終了すると、伸長プログラムは、終了したパーツが占有していたＲＡＭの領域に、これから実行するパーツを伸長して上書きし、次いで、ＲＡＭに伸長されたパーツが実行される。このように、ＲＡＭに伸長されたパーツが終了するたびに、管理プログラムは、再び別のパーツを伸長するということを繰り返す。
【０００８】
これにより、ＲＯＭに格納される制御プログラムのサイズが小さくなり、ＲＯＭの容量増大を抑制することができる。
【０００９】
以下に、特許文献１に記載の、制御プログラムをいくつかのパーツに分割して圧縮してＲＯＭに格納し、実行するパーツだけをＲＡＭに展開するという技術（以下、単に「従来技術」と呼ぶ）を詳細に説明する。
【００１０】
図１は、従来技術におけるＲＯＭ１０１とＲＡＭ１０２に格納されるデータの例を示す図である。ＲＯＭ１０１は、管理プログラム１０３、伸長プログラム１０４、圧縮されたプログラム１０５〜１０８を保持する。ＲＡＭ１０２は、伸長されたプログラムが格納される領域１０９、管理プログラム１０３、伸長プログラム１０４、領域１０９に伸長されたプログラムなどがワークエリアとして使用する領域１１０を備える。
【００１１】
図２は、従来技術において制御プログラムが実行される手順を示すフローチャートである。
【００１２】
ステップＳ２０１で電子装置に電源が投入されると、ステップＳ２０２で、電子装置のＣＰＵは管理プログラム１０３を実行する。管理プログラム１０３は、伸長プログラム１０４を起動する。
【００１３】
ステップＳ２０３で、ＣＰＵは伸長プログラム１０４を実行し、圧縮されたプログラム１０５を伸長して領域１０９に展開する。
【００１４】
ステップＳ２０４で、ＣＰＵは再び管理プログラム１０３を実行し、管理プログラム１０３はステップＳ２０３で伸長された制御プログラムを起動する。
【００１５】
ステップＳ２０５で、ＣＰＵはステップＳ２０３で伸長された制御プログラムを実行する。
【００１６】
ステップＳ２０６〜Ｓ２０９では、ステップＳ２０２〜Ｓ２０５と同様に、ＣＰＵは圧縮されたプログラム１０６を伸長して実行する。
【００１７】
圧縮されたプログラム１０６の処理が終了すると、ステップＳ２１０で、ＣＰＵは再び管理プログラム１０３を実行する。図示を省略するが、ステップＳ２１０とＳ２１１の間で、ＣＰＵは必要に応じて圧縮されたプログラム１０５〜１０８のいずれかを伸長して実行する。
【００１８】
ＣＰＵがこのような処理を繰り返し実行することにより、圧縮されたプログラム１０５〜１０８が適宜実行され、必要な処理が終了すると、ステップＳ２１１で、ＣＰＵは電子装置をシャットダウンする。
【００１９】
なお、ステップＳ２０２〜Ｓ２０９において、ＣＰＵは圧縮されたプログラム１０５、１０６を順に伸長して実行したが、この順に限定されるものではない。
【特許文献１】特開平５−２１７００５号公報
【発明の開示】
【発明が解決しようとする課題】
【００２０】
特許文献１に記載の技術は、制御プログラムを高速に実行する必要の無い電子装置においては有効であった。しかしながら、デジタルカメラなどの電子装置は、前述のように、電源を投入してから使用可能になるまでの起動時間を短くする必要がある。
【００２１】
デジタルカメラなどの電子装置に、特許文献１に記載の、制御プログラムを圧縮してＲＯＭに格納する技術を適用すると、電源投入時に制御プログラムの伸長に長い時間を要し、起動時間が長くなる。
【００２２】
また、制御プログラムをいくつかのパーツに分割して圧縮した場合、起動時間は短縮されるが、デジタルカメラのレスポンスが低下するという問題がある。なぜなら、デジタルカメラの制御プログラムにはＧＵＩや撮像に関するパーツが多数含まれ、これらのパーツは通常、頻繁に実行されるからである。したがって、単に制御プログラムを分割して圧縮するだけでは、例えば撮像を行うたびに撮像に関するパーツを伸長することとなり、レスポンスの低下を招く。
【００２３】
本発明はこのような状況に鑑みてなされたものであり、電子装置の起動時間が長くなること及びレスポンスの低下を抑制しつつ、プログラムを圧縮して、必要なＲＯＭの容量増大を抑制することを目的とする。
【課題を解決するための手段】
【００２４】
上記課題を解決するために、本発明の電子装置は、プロセッサ、前記プロセッサが実行する制御プログラムを格納するための不揮発性メモリ、及び、前記プロセッサが前記制御プログラムを実行する際に使用する揮発性メモリを備える電子装置であって、前記不揮発性メモリには、＜ａ＞前記プロセッサが実行可能な制御プログラムを構成するプログラムモジュール群（ここで、各プログラムモジュールは少なくとも１つの関数プログラムを含み、前記プログラムモジュールのうち少なくとも１つは可逆圧縮されている）と、＜ｂ＞各プログラムモジュールごとに、前記揮発性メモリ上の展開開始アドレス情報、各関数プログラムのうち他のプログラムモジュールから参照される関数プログラムの実行開始アドレス情報、及び、非圧縮状態か圧縮状態かを示す格納状態情報と、が記憶されており、前記電子装置の電源投入時に、前記不揮発性メモリを参照することで、＜ｉ＞各プログラムモジュールに含まれる各関数プログラムの実行開始アドレス情報に基づき、前記揮発性メモリ上の各関数プログラムの実行開始アドレス位置に、該関数プログラムを含むプログラムモジュールを前記揮発性メモリへ展開させる制御命令コードを書き込む制御コード書き込み手段と、＜ｉｉ＞前記制御プログラムを開始させるため、前記揮発性メモリにおける前記制御プログラムの実行開始アドレス位置から処理を開始する実行開始手段と、＜ｉｉｉ＞前記実行開始手段で処理が開始された後、前記制御命令コードを実行した際に、前記不揮発性メモリ内の、当該制御命令コードに対応する関数プログラムを含む注目プログラムモジュールを特定することで、前記注目プログラムモジュールの展開開始アドレス情報と格納状態情報とを取得し、取得した格納状態情報が非圧縮状態であることを示す場合には、前記注目プログラムモジュールを前記揮発性メモリの展開開始アドレス位置に展開し、取得した格納状態情報が圧縮状態であることを示す場合には、前記注目プログラムモジュールを伸長してから、前記揮発性メモリの展開開始アドレス位置に展開し、前記注目プログラムモジュールの前記揮発性メモリへの展開が完了した後、前記制御命令コードを実行したアドレス位置から処理を再開させる制御手段と、を備えることを特徴とする。
【００２５】
また、本発明の他の電子装置は、プロセッサ、前記プロセッサが実行する制御プログラムを格納するための不揮発性メモリ、及び、前記プロセッサが前記制御プログラムを実行する際に使用する揮発性メモリを備える電子装置であって、前記不揮発性メモリには、＜ａ＞前記プロセッサが実行可能な制御プログラムを構成するプログラムモジュール群（ここで、各プログラムモジュールは少なくとも１つの関数プログラムを含み、前記プログラムモジュールはすべて可逆圧縮されている）と、＜ｂ＞各プログラムモジュールごとに、前記揮発性メモリ上の展開開始アドレス情報、及び、各関数プログラムのうち他のプログラムモジュールから参照される関数プログラムの実行開始アドレス情報と、が記憶されており、前記電子装置の電源投入時に、前記不揮発性メモリを参照することで、＜ｉ＞各プログラムモジュールに含まれる各関数プログラムの実行開始アドレス情報に基づき、前記揮発性メモリ上の各関数プログラムの実行開始アドレス位置に、該関数プログラムを含むプログラムモジュールを前記揮発性メモリへ展開させる制御命令コードを書き込む制御コード書き込み手段と、＜ｉｉ＞前記制御プログラムを開始させるため、前記揮発性メモリにおける前記制御プログラムの実行開始アドレス位置から処理を開始する実行開始手段と、＜ｉｉｉ＞前記実行開始手段で処理が開始された後、前記制御命令コードを実行した際に、前記不揮発性メモリ内の、当該制御命令コードに対応する関数プログラムを含む注目プログラムモジュールを特定することで、前記注目プログラムモジュールの展開開始アドレス情報を取得し、前記注目プログラムモジュールを伸長してから、前記揮発性メモリの展開開始アドレス位置に展開し、前記注目プログラムモジュールの前記揮発性メモリへの展開が完了した後、前記制御命令コードを実行したアドレス位置から処理を再開させる制御手段と、を備えることを特徴とする。
【００２６】
また、本発明の制御方法は、プロセッサ、前記プロセッサが実行する制御プログラムを格納するための不揮発性メモリ、及び、前記プロセッサが前記制御プログラムを実行する際に使用する揮発性メモリを備える電子装置を制御する方法であって、前記不揮発性メモリには、＜ａ＞前記プロセッサが実行可能な制御プログラムを構成するプログラムモジュール群（ここで、各プログラムモジュールは少なくとも１つの関数プログラムを含み、前記プログラムモジュールのうち少なくとも１つは可逆圧縮されている）と、＜ｂ＞各プログラムモジュールごとに、前記揮発性メモリ上の展開開始アドレス情報、各関数プログラムのうち他のプログラムモジュールから参照される関数プログラムの実行開始アドレス情報、及び、非圧縮状態か圧縮状態かを示す格納状態情報と、が記憶されており、前記電子装置の電源投入時に、前記不揮発性メモリを参照することにより実行される、＜ｉ＞各プログラムモジュールに含まれる各関数プログラムの実行開始アドレス情報に基づき、前記揮発性メモリ上の各関数プログラムの実行開始アドレス位置に、該関数プログラムを含むプログラムモジュールを前記揮発性メモリへ展開させる制御命令コードを書き込む制御コード書き込み工程と、＜ｉｉ＞前記制御プログラムを開始させるため、前記揮発性メモリにおける前記制御プログラムの実行開始アドレス位置から処理を開始する実行開始工程と、＜ｉｉｉ＞前記実行開始工程で処理が開始された後、前記制御命令コードを実行した際に、前記不揮発性メモリ内の、当該制御命令コードに対応する関数プログラムを含む注目プログラムモジュールを特定することで、前記注目プログラムモジュールの展開開始アドレス情報と格納状態情報とを取得し、取得した格納状態情報が非圧縮状態であることを示す場合には、前記注目プログラムモジュールを前記揮発性メモリの展開開始アドレス位置に展開し、取得した格納状態情報が圧縮状態であることを示す場合には、前記注目プログラムモジュールを伸長してから、前記揮発性メモリの展開開始アドレス位置に展開し、前記注目プログラムモジュールの前記揮発性メモリへの展開が完了した後、前記制御命令コードを実行したアドレス位置から処理を再開させる制御工程と、を備えることを特徴とする。
【００２７】
また、本発明の他の制御方法は、プロセッサ、前記プロセッサが実行する制御プログラムを格納するための不揮発性メモリ、及び、前記プロセッサが前記制御プログラムを実行する際に使用する揮発性メモリを備える電子装置を制御する方法であって、前記不揮発性メモリには、＜ａ＞前記プロセッサが実行可能な制御プログラムを構成するプログラムモジュール群（ここで、各プログラムモジュールは少なくとも１つの関数プログラムを含み、前記プログラムモジュールはすべて可逆圧縮されている）と、＜ｂ＞各プログラムモジュールごとに、前記揮発性メモリ上の展開開始アドレス情報、及び、各関数プログラムのうち他のプログラムモジュールから参照される関数プログラムの実行開始アドレス情報と、が記憶されており、前記電子装置の電源投入時に、前記不揮発性メモリを参照することにより実行される、＜ｉ＞各プログラムモジュールに含まれる各関数プログラムの実行開始アドレス情報に基づき、前記揮発性メモリ上の各関数プログラムの実行開始アドレス位置に、該関数プログラムを含むプログラムモジュールを前記揮発性メモリへ展開させる制御命令コードを書き込む制御コード書き込み工程と、＜ｉｉ＞前記制御プログラムを開始させるため、前記揮発性メモリにおける前記制御プログラムの実行開始アドレス位置から処理を開始する実行開始工程と、＜ｉｉｉ＞前記実行開始工程で処理が開始された後、前記制御命令コードを実行した際に、前記不揮発性メモリ内の、当該制御命令コードに対応する関数プログラムを含む注目プログラムモジュールを特定することで、前記注目プログラムモジュールの展開開始アドレス情報を取得し、前記注目プログラムモジュールを伸長してから、前記揮発性メモリの展開開始アドレス位置に展開し、前記注目プログラムモジュールの前記揮発性メモリへの展開が完了した後、前記制御命令コードを実行したアドレス位置から処理を再開させる制御工程と、を備えることを特徴とする。
【００２８】
なお、その他の本発明の特徴は、添付図面及び以下の発明を実施するための最良の形態の記載によっていっそう明らかになるものである。
【発明の効果】
【００２９】
以上の構成により、本発明によれば、電子装置の起動時間が長くなること及びレスポンスの低下を抑制しつつ、プログラムを圧縮して、必要なＲＯＭの容量増大を抑制することが可能となる。
【発明を実施するための最良の形態】
【００３０】
以下、添付図面を参照して、本発明の上位概念、中位概念および下位概念の理解に役立つ実施形態を示す。なお、以下の実施形態に含まれる概念について、そのすべてが特許請求の範囲に記載されているとは限らない。ただし、これは特許発明の技術的範囲から意識的に除外したのではないことを理解していただきたい。
【００３１】
＜デジタルカメラ３００のハードウェア構成＞
図３は、本発明を適用したデジタルカメラ３００のハードウェア構成を示すブロック図である。なお、本実施形態ではデジタルカメラ３００を例に本発明を説明するが、本発明は例えば携帯電話やＰＤＡなど、ＣＰＵが制御プログラムを実行するすべての電子装置に適用することが可能である。
【００３２】
デジタルカメラ３００はシステムバス３１１と、システムバス３１１に接続される以下の要素を備える。
【００３３】
ＣＰＵ３０１は、ＲＯＭ３０２が保持する制御プログラムを実行することにより、デジタルカメラ３００全体を制御する。厳密には、本実施形態では、後述する初期化プログラムを除き、ＣＰＵ３０１はＲＯＭ３０２が保持する制御プログラムをＲＡＭ３０３に転送して実行する。
【００３４】
ＲＯＭ３０２は、上述の制御プログラムなどを保持する不揮発性メモリである。厳密には、本実施形態では、制御プログラムの大部分が分割されて圧縮されている。
【００３５】
ＲＡＭ３０３は、ＲＯＭ３０２から転送された制御プログラムを格納する揮発性メモリである。ＲＡＭ３０３はまた、制御プログラムのワークエリアや、撮像した画像データを記憶媒体３０９に記録する前に一時的にバッファリングする領域としても使用される。
【００３６】
撮像部３０４は、光学レンズ、ＣＣＤ、Ａ／Ｄ変換器などから構成され、光学レンズから入射した光をデジタル電気信号に変換し、ＲＡＭ３０３に格納する。
【００３７】
信号処理部３０５は、撮像部３０４がＲＡＭ３０３に格納したデジタル電気信号に対し、ＪＰＥＧ符号化やＭＰＥＧ符号化などの信号処理を施し、画像データを生成する。生成された画像データは、記憶媒体３０９に記録される。また、画像再生時には、信号処理部３０５は記憶媒体３０９に記録される画像データを再生（復号化）する。信号処理部３０５は、一般に専用のハードウェア回路を用いて実現されるが、ＣＰＵ３０１が制御プログラムを実行することにより実現してもよい。
【００３８】
操作部３０６は、電源ボタンやシャッターボタンなどから構成され、デジタルカメラ３００のユーザは操作部３０６を介してデジタルカメラ３００に指示を与えることができる。
【００３９】
表示部３０７は、画像データの再生時に画像を表示するためのものであり、ＴＦＴ  ＬＣＤなどにより構成される。表示部３０７はまた、撮像部３０４が捉えた画像を逐次表示する電子ビューファインダとしても使用可能である。
【００４０】
記憶媒体制御部３０８は、次に説明する記憶媒体３０９を制御する。
【００４１】
記憶媒体３０９は、画像データを記録するためのものであり、例えば、デジタルビデオカセット、ＤＶＤ−Ｒ、コンパクトフラッシュ（登録商標）、ハードディスクなどを用いることができる。
【００４２】
通信Ｉ／Ｆ３１０は、外部装置と通信するためのインタフェースであり、例えばＵＳＢ、ＩＥＥＥ１３９４、イーサネット（登録商標）などである。通信Ｉ／Ｆ３１０はまた、デジタルカメラ３００が再生する画像データのアナログ信号（例えば、ＲＧＢコンポジット信号）を送信可能なアナログインタフェースを含んでもよい。
【００４３】
＜デジタルカメラ３００が行う処理の概要＞
図２０は、デジタルカメラ３００が行う処理の流れの概要を示すフローチャートである。図２０は、極めて基本的な処理のみを示しており、通常は、デジタルカメラ３００はその他の多様な処理を実行可能であることに注意されたい。
【００４４】
ステップＳ２００１で、ＣＰＵ３０１は初期化処理を行う。具体的には、表示部３０７の表示をＯＮにしたり、撮像部３０４に含まれる光学レンズを繰り出したりする。
【００４５】
ステップＳ２００２で、ＣＰＵ３０１は、操作部３０６を介して設定されているデジタルカメラ３００の動作モードを判定する。動作モードが撮像モードであればステップＳ２００３に進み、再生モードであればステップＳ２００４に進む。
【００４６】
ステップＳ２００３及びステップＳ２００４では、ＣＰＵ３０１は、それぞれ、画像の撮像及び再生に必要な処理を行う。
【００４７】
本フローチャートにおいて重要なことは、本発明の特徴は、ステップＳ２００１〜Ｓ２００４で説明したデジタルカメラ３００の処理そのものではなく、この処理を行うための制御プログラムにあるということである。制御プログラムにある本発明の特徴を、以下に詳細に説明する。
【００４８】
＜機械語バイナリ生成処理の概要＞
図４〜図６を参照して、ソースファイルから機械語バイナリを生成する処理の概要を説明する。なお、ここで説明する機械語バイナリ５０１（図５）は、分割も圧縮もされていない。なお、本実施形態ではＣ言語でソースコードを記述するものとして説明するが、実際にはＣ＋＋言語やＪＡＶＡ（登録商標）など、任意の言語を使用可能であり、これらの言語が混在していても構わない。
【００４９】
図４は、本実施形態におけるソースファイルを概念的に示す図である。デジタルカメラ３００の制御プログラムは、撮像、通信、ＧＵＩなどを実現する種々の機能を含む。これらの機能は別々のソースファイルに記述されるのが一般的である。ソースファイル４０１とソースファイル４０２はこのようなソースファイルを模式的に示したものである。
【００５０】
ソースファイル４０１は関数４０３及び関数４０４を含む。ソースファイル４０２は関数４０５及び関数４０６を含む。図４に示すように、ソースファイル４０２に含まれる関数４０５は、異なるソースファイルであるソースファイル４０１に含まれる関数４０３から呼び出されている。また、図示しないが、関数４０３及び関数４０６も異なるソースファイルに含まれる関数から呼び出されうるものとする。一方、ソースファイル４０１に含まれる関数４０４は、同じソースファイル４０１に含まれる関数からしか呼び出されないものとする。
【００５１】
図５は、ソースファイル４０１とソースファイル４０２から生成される機械語バイナリ５０１とシンボルテーブル５０２を示す図である。
【００５２】
複数のソースファイル（ここではソースファイル４０１とソースファイル４０２）は、コンパイラによってコンパイルされた後、リンカによって１つの機械語バイナリ５０１に結合される。
【００５３】
リンカは、複数のソースファイルに記述されたプログラムを結合する際に、シンボルテーブル５０２を用いる。シンボルテーブルとは、ソースファイルに記述された関数の名前と、機械語バイナリにおいてその関数が存在するアドレスの対応表である。
【００５４】
どの関数がどのアドレスに配置されるかは、実際に機械語バイナリを生成するまでは不明である。そこで、リンカはまず、呼び出す関数のアドレスを確定させないままコンパイルされたプログラムを結合し、その際にそれぞれの関数が配置されたアドレスを参照してシンボルテーブル５０２を生成する。次いで、リンカは、シンボルテーブル５０２を参照して、確定させていなかったアドレスを確定させ、機械語バイナリ５０１を生成する。
【００５５】
図５の例では、ソースファイル４０１に対応するプログラムＡは０ｘ１００００番地から配置され、続いてソースファイル４０２に対応するプログラムＢが配置される。その結果、関数４０３、関数４０５、関数４０６はそれぞれ、０ｘ１００００番地、０ｘ１０３００番地、０ｘ１０５００番地に配置されることが明らかになる。そこで、関数４０５を呼び出すＣＡＬＬ命令５０３には、呼び出し先アドレスとして０ｘ１０３００を与える。また、関数４０４を呼び出すＣＡＬＬ命令５０４は、プログラムＡに含まれるため、リンカはシンボルテーブル５０２を参照することなく、呼び出し先アドレスとして０ｘ１０２００を与える。
【００５６】
なお、シンボルテーブルに記載されるアドレスの数は、例えば４メガバイト程度のプログラムであれば１万５千程度となるのが一般的である。一万５千のアドレスをテーブルとしてＲＯＭに搭載すると６０キロバイト程度となるのが一般的である。
【００５７】
図６は、Ｃ言語などに代表される高級言語ソースファイル６０１から機械語バイナリ６０７を生成する処理を概略的に示す図である。
【００５８】
高級言語ソースファイル６０１は、１又は複数のファイル群である。コンパイラ６０２は、高級言語ソースファイル６０１をコンパイルし、高級言語ソースファイル６０１と同数のアセンブラ言語ソースファイル６０３を生成する。なお、プログラマはアセンブラ言語を用いたプログラミングによって直接アセンブラ言語ソースファイル６０３を生成してもよい。あるいは、コンパイラ６０２によってコンパイルされた高級言語ソースファイル６０１とプログラマが直接生成したアセンブラ言語ソースファイルを合わせてアセンブラ言語ソースファイル６０３としてもよい。
【００５９】
アセンブラ６０４は、アセンブラ言語ソースファイル６０３をアセンブルし、アセンブラ言語ソースファイル６０３と同数のリロケータブルオブジェクト６０５を生成する。リロケータブルオブジェクト６０５は、機械語とリロケーション情報やデバッグの情報などを保持する。リロケータブルオブジェクト６０５のフォーマットとしてはＣＯＦＦやＥＬＦが知られているが、いずれのフォーマットを採用してもよい。
【００６０】
リンカ６０６は、リロケータブルオブジェクト６０５から１つの機械語バイナリ６０７を生成する。機械語バイナリ６０７が４Ｍバイト程度のプログラムであれば、高級言語ソースファイル６０１は数百のファイルからなることが一般的である。
【００６１】
リンカ６０６が機械語バイナリ６０７を生成する際に、同時に、マップファイル６０８とデバッグ用オブジェクト６０９を生成することもできる。
【００６２】
マップファイル６０８は、高級言語ソースファイル６０１のそれぞれのファイルが機械語バイナリ６０７上に配置されたアドレスを含む。マップファイル６０８はまた、高級言語ソースファイル６０１に含まれる関数が機械語バイナリ６０７上のどのアドレスに配置されるかに関する情報（すなわち、シンボルテーブル）を含む。
【００６３】
デバッグ用オブジェクト６０９は、機械語バイナリ６０７のデバッグを行う際に利用されるものであるが、本発明の特徴ではないため、説明を省略する。
【００６４】
＜機械語バイナリ６０７の圧縮＞
図７は、機械語バイナリ６０７を圧縮して圧縮済み機械語バイナリ７０３を生成する処理を概略的に示す図である。図７において、図６と同一の要素には同一の符号を付し、説明を省略する。
【００６５】
圧縮プログラム７０１は、機械語バイナリ６０７とマップファイル６０８を読み込み、エントリアドレステーブル７０２と圧縮済み機械語バイナリ７０３を出力する。
【００６６】
エントリアドレステーブル７０２は、圧縮済み機械語バイナリ７０３がＲＡＭ３０３上に伸長された際に、機械語バイナリ６０７に含まれる各関数がＲＡＭ３０３上のどのアドレスに配置されるかを示すテーブルである。すなわち、エントリアドレステーブル７０２は、各関数の実行開始アドレス情報を含む。圧縮プログラム７０１は、マップファイル６０８を参照して、エントリアドレステーブル７０２を生成することができる。したがって、マップファイル６０８が保持するシンボルテーブル５０２（図５）に含まれない関数、すなわち関数４０４（図４）のように他のソースファイルから呼び出されない関数はエントリアドレステーブル７０２に含まれない。
【００６７】
圧縮済み機械語バイナリ７０３は、機械語バイナリ６０７をリロケータブルオブジェクト６０５の単位で分割して圧縮した複数のモジュールを含む（詳細は図８を参照して後述）。圧縮済み機械語バイナリ７０３は、マップファイル６０８を参照することにより、機械語バイナリ６０７をリロケータブルオブジェクト６０５の単位で分割することができる。圧縮プログラム７０１はまた、機械語バイナリ６０７に含まれる変数のうち、初期値が設定されているものをまとめて圧縮する。
【００６８】
圧縮のアルゴリズムとしては、ＬＺＷなどよく知られた可逆圧縮のアルゴリズム（例えば特開２００１−２６７９３０号公報）などが使用されるが、本発明の特徴ではないので説明を省略する。
【００６９】
また、圧縮プログラム７０１に指示ファイル７０４を入力することにより、例えば一部のモジュールを圧縮しないなど、圧縮に関して細かい指示を行うことができる。これにより、例えば、デジタルカメラ３００の起動時に実行される制御プログラムのパーツを含むモジュールは圧縮せずに、起動時間を短縮することが可能となる。
【００７０】
図２１は、指示ファイル７０４に含まれる、モジュールを圧縮するか否かに関する指示をユーザが設定するためのインタフェースを示す図である。
【００７１】
制御プログラムは通常、例えばＰＣなど、デジタルカメラ３００とは別の装置で生成されるのが一般的である。そこで、図２１には、ＰＣのディスプレイに表示されるＧＵＩ（グラフィカルインタフェース）を示した。ＰＣはマップファイル６０８を参照して、機械語バイナリ６０７に含まれるモジュールを抽出し、ＧＵＩ上にチェックボックスと共に表示する。指示ファイル７０４は、図２１において、チェックボックスがチェックされているモジュールに含まれる制御プログラムのパーツを圧縮し、それ以外は圧縮しないという指示を含むように生成される。
【００７２】
なお、図２１を参照して説明した指示ファイル７０４の生成方法は一例に過ぎず、例えば全モジュールの合計容量が所定の目標値になるように、各モジュールの圧縮・非圧縮を指示するように生成するなど、任意の方法で生成してよい。
【００７３】
図８は、圧縮済み機械語バイナリ７０３の構造を概略的に示す図である。
【００７４】
圧縮済み機械語バイナリ７０３は、圧縮モジュール８０１、８０２、８０４や、非圧縮モジュール８０３、圧縮済み初期化データ８０５を含む。このように、本実施形態の圧縮済み機械語バイナリ７０３は、圧縮されたモジュールと非圧縮のモジュールを混在して扱うことができる。圧縮モジュール８０１などは、前述のように、リロケータブルオブジェクト６０５単位に分割された機械語バイナリを圧縮したものである。したがって、圧縮又は非圧縮の各プログラムモジュールは、例えば関数４０３として示されるような、関数プログラムを少なくとも１つ含む。
【００７５】
圧縮済み初期化データ８０５は、前述のように、機械語バイナリ６０７に含まれる変数のうち、初期値が設定されているものをまとめて圧縮したものである。変数の初期値の容量は、制御プログラムのサイズが４Ｍバイト程度の場合、非圧縮の状態で１００Ｋバイトから３００Ｋバイト程度であることが一般的である。
【００７６】
圧縮モジュール８０１などの各モジュールは、ブロックサイズ８０６、開始アドレス８０７、圧縮済みフラグ８０８、及びプログラム領域８０９を備える。
【００７７】
ブロックサイズ８０６は、圧縮モジュールのサイズを示す。ブロックサイズ８０６は、制御プログラム実行時に、必要な圧縮モジュールを検索する際に、あるモジュールを調べた後に次のモジュールの位置を調べるために使用される。
【００７８】
開始アドレス８０７は、圧縮モジュールに含まれるプログラムを伸長してＲＡＭ３０３上に配置する際のアドレス情報（展開開始アドレス情報）を示す。
【００７９】
圧縮済みフラグ８０８は、モジュールに含まれるプログラムが圧縮されているか否かを示す、格納状態情報である。したがって、例えば圧縮モジュール８０１の圧縮済みフラグ８０８は真（ＴＲＵＥ）であり、非圧縮モジュール８０３の圧縮済みフラグ８０８は偽（ＦＡＬＳＥ）である。
【００８０】
プログラム領域８０９は、圧縮済み又は非圧縮のプログラムを格納する領域である。
【００８１】
なお、ブロックサイズ８０６、開始アドレス８０７、圧縮済みフラグ８０８は、各プログラムモジュールに含まれている必要は無く、ＲＯＭ３０２上の他の領域に記憶されていてもよい。
【００８２】
また、各プログラムモジュールをすべて圧縮モジュールとする場合（すなわち、非圧縮モジュールの存在を認めない場合）は、圧縮済みフラグ８０８は不要である。この場合、以下の説明において、圧縮済みフラグ８０８を参照してプログラムを伸長するか否かを決定する部分を、圧縮済みフラグ８０８を参照することなく一律にプログラムを伸長するものとして読み替える。
【００８３】
＜ＲＯＭ３０２に格納されるデータの構造＞
図９は、圧縮済み機械語バイナリ７０３などが格納されたＲＯＭ３０２の状態を示す図である。図３、図７、及び図８と同一の要素には同一の符号を付し、説明を省略する。
【００８４】
初期化プログラム９０１は、デジタルカメラ３００に電源が投入された際にＣＰＵ３０１が最初に実行するプログラムである。
【００８５】
ＳＷＩ伸長ハンドラ９０２は、ＳＷＩ命令によって呼び出されるハンドラプログラムである。ＳＷＩは、”ＳｏｆｔＷａｒｅ  Ｉｎｔｅｒｒｕｐｔｉｏｎ”、すなわち、「ソフトウェア割り込み」の略である。詳細は後述するが、簡単に説明すると、ＣＰＵ３０１が制御プログラムを実行している際にまだＲＡＭ３０３上に配置されていない関数が呼び出されると、呼び出された先のアドレスにＳＷＩ命令が配置されている。ＳＷＩ命令はＳＷＩ伸長ハンドラ９０２を呼び出し、ＳＷＩ伸長ハンドラ９０２は適切な圧縮（又は非圧縮）モジュールに含まれるプログラムをＲＡＭ３０３上に配置する。
【００８６】
なお、初期化プログラム９０１及びＳＷＩ伸長ハンドラ９０２は圧縮されていない機械語バイナリである。
【００８７】
＜デジタルカメラ３００の初期化＞
図１０〜１２を参照して、ＣＰＵ３０１が初期化プログラム９０１を実行することによりデジタルカメラ３００を初期化（起動準備）する処理を説明する。
【００８８】
図１０及び図１１は、デジタルカメラ３００の初期化の過程でＲＡＭ３０３に種々のデータが展開されていく様子を示す図である。図１０及び図１１において、図９と同一の要素には同一の符号を付し、説明を省略する。
【００８９】
図１２は、ＣＰＵ３０１が初期化プログラム９０１を実行することによりデジタルカメラ３００を初期化する処理の流れを示すフローチャートである。
【００９０】
ステップＳ１２０１でデジタルカメラ３００に電源が投入されると、ステップＳ１２０２で、ＣＰＵ３０１は、圧縮済み初期化データ８０５を伸長してＲＡＭ３０３上の伸長された初期化データ領域１００１に転送する（図９参照）。ＣＰＵ３０１はまた、初期値の設定されていない変数領域としてＢＳＳ領域１００２をＲＡＭ３０３上に確保し、０で埋める。
【００９１】
ステップＳ１２０３で、ＣＰＵ３０１は、ＳＷＩ伸長ハンドラ９０２をＲＡＭ３０３に転送する。ＣＰＵ３０１は、ＣＰＵ３０１内部のレジスタのＳＷＩ割り込みベクタに、ＳＷＩ伸長ハンドラ９０２のアドレスを登録する。
【００９２】
ステップＳ１２０４で、ＣＰＵ３０１はエントリアドレステーブル７０２を参照して、制御命令コードとしてのＳＷＩ命令をＲＡＭ３０３に埋め込む（書き込む）。ＳＷＩ命令は、図１０において、ＳＷＩ命令１１０１で示される長方形を始めとする、多数の長方形で表現される。本実施形態では、ＳＷＩ命令１１０２は図４の関数４０３に対応し、ＳＷＩ命令１１０３は関数４０５、ＳＷＩ命令１１０４は関数４０６にそれぞれ対応するものとして説明する。ＳＷＩ命令１１０２〜１１０４が埋め込まれるアドレスは、図５のシンボルテーブル５０２から、それぞれ０ｘ１００００番地、０ｘ１０３００番地、０ｘ１０４００番地となる。
【００９３】
ステップＳ１２０５で、ＣＰＵ３０１は初期化プログラム９０１の実行を終了する。これにより、デジタルカメラ３００を初期化する処理が終了する。次に、ＣＰＵ３０１は、いずれかの圧縮モジュールに含まれる最初のプログラムを実行するように、実行するプログラムのアドレスをＣＰＵ３０１内のプログラムカウンタに設定する。ここでは、プログラムカウンタに０ｘ１００００番地を設定するものとする。これにより、ＣＰＵ３０１は、実行開始位置である０ｘ１００００番地から制御プログラムを実行開始する。
【００９４】
＜ＳＷＩ伸長ハンドラ９０２による制御プログラムの伸長＞
図１３〜１６を参照して、ＳＷＩ伸長ハンドラ９０２によって圧縮（又は非圧縮）モジュールに含まれる制御プログラムをＲＡＭ３０３に転送しつつ、ＣＰＵ３０１が制御プログラムを実行する一連の制御を説明する。なお、ＲＯＭ３０２からＲＡＭ３０３に制御プログラム等のデータを転送することを、「展開する」と言う場合もある。
【００９５】
図１３は、圧縮モジュール８０１のプログラム領域８０９に含まれる制御プログラムが伸長されてＲＡＭ３０３に転送された状態を示す図である。図１４は、圧縮モジュール８０１に加えて、圧縮モジュール８０２のプログラム領域８０９に含まれる制御プログラムが伸長されてＲＡＭ３０３に転送された状態を示す図である。図１３及び図１４において、図１１と同一の要素には同一の符号を付し、説明を省略する。
【００９６】
図１５は、ＳＷＩ伸長ハンドラ９０２が実行されているときの、スタックの状態を示す図である。図１５のスタックでは、上に行くほど先にプッシュされたデータを、下に行くほど後にプッシュされたデータを示す。また、ＳＰはスタックポインタの略である。
【００９７】
図１６は、ＳＷＩ伸長ハンドラ９０２が行う処理の流れを示すフローチャートである。
【００９８】
図１２のステップＳ１２０５で説明したように、ＣＰＵ３０１は０ｘ１００００番地のアドレスから制御プログラムの実行を開始する。この時点では、０ｘ１００００番地には制御プログラムの実体は存在せず、ＳＷＩ命令１１０２が存在するだけである。そこで、ＣＰＵ３０１はＳＷＩ伸長ハンドラ９０２を呼び出し、図１６に示す処理が開始する。
【００９９】
ステップＳ１６０１で、ＳＷＩ伸長ハンドラ９０２の処理を開始する直前に、ＣＰＵ３０１は、リターンアドレス１５０１とステータスレジスタ１５０２をスタックにプッシュし、割り込み前の状態を保存する（図１５参照）。
【０１００】
ステップＳ１６０２で、ＣＰＵ３０１は、ＳＷＩ伸長ハンドラ９０２が使用するレジスタ（Ｒ０〜Ｒ４）をプッシュし、割り込み前の状態を保存する。
【０１０１】
ステップＳ１６０３で、ＣＰＵ３０１は、ＲＯＭ３０２に格納されている圧縮（又は非圧縮）モジュールから、呼び出された関数を含むモジュールを検索し、発見されたモジュールを注目プログラムモジュールとして特定する。モジュールの検索は、次のように行われる。
【０１０２】
ＳＰが示すアドレスから、ステップＳ１６０１とＳ１６０２でプッシュした回数分のアドレスを引いた場所から、ＣＰＵ３０１はリターンアドレス１５０１を取得する。次に、ＣＰＵ３０１は、圧縮（又は非圧縮）モジュールの開始アドレス８０７を参照して、リターンアドレス１５０１と一致するモジュールを検索する。本実施形態では、圧縮モジュール８０１の開始アドレス８０７が０ｘ１００００番地であるため、リターンアドレス１５０１と一致し、モジュールの検索が完了する。
【０１０３】
ただし、開始アドレス８０７がリターンアドレス１５０１と一致するモジュールが見つからない場合もある。例えば、ＳＷＩ命令１１０４によってＳＷＩ伸長ハンドラ９０２が呼び出された場合、リターンアドレス１５０１は０ｘ１０５００番地である。しかし、図４及び図５から明らかなように、圧縮モジュール８０２に対応するソースファイル４０２の機械語バイナリは、０ｘ１０３００番地から始まっており、圧縮モジュール８０２の開始アドレス８０７は０ｘ１０３００番地である。そこで、開始アドレス８０７がリターンアドレス１５０１と一致するモジュールが見つからない場合は、リターンアドレス１５０１よりも上位（小さい）で、最も近いアドレスを含むモジュールを注目プログラムモジュールとする。
【０１０４】
ステップＳ１６０４で、ＣＰＵ３０１は、ステップＳ１６０３で検索したモジュールの圧縮済みフラグ８０８を参照して、そのモジュールが圧縮されているか否かを判定する。
圧縮されていればステップＳ１６０６に進み、圧縮されていなければステップＳ１６０５に進む。
【０１０５】
ステップＳ１６０５で、ＣＰＵ３０１は、ステップＳ１６０３で検索したモジュールのプログラム領域８０９に含まれるプログラムをそのままＲＡＭ３０３に転送する。転送先のアドレスは、開始アドレス８０７が示すアドレスである。
【０１０６】
ステップＳ１６０６で、ＣＰＵ３０１は、ステップＳ１６０３で検索したモジュールのプログラム領域８０９に含まれるプログラムを伸長し、ＲＡＭ３０３に転送する。転送先のアドレスは、ステップＳ１６０５の場合と同様、開始アドレス８０７が示すアドレスである。
【０１０７】
ステップＳ１６０６で圧縮モジュール８０１に含まれるプログラムがＲＡＭ３０３に転送されると、ＲＡＭ３０３は図１３に示す状態になる。図１３において、領域１３０１に転送されたプログラムが格納される。圧縮モジュール８０２に含まれるプログラムがＲＡＭ３０３に転送されると、ＲＡＭ３０３は図１４に示す状態になる。図１４において、領域１４０１に転送されたプログラムが格納される。なお、圧縮モジュール８０２に含まれるプログラムをＲＡＭ３０３に転送すると、ＳＷＩ命令１１０３及びＳＷＩ命令１１０４の２つのＳＷＩ命令が上書きされる。しかし、上書きされたＳＷＩ命令が存在するアドレスはいずれも圧縮モジュール８０２に含まれるプログラムが保持する関数の先頭アドレスである。そのため、これらの関数が他の関数から呼ばれた場合はＳＷＩ伸長ハンドラ９０２が呼ばれること無く既に転送されている関数が実行されるため、制御プログラムの実行は正常に行われる。
【０１０８】
ステップＳ１６０７で、ＣＰＵ３０１は、スタックにあるリターンアドレス１５０１のアドレスを１命令文戻す。これは、次の理由による。通常のソフトウェア割り込みの場合、割り込み処理が完了すると、割り込み命令の次のアドレスからプログラムの実行が継続する。しかし、本実施形態では、例えばＳＷＩ命令１１０２を圧縮モジュール８０１に含まれるプログラムで上書きし、ＳＷＩ命令１１０２が存在したアドレスから、上書きしたプログラムを実行するからである。
【０１０９】
さらに説明すると、通常リターンアドレス１５０１はＳＷＩ命令が存在したアドレスの次の命令が存在するアドレスを示し、割り込み処理が終了するとＣＰＵ３０１は次の命令を実行する。しかし、本実施形態の場合は、ＳＷＩ伸長ハンドラ９０２の処理が終了した時点で、伸長された本来あるべきプログラムから処理を行い。そのため、ＳＷＩ伸長ハンドラ９０２が呼び出される前にＳＷＩ命令が存在していたアドレスへ戻るようにスタックのリターンアドレス１５０１を操作する。
【０１１０】
ステップＳ１６０８で、ＣＰＵ３０１は、スタックからレジスタ（Ｒ０〜Ｒ４）をポップし、レジスタの状態をＳＷＩ伸長ハンドラ９０２実行前の状態に戻す。
【０１１１】
ステップＳ１６０９で、ＣＰＵ３０１は、スタックからステータスレジスタ１５０２とリターンレジスタ１５０１をポップし、モジュールから転送されたプログラムに処理を戻す。
【０１１２】
図１７は、ＳＷＩ伸長ハンドラ９０２が何度も呼ばれ、多くのモジュールがＲＡＭ３０３に転送された状態を示す図である。図に示すように、ＲＡＭ３０３において斜線で表現される領域が増えている。このように、本実施形態では、まだＲＡＭ３０３に転送されていない関数が呼ばれるたびにＳＷＩ命令がＳＷＩ伸長ハンドラ９０２を呼び出し、呼ばれた関数に相当するプログラムがＲＡＭ３０３に転送される。転送されたプログラムは、デジタルカメラ３００の電源がＯＦＦになるまでＲＡＭ３０３に保持されるため、最終的にはすべての制御プログラムが伸長されてＲＡＭ３０３に転送された状態になりうる。
【０１１３】
図１８は、ＳＷＩ伸長ハンドラ９０２が行う処理を、関数を呼び出す側のプログラムから見た様子を模式的に示す図である。関数Ａが符号１８０１に示す時点で関数Ｂを呼び出したとする。
【０１１４】
関数Ｂに相当するプログラムがまだＲＡＭ３０３に転送されていない場合、本来関数Ｂが配置されるアドレスにはＳＷＩ命令が存在するため、符号１８０２に示す時点でＳＷＩ伸長ハンドラ９０２が呼び出される。ＳＷＩ伸長ハンドラ９０２は符号１８０３の時点で関数Ｂを伸長して（非圧縮の場合伸長せずに）ＲＡＭ３０３に転送し、ＩＲＥＴ命令により関数Ｂの先頭に戻る（符号１８０４）。関数Ｂの実行が終了すると、ＲＥＴ命令により、関数Ａにおいて関数Ｂを呼び出した次の命令に戻る（符号１８０５）。
【０１１５】
一方、関数Ｂに相当するプログラムが既にＲＡＭ３０３に転送されている場合、符号１８０２の時点ではＳＷＩ伸長ハンドラ９０２が呼ばれること無く関数Ｂが実行される。関数Ｂの実行が終了すると、ＲＥＴ命令により、関数Ａにおいて関数Ｂを呼び出した次の命令に戻る（符号１８０５）。
【０１１６】
このように、関数Ａから見ると、関数Ｂが存在する場合でも存在しない場合でも、関数Ｂを呼び出す処理は同じである。そのため、本実施形態には、プログラマが呼び出し元の関数を生成する際に、呼び出し先の関数の状態を意識することなく生成可能であるという利点がある。
【０１１７】
＜実施形態のまとめ＞
以上説明したように、本実施形態によれば、デジタルカメラ３００のＲＯＭ３０２は、制御プログラムとして、リロケータブルオブジェクトの単位で分割されて圧縮された複数のモジュールを含む圧縮済み機械語バイナリ７０３を保持する。モジュールの中には、圧縮されていないものが含まれていても構わない。ＲＯＭ３０２はまた、初期化プログラム９０１、ＳＷＩ伸長ハンドラ９０２、エントリアドレステーブル７０２を保持する。デジタルカメラ３００に電源が投入されると、ＣＰＵ３０１はＳＷＩ伸長ハンドラ９０２をＲＡＭ３０３に転送し、また、エントリアドレステーブル７０２を参照して複数のＳＷＩ命令をＲＡＭ３０３に配置する。ＣＰＵ３０１が制御プログラムを実行する際に、実行対象であるプログラムがＲＡＭ３０３に転送されていなければ、ＳＷＩ伸長ハンドラ９０２が呼ばれ、実行対象であるプログラムがＲＡＭ３０３に転送される。
【０１１８】
これにより、デジタルカメラ３００の起動時間が長くなること及びレスポンスの低下を抑制しつつ、制御プログラムを圧縮して、必要なＲＯＭ３０２の容量増大を抑制することが可能となる。
【０１１９】
［その他の実施形態］
＜バックグラウンド伸張＞
デジタルカメラ３００の起動時間には、アナログデバイスの安定待ち時間やステッピングモーターの駆動の待ち時間など、制御プログラムの実行とは無関係な待ち時間が多く含まれる。そこで、これらの待ち時間を利用して、まだ、ＲＡＭ３０３に転送されていないプログラムをバックグラウンドで伸長することができる。
【０１２０】
これにより、制御プログラムのより多くのパーツ（モジュール）を事前にＲＡＭ３０３に転送しておくことができるため、デジタルカメラ３００のレスポンスを向上させることができる。
【０１２１】
図１９は、バックグラウンドで動作する伸長プログラムの処理の流れを示すフローチャートである。この伸長プログラムは、バックグラウンド展開手段として機能し、初期化プログラム９０１やＳＷＩ伸長ハンドラ９０２と同様に、圧縮されていない状態でＲＯＭ３０２に含まれる。そして、デジタルカメラ３００のオペレーティングシステムが管理するプログラムのうち、最もプライオリティが低いタスクとして実行される。
【０１２２】
ステップＳ１７０１で伸長プログラムの実行がスタートすると、ステップＳ１７０２で、ＣＰＵ３０１はＲＯＭ３０２上の複数のモジュールにおける最初のモジュールを転送対象とする。この段階では実際の転送は行われない。
【０１２３】
ステップＳ１９０３で、ＣＰＵ３０１は、転送対象モジュールのプログラム領域８０９が含むプログラムが既にＲＡＭ３０３に転送されているか否かを判定する。ここでの判定は、転送対象モジュールの開始アドレス８０７にＳＷＩ命令が存在するか否かを判定することにより行われる。ＳＷＩ命令が存在しなければプログラムが既に転送されているため、ステップＳ１９０４に進む。ＳＷＩ命令が存在すればプログラムはまだ転送されていないためステップＳ１９０５に進む。また、すべてのモジュールのプログラム領域８０９が含むプログラムが既にＲＡＭ３０３に転送されていれば、ステップＳ１９１１に進み、処理を終了する。
【０１２４】
ステップＳ１９０４で、ＣＰＵ３０１は、転送対象モジュールのブロックサイズ８０６を参照して、転送対象モジュールを次のモジュールに変更する。次いでステップＳ１９０２に戻り、同様の処理を繰り返す。
【０１２５】
ステップＳ１９０５で、ＣＰＵ３０１は、転送対象モジュールの圧縮済みフラグ８０８を参照して、転送対象モジュールのプログラム領域８０９が含むプログラムが圧縮されているか否かを判定する。圧縮されている場合はステップＳ１９０６に進み、圧縮されていない場合はステップＳ１９０７に進む。
【０１２６】
ステップＳ１９０６で、ＣＰＵ３０１は、転送対象モジュールのプログラム領域８０９が含むプログラムを伸長して、ＲＡＭ３０３上の開始アドレス８０７が示すアドレスに転送する。ただし、ＳＷＩ命令が配置されているアドレスは上書きせず、そのアドレスに転送されるべきプログラムはワークエリアに保存する。プログラムを転送している途中で、転送中のプログラムに含まれる関数が呼び出された場合に、ＳＷＩ命令が存在しないと不完全なプログラムが実行されてしまうからである。ＳＷＩ命令が存在すれば、伸長プログラムによるバックグラウンドでの転送処理は中断され、前述したＳＷＩ伸長ハンドラ９０２による処理が行われる。
【０１２７】
ステップＳ１９０７における処理は、プログラムの伸長が行われないことを除き、ステップＳ１９０６における処理と同様である。
【０１２８】
ステップＳ１９０８で、ＣＰＵ３０１は、割り込みを禁止する。これにより、割り込みはもちろんのこと、タスクの切り替えも行われなくなり、伸長プログラムがＣＰＵ３０１を占有することになる。
【０１２９】
ステップＳ１９０９で、ＣＰＵ３０１は、ステップＳ１９０６又はＳ１９０７でワークエリアに保存しておいた、ＳＷＩ命令が存在したアドレスに転送されるべき本来のプログラムを、ＳＷＩ命令が存在したアドレスに転送する。
【０１３０】
ステップＳ１９１０で、ＣＰＵ３０１は、割り込みを許可する。次いでステップＳ１９０４に戻り、同様の処理を繰り返す。ステップＳ１９０３からステップＳ１９１０の処理を繰り返し実行すると、やがてＲＯＭ３０２上のすべてのモジュールに含まれるプログラムがＲＡＭ３０３に転送されるため、ステップＳ１９１１に進み、伸長プログラムは処理を終了する。
【０１３１】
このように、バックグラウンドで伸長プログラムを実行することにより、制御プログラムのより多くのパーツ（モジュール）を事前にＲＡＭ３０３に転送しておくことができるため、デジタルカメラ３００のレスポンスを向上させることができる。
【０１３２】
＜リンク順序のコントロール＞
上述のように、伸長プログラムを用いて圧縮されたプログラムをバックグラウンドで伸長する場合、そのままではプログラムの実行順序とは無関係に伸長を行うことになる可能性がある。すなわち、プログラムが実行される順番ではなく、プログラム（厳密には圧縮又は非圧縮のモジュール）がＲＯＭ３０２に配置されている順番で、プログラムがＲＡＭ３０３に転送される。
【０１３３】
そこで、リンカ６０６に与えるコマンドにより、プログラムが実行される順番に並ぶようにリロケータブルオブジェクト６０５を結合するように指示してもよい。
【０１３４】
こうすることにより、実行されるプログラムが既にＲＡＭ３０３に転送されている可能性が高くなり、デジタルカメラ３００のレスポンスを向上させることができる。
【０１３５】
＜圧縮率のコントロール＞
ＲＯＭ３０２のサイズを大容量化する場合、前述の通り、２Ｍバイトの次は４Ｍバイト、その次は８Ｍバイトといったように、倍のサイズになる。したがって、プログラムを圧縮した結果、例えばＲＯＭ３０２に格納されるデータが３Ｍバイトになったとしても、ＲＯＭ３０２の容量は４Ｍバイトとせざるを得ず、１Ｍバイトの無駄が生じる。
【０１３６】
そこで、指示ファイル７０４により、ＲＯＭ３０２の目標必要量を圧縮プログラム７０１に指示してもよい。初期化プログラム９０１等も含めたＲＯＭ３０２に格納されるデータの容量が、必要目標量に達しない場合は、必要目標量を超えない範囲で、モジュールの一部を圧縮から非圧縮に変更する。
【０１３７】
前述のように、プログラムが実行される順番に並ぶようにリンクされている場合は、先頭に配置されているモジュールから順に非圧縮とすることが好ましい。
【０１３８】
これにより、デジタルカメラ３００の起動時間をさらに短縮することが可能となる。
【０１３９】
＜分割の単位＞
前述のように、図６の機械語バイナリ６０７を分割する際の単位は、リロケータブルオブジェクト６０５の単位であった。すなわち、図８における圧縮（又は非圧縮）モジュールの数は、リロケータブルオブジェクト６０５の数に等しい。
【０１４０】
しかし、機械語バイナリ６０７を関数の単位で分割してもよい。すなわち、各圧縮（又は非圧縮）モジュールのプログラム領域８０９には、必ず１つの関数のみに対応するプログラムが含まれる。
【０１４１】
これにより、各圧縮モジュールのサイズが小さくなるため、ＳＷＩ命令がＳＷＩ伸長ハンドラ９０２を呼び出した際に圧縮された機械語バイナリを伸長する時間が短くなり、デジタルカメラ３００のレスポンスが向上する。この効果は、プログラマが１つの高級言語ソースファイル６０１に多くの関数を記述する場合に、より顕著になる。
【０１４２】
なお、機械語バイナリ６０７を関数の単位で分割する場合は、図４の関数４０４のように、他のソースファイルから呼び出されない関数についても対応するＳＷＩ命令をＲＡＭ３０３に配置する必要がある。そのため、図５のシンボルテーブル５０２は、他のソースファイルから呼び出されない関数を含む、すべての関数の名前とアドレスを含むように構成される。
【０１４３】
＜その他＞
上述した実施の形態の処理は、各機能を具現化したソフトウェアのプログラムコードを記録した記憶媒体をシステム或は装置に提供してもよい。そして、そのシステム或は装置のコンピュータ（又はＣＰＵやＭＰＵ）が記憶媒体に格納されたプログラムコードを読み出し実行することによって、前述した実施形態の機能を実現することができる。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記憶した記憶媒体は本発明を構成することになる。このようなプログラムコードを供給するための記憶媒体としては、例えば、フロッピィ（登録商標）ディスク、ハードディスク、光ディスク、光磁気ディスクなどを用いることができる。或いは、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、磁気テープ、不揮発性のメモリカード、ＲＯＭなどを用いることもできる。
【０１４４】
また、コンピュータが読み出したプログラムコードを実行することにより、前述した各実施の形態の機能が実現されるだけではない。そのプログラムコードの指示に基づき、コンピュータ上で稼動しているＯＳ（オペレーティングシステム）などが実際の処理の一部又は全部を行い、その処理によって前述した各実施の形態の機能が実現される場合も含まれている。
【０１４５】
さらに、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書きこまれてもよい。その後、そのプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるＣＰＵなどが実際の処理の一部又は全部を行い、その処理によって前述した各実施の形態の機能が実現される場合も含むものである。
【図面の簡単な説明】
【０１４６】
【図１】従来技術におけるＲＯＭ１０１とＲＡＭ１０２に格納されるデータの例を示す図である。
【図２】従来技術において制御プログラムが実行される手順を示すフローチャートである。
【図３】本発明を適用したデジタルカメラ３００のハードウェア構成を示すブロック図である。
【図４】本実施形態におけるソースファイルを概念的に示す図である。
【図５】ソースファイル４０１とソースファイル４０２から生成される機械語バイナリ５０１とシンボルテーブル５０２を示す図である。
【図６】Ｃ言語などに代表される高級言語ソースファイル６０１から機械語バイナリ６０７を生成する処理を概略的に示す図である。
【図７】機械語バイナリ６０７を圧縮して圧縮済み機械語バイナリ７０３を生成する処理を概略的に示す図である。
【図８】圧縮済み機械語バイナリ７０３の構造を概略的に示す図である。
【図９】圧縮済み機械語バイナリ７０３などが格納されたＲＯＭ３０２の状態を示す図である。
【図１０】デジタルカメラ３００の初期化の過程でＲＡＭ３０３に種々のデータが展開されていく様子を示す図である。
【図１１】デジタルカメラ３００の初期化の過程でＲＡＭ３０３に種々のデータが展開されていく様子を示す図である。
【図１２】ＣＰＵ３０１が初期化プログラム９０１を実行することによりデジタルカメラ３００を初期化する処理の流れを示すフローチャートである。
【図１３】圧縮モジュール８０１のプログラム領域８０９に含まれる制御プログラムが伸長されてＲＡＭ３０３に転送された状態を示す図である。
【図１４】圧縮モジュール８０１に加えて、圧縮モジュール８０２のプログラム領域８０９に含まれる制御プログラムが伸長されてＲＡＭ３０３に転送された状態を示す図である。
【図１５】ＳＷＩ伸長ハンドラ９０２が実行されているときの、スタックの状態を示す図である。
【図１６】ＳＷＩ伸長ハンドラ９０２が行う処理の流れを示すフローチャートである。
【図１７】ＳＷＩ伸長ハンドラ９０２が何度も呼ばれ、多くのモジュールがＲＡＭ３０３に転送された状態を示す図である。
【図１８】ＳＷＩ伸長ハンドラ９０２が行う処理を、関数を呼び出す側のプログラムから見た様子を模式的に示す図である。
【図１９】バックグラウンドで動作する伸長プログラムの処理の流れを示すフローチャートである。
【図２０】デジタルカメラ３００が行う処理の流れの概要を示すフローチャートである。
【図２１】指示ファイル７０４に含まれる、モジュールを圧縮するか否かに関する指示をユーザが設定するためのインタフェースを示す図である。
【符号の説明】
【０１４７】
３００  デジタルカメラ
３０１  ＣＰＵ
３０２  ＲＯＭ
３０３  ＲＡＭ
５０２  シンボルテーブル
６０８  マップファイル
７０２  エントリアドレステーブル
９０１  初期化プログラム
９０２  ＳＷＩ伸長ハンドラ
１１０１  ＳＷＩ命令
【図１】
0004845497.tif 000002
【図２】
0004845497.tif 000003
【図３】
0004845497.tif 000004
【図４】
0004845497.tif 000005
【図５】
0004845497.tif 000006
【図６】
0004845497.tif 000007
【図７】
0004845497.tif 000008
【図８】
0004845497.tif 000009
【図９】
0004845497.tif 000010
【図１０】
0004845497.tif 000011
【図１１】
0004845497.tif 000012
【図１２】
0004845497.tif 000013
【図１３】
0004845497.tif 000014
【図１４】
0004845497.tif 000015
【図１５】
0004845497.tif 000016
【図１６】
0004845497.tif 000017
【図１７】
0004845497.tif 000018
【図１８】
0004845497.tif 000019
【図１９】
0004845497.tif 000020
【図２０】
0004845497.tif 000021
【図２１】
0004845497.tif 000022