(57)【要約】【課題】  プログラムコードの自己診断によって特定のコマンド処理に不具合が発生すること、あるいはプログラムコード自己診断の実行が不十分となることを回避することのできるＩＣカード及びプログラムコードの診断方法を提供する。【解決手段】  外部からのコマンドを解釈実行し、その結果を応答するＩＣカード（１）において、ＩＣカードで実行されるプログラムを格納するプログラム領域（１０４）と、外部からコマンドを受信する受信部（１３）と、コマンドに対応した処理、及びプログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部（１０１）とを有し、制御部は、プログラムコードの良否診断を、受信部が所定のコマンドを受信する毎の複数回に分割して実行し、分割された良否診断を実行した後で当該所定のコマンドの処理を実行するＩＣカードである。【選択図】図１
2013011988.tif 000002
【特許請求の範囲】
【請求項１】
外部からのコマンドを解釈実行し、その結果を応答するＩＣカードにおいて、
前記ＩＣカードで実行されるプログラムを格納するプログラム領域と、
外部からコマンドを受信する受信部と、
前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、
前記制御部は、
前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行すること
を特徴とするＩＣカード。
【請求項２】
前記ＩＣカードは、複数の通信インターフェースを有し、
前記所定のコマンドは、特定の前記通信インターフェースを介して受信したコマンドであること
を特徴とする請求項１に記載のＩＣカード。
【請求項３】
前記ＩＣカードは、少なくとも２つのＩＳＯ／ＩＥＣ７８１６−４に規定される論理チャネルを有し、
前記所定のコマンドは、特定の前記チャネルを介して受信したコマンドであること
を特徴とする請求項１に記載のＩＣカード。
【請求項４】
前記所定のコマンドは、特定の処理の実行を指示するコマンドであることを特徴とする請求項１に記載のＩＣカード。
【請求項５】
前記制御部は、前記プログラムコードの良否判断を、外部からのコマンドで指示された分割数に分割して実行することを特徴とする請求項１に記載のＩＣカード。
【請求項６】
前記制御部は、前記プログラムコードの良否診断結果が不良のときは、以降に受信するコマンドに対応する処理、及び以降のプログラムコードの良否判断を実行しないことを特徴とする請求項１に記載のＩＣカード。
【請求項７】
前記制御部は、全プログラムコードの良否診断を終了した後は、外部からのコマンドを予め定めた所定数以上受信した後であって、前記所定のコマンドを受信したときに前記プログラムコードの良否診断を改めて実行することを特徴とする請求項１に記載のＩＣカード。
【請求項８】
前記制御部は、全プログラムコードの良否診断を終了した後は、前記所定のコマンドを受信したときに前記プログラムコードの良否診断を改めて実行することを特徴とする請求項１に記載のＩＣカード。
【請求項９】
前記プログラムコードの良否診断は、ＣＲＣ１６演算を利用して実行されることを特徴とする請求項１乃至８のいずれか１項に記載のＩＣカード。
【請求項１０】
外部からのコマンドを解釈実行し、その結果を応答するＩＣカードにおけるプログラムコードの診断方法であって、
前記ＩＣカードは、当該ＩＣカードで実行されるプログラムを格納するプログラム領域と、外部からコマンドを受信する受信部と、前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、
前記制御部が、
前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、
前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行すること
を特徴とするプログラムコードの診断方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラムコード自己診断機能を持つＩＣカード及びプログラムコードの診断方法に関する。
【背景技術】
【０００２】
一般に、ＩＣカードには、プラスチックなどで形成されたカード状の本体内に制御素子（ＣＰＵ）および各種メモリなどを有するＩＣチップが埋め込まれている。このようなＩＣカードには、各種メモリに格納されているデータを自己診断する機能を有するものがある。
【０００３】
ＩＣカードの自己診断機能として、ＬＳＩがサポートする各種ハードウェアの診断、オペレーティングシステム（ＯＳ）やアプリケーションプログラムを含むプログラムコードの自己診断、ＯＳやアプリケーションプログラムの動作に必要なデータを格納するデータ領域の自己診断、ＲＡＭの自己診断などが提案されている。
【０００４】
上記各自己診断の中でもプログラムコードの自己診断では、対象とするプログラムコードのサイズが大きいと、それに対応して自己診断の実行時間も大きくなる。そのため、将来、ＩＣカードの持つ機能が多様化、複雑化するに伴って、プログラムコードのサイズが大きくなると、プラグラムコードの自己診断時間も長くなると想定される。
【０００５】
そのため、この処理時間の長いプログラムコードの自己診断を、いつ実行するのか、という点が重要となっている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００８−３１０５９７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上記したように、プログラムコードの自己診断を一括して実行する場合、いつ実行するのかが重要となる。ＩＣカードは、外部装置からのコマンド（命令）に応じて受動的に動作し、また、ＩＳＯ／ＩＥＣ７８１６等で規定されるように、コマンドに対するレスポンスデータを応答した後は、低消費電流モードに移行することが要求される場合がある。
【０００８】
このため、一般的にＩＣカードの自己診断は、コマンド受信終了後から、レスポンスデータ応答前までの間、つまりコマンド処理の一環として実行される。  
また、プログラムコードの自己診断は、ＩＣカードを活性化した後に１度、たとえば最初に受信したコマンドなど、１つのコマンド処理中に実行される、あるいは、特定の処理を実行する前に、その対象となる領域の自己診断が実行されるという方法が提案されている。
【０００９】
ここで、１つのコマンド処理中に実行される、という方式を使用した場合は、次のような問題が発生する恐れがある。たとえば、プログラムコードのサイズが大きい場合、最初に受信したコマンドに対するＩＣカードの処理時間が長くなる。そのため、外部装置側にＩＣカードの処理が不当に長くなっているという判定を行なうための処理タイムアウト時間が設定されていて、自己診断を行なうことによりこのタイムアウト時間を超えてしまった場合、ＩＣカードと外部装置との間の処理が正しく行なえなくなる。
【００１０】
また、ＩＣカードの活性化後に１回実行される、という方式を使用した場合は、次のような問題が発生する恐れがある。たとえば、ＩＣカードが携帯電話機に挿入されて使用されるＵＩＭカードなどである場合、携帯電話機の電源は、通常は、オン状態を継続するため、ＩＣカードは常に活性化された状態を保持する。そのため、次の自己診断処理は、所有者が一旦、携帯電話機の電源をオフし、再度、携帯電話機の電源をオンした場合にのみ実行されるため自己診断がほとんど行なわれなくなる。
【００１１】
従って、プログラムコードの自己診断によって特定のコマンド処理に不具合が発生することを回避し、あるいはプログラムコード自己診断の実行が不十分となることを回避することのできるＩＣカード及びプログラムコードの診断方法を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記課題を解決するための本発明の実施の形態によれば、外部からのコマンドを解釈実行し、その結果を応答するＩＣカードにおいて、前記ＩＣカードで実行されるプログラムを格納するプログラム領域と、外部からコマンドを受信する受信部と、前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、前記制御部は、前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行するＩＣカードが提供される。
【図面の簡単な説明】
【００１３】
【図１】第１の実施の形態に係るＩＣカードの構成を概略的に示す図。
【図２】第１の実施の形態のデータメモリ、ＲＡＭおよびＲＯＭの構成を模式的に示す図。
【図３】第１の実施の形態のＲＡＭの領域に一時記憶される各種データの具体例を示す図。
【図４】第１の実施の形態に係る自己診断処理手順を示すフローチャート。
【図５】第１の実施の形態に係る自己診断処理手順を示すフローチャート。
【図６】第１の実施の形態のバリエーション１に係る自己診断処理手順の一部を示すフローチャート。
【図７】、第１の実施の形態のバリエーション２に係る自己診断処理手順の一部を示すフローチャート。
【図８】第１の実施の形態のバリエーション２に係るリーダライタ用コマンドの概略のフォーマットを示す図。
【図９】第１の実施の形態のバリエーション３に係る自己診断処理手順の一部を示すフローチャート。
【図１０】第１の実施の形態のバリエーション４に係る自己診断処理手順の一部を示すフローチャート。
【図１１】第２の実施の形態の自己診断処理手順の一部を示すフローチャート。
【発明を実施するための形態】
【００１４】
〔第１の実施の形態〕  
図１は、第１の実施の形態に係るＩＣカードの構成を概略的に示す図である。このＩＣカード１は、非接触通信機能及び接触式通信機能をサポートする複合ＩＣカードである。ＩＣカード本体１ａ内にはＩＣモジュール１１が埋設されている。ＩＣモジュール１１は、ＩＣチップ１２、非接触通信手段としての非接触通信部１３ａおよび接触式通信手段としての接触端子１３ｂを有し、これらは一体的にモジュール化されている。  
ＩＣカード１は、非接触通信部１３ａを介して非接触通信方式により非接触式カードリーダ・ライタ（外部装置）２ａと通信を行なう。ＩＣカード１は、接触端子１３ｂを介して接触通信方式により接触式カードリーダ・ライタ（外部装置）２ｂと通信を行なう。
【００１５】
ＩＣチップ１２は、ＣＰＵ（セントラル・プロセッシング・ユニット）１０１、データメモリ１０２、ＲＡＭ（ランダム・アクセス・メモリ）１０３、ＲＯＭ（リード・オンリ・メモリ）１０４、非接触通信インターフェース（Ｉ／Ｆ）１０５ａ、および接触通信インターフェース（Ｉ／Ｆ）１０５ｂ、１０５ｃを有して構成される。
【００１６】
ＣＰＵ１０１は、制御部として機能する。データメモリ１０２は、各種データを保持（記憶）するための記憶手段である。ＲＡＭ１０３は、ワーキングメモリとして機能する記憶手段である。ＲＯＭ１０４は、ＣＰＵ１０１が実行するプログラムなどを格納した記憶手段である。非接触通信インターフェース（Ｉ／Ｆ）１０５ａは、非接触通信部１３ａを介して非接触式カードリーダ・ライタ２ａと授受される通信情報を仲介する。接触通信インターフェース（Ｉ／Ｆ）１０５ｂ、１０５ｃは、接触端子１３ｂを介して接触式カードリーダ・ライタ２ｂと授受される通信情報を仲介する。
【００１７】
データメモリ１０２は、たとえば、ＥＥＰＲＯＭやフラッシュメモリなどの不揮発性メモリにより構成されていて、本実施形態では、２５６Ｋバイトの容量を有している。
【００１８】
図２は、第１の実施の形態のデータメモリ１０２、ＲＡＭ１０３およびＲＯＭ１０４の構成を模式的に示す図である。
【００１９】
ＲＯＭ１０４には、プログラムコードおよびプログラムコードが破壊されていないことを確認するためのチェックコード期待値が格納されている。なお、チェックコード期待値は、プログラムコードの一部としてプログラムコード内にあらかじめ格納されている。  
ＲＯＭ１０４は、本実施形態では、たとえば、開始アドレスが［０ｘ００００００］、終了アドレスが［０ｘ０３ＦＦＦＦ］で、２５６Ｋバイトの容量を有している。
【００２０】
ＲＡＭ１０３には、領域１０３ａ〜１０３ｅが確保されている。  
領域１０３ａには、プログラムコード自己診断の結果情報である自己診断結果フラグが一時記憶される。領域１０３ｂには、自己診断が終了したアドレスが一時記憶される。領域１０３ｃには、中間結果あるいはチェックコード期待値と比較する最終結果となるチェックコード算出値が一時記憶される。領域１０３ｄには、所定のイニシャル状態から受信したコマンドの累積数が一時記憶される。領域１０３ｅには、一回の自己診断でチェックされるＲＯＭ１０４のサイズが一時記憶される。  
なお、ＲＡＭ１０３は、本実施形態では、たとえば、４０Ｋバイトの容量を有している。
【００２１】
図３は、第１の実施の形態のＲＡＭ１０３の領域１０３ａ〜１０３ｅに一時記憶される各種データの具体例を示す図である。
【００２２】
領域１０３ａに一時記憶される自己診断結果フラグは、たとえば、１バイトのデータで、プログラムコード自己診断状況（未実施、実施中、終了）、および自己診断が終了している場合はその結果（正常、異常）を示す情報である。
【００２３】
領域１０３ｂに一時記憶される自己診断終了アドレスは、たとえば、３バイトのデータで、前回コマンド処理終了時点で、プログラムコードのどの部分までの自己診断が終了したか（未実施、実施中、終了）、を一時記憶するための情報である。具体的には、その時点で自己診断が終了した最終のメモリアドレスを情報として記憶する。
【００２４】
領域１０３ｃに一時記憶されるチェックコード算出値は、たとえば、２バイトのデータで、自己診断終了アドレスが、終了（つまり、プログラムコードの最終アドレス）を示していない場合は中間結果を表し、終了を示している場合は自己診断最終チェックコード値を表している。自己診断最終チェックコード値は、自己診断の合否判定を行なうためにプログラムコード内にあらかじめ格納されたチェックコード期待値と比較するためのデータである。
【００２５】
領域１０３ｄに一時記憶されるコマンドカウンタは、例えば、２バイトのデータで、電源がオンされて活性化された初期状態、あるいは所定のイニシャル状態からのＩＣカード２が受信したコマンドの累積数を示す情報である。
【００２６】
領域１０３ｅに一時記憶される分割サイズは、自己診断を実施する際に、一回の自己診断でチェックされるＲＯＭ１０４のサイズを示す情報である。
【００２７】
図４、図５は、第１の実施の形態に係る自己診断処理手順を示すフローチャートである。なお、本フローチャートでは、ＩＣカード１の全ての処理を詳細には記載せず、本実施形態の説明を行なう上で必要となる部分のみについて記載している。また、本フローチャートでは、説明を簡略化するために、特に断らない限り接触式カードリーダ・ライタ２ｂとの送受信について記載する。特に断らない限り非接触式カードリーダ・ライタ２ａとの送受信も同様に行なわれる。
【００２８】
ＩＳＯ／ＩＥＣ７８１６シリーズに規定された手順にしたがって活性化されることで、ＣＰＵ１０１は、自己診断処理を開始する（ステップＳ１）。ステップＳ２において、ＣＰＵ１０１は、ＲＡＭ１０３の初期化を実行する。初期化によって、ＲＡＭ１０３の領域１０３ａ〜１０３ｅに示した各一時記憶データに初期値が書き込まれる。
【００２９】
ステップＳ３において、ＣＰＵ１０１は、ＩＳＯ／ＩＥＣ７８１６シリーズの規定にしたがい、ＡＴＲ（アンサー・ツー・リセット）を外部装置である接触式カードリーダ・ライタ２ｂへ送信する。ステップＳ４において、ＡＴＲ送信後、ＣＰＵ１０１は、接触式カードリーダ・ライタ２ｂからのコマンドを待つための受信待ちモードへ進む。接触式カードリーダ・ライタ２ｂからコマンドが送信されない場合、本ステップＳ４に留まり続ける。
【００３０】
接触式カードリーダ・ライタ２ｂからコマンドを受信すると、ステップＳ５において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグの状態をチェックし、「終了（異常または正常）」または「終了でない」のいずれかを判定する。
【００３１】
ステップＳ５の判定の結果、自己診断結果フラグが「終了（異常）」を示していた場合、何らかの原因によりプログラムコードが誤ったコードに書き換えられていることを示している。従ってこの場合は、このプログラムコードを実行することは中止すべきである。ステップＳ２０において、ＣＰＵ１０１は、コマンドの処理を実行せず、自己診断エラーを意味するステータスワード（ＳＷ）を接触式カードリーダ・ライタ２ｂへ応答する。そして、再びステップＳ４のコマンド受信待ち状態へ戻る。
【００３２】
ステップＳ５の判定の結果、自己診断結果フラグが「終了（異常）」でも「終了（正常）」でもない場合、ステップＳ６において、ＣＰＵ１０１は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、ＣＰＵ１０１は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。
【００３３】
ステップＳ６の判定の結果、自己診断結果フラグが、「未実施」を示していた場合、ＣＰＵ１０１は、ステップＳ７において、初回の自己診断を開始するために、自己診断処理に受け渡すパラメータである「開始アドレス」、「チェックコード算出値」に初期値を設定する。そして、ステップＳ１０において、プログラムコード自己診断処理を実行する。
【００３４】
ステップＳ６の判定の結果、自己診断結果フラグが、「実施中」を示していた場合、ＣＰＵ１０１は、今回の処理で自己診断を継続して再開するために、前回コマンドで行なった自己診断の中間情報をＲＡＭ１０３から復帰する。
【００３５】
すなわち、ステップＳ８において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ｃに記憶されている中間結果のチェックコード算出値をセットする。ステップＳ９において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ｂに記憶されている自己診断終了アドレスに「＋１」した値を自己診断開始アドレスにセットする。そして、ステップＳ１０において、プログラムコード自己診断処理を実行する。
【００３６】
ステップＳ１０において、ＣＰＵ１０１は、ＲＯＭ１０４内のプログラムコードに対する自己診断を実行する。この自己診断では、上記セットされた「開始アドレス」、「チェックコード算出値」を用いる。
【００３７】
ステップＳ１０におけるプログラムコード自己診断の方法として、第１の実施の形態では、たとえば、ＣＲＣ１６演算を利用する。ＣＲＣ１６演算では、プログラムコードを途中までチェックした場合、それまでのチェック結果を保存しておき、プログラムコードのチェックを再開した場合は、保存したチェック結果を初期値として使用することでチェックを継続して実行することが可能である。
【００３８】
ステップＳ１０において、ＣＰＵ１０１は、「開始アドレス」から自己診断を実行し、ＲＡＭ１０３の領域１０３ｅに記憶された「分割サイズ」で指定されたサイズ分のプログラムコード自己診断処理を実行後、終了する。たとえば、１回の自己診断で実施するプログラムコード自己診断対象のデータサイズを６４Ｋバイトとした場合、全プログラムコード領域に対する自己診断は、４回、つまり診断開始後、４コマンド目の処理時点で終了する。
【００３９】
ステップＳ１１において、ＣＰＵ１０１は、プログラムコードの最終アドレスまで自己診断が終了したかをチェックする。このチェックの結果、ＲＯＭ１０４の最終アドレスまで自己診断が終了している場合、ステップＳ１２において、ＣＰＵ１０１は、算出されたチェックコードと、あらかじめＲＯＭ１０４のプログラムコードに格納されたチェックコード期待値とを比較する。
【００４０】
ステップＳ１２の比較の結果、両者の値が一致（自己診断成功）した場合（ステップＳ１３  Ｙｅｓ）、ステップＳ１４において、ＣＰＵ１０１は、全てのプログラムコードが正しい値を保持している、即ちプログラムコードが壊れたり、改竄されたりしていない、と判断する。そしてＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグを「終了（正常）」に設定し、ステップＳ１５へ進む。
【００４１】
ステップＳ１２の比較の結果、両者の値が不一致の場合（ステップＳ１３  Ｎｏ）、ステップＳ１６において、ＣＰＵ１０１は、プログラムコード自体に何らかの問題があると判断する。そしてＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグを「終了（異常）」に設定し、ステップＳ２０へ進む。
【００４２】
ステップＳ１１のチェックの結果、プログラムコードの最終アドレスまで自己診断が終了していない場合、ステップＳ１７において、ＣＰＵ１０１は、中間状態を保存するために、自己診断が終了した時点のアドレス（自己診断終了アドレス）、および、自己診断が終了した時点のチェックコード算出値をＲＡＭ１０３の領域１０３ｂ，１０３ｃに保存する。
【００４３】
ステップＳ１８において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグを「実施中」に設定し、ステップＳ１５へ進む。
【００４４】
ステップＳ５の判定の結果、自己診断結果フラグが「終了（正常）」を示していた場合、ＣＰＵ１０１は、ステップＳ６〜Ｓ１４，Ｓ１６〜Ｓ１８を実施せずにステップＳ１５へ進む。
【００４５】
ステップＳ１５において、ＣＰＵ１０１は、接触式カードリーダ・ライタ２ｂから受信したコマンドの処理を開始する。ステップＳ１９において、ＣＰＵ１０１は、コマンド処理実行後、その処理結果に応じたステータスワード（ＳＷ）を接触式カードリーダ・ライタ２ｂへ応答し、再びステップＳ４のコマンド受信待ち状態へ戻る。
【００４６】
以上説明したように上記第１の実施形態に係る動作によれば、ＩＣカード１の活性化後、接触式カードリーダ・ライタ２ｂから最初のコマンドを受信した場合に、プログラムコードのチェックコード算出を、ＲＯＭ１０４に格納されたプログラムコードの先頭アドレスから開始し、あらかじめＲＡＭ１０３に設定されたサイズまでのチェックコードを算出する。その時点で全プログラムコードのチェックコード算出が終了していない場合は、算出した中間のチェックコード、および、チェックコードの算出が終了した領域の最終チェック済アドレス情報をＲＡＭ１０３に一時保存する。その後に、コマンドの処理を実行しその結果を接触式カードリーダ・ライタ２ｂへ応答する。
【００４７】
さらに後続のコマンドを受信した場合に、前回一時保存した最終チェック済アドレスおよび中間チェックコードを用いて、チェックコード算出が終了していないプログラムコードの先頭アドレスから同様にチェックコード算出を継続する。
【００４８】
最終的に全てのプログラムコードについてチェックコード算出処理が終了した後で、あらかじめプログラムコード内に書込まれたチェックコード期待値と算出したチェックコードとを比較し、両者の値が一致した場合は、自己診断終了と判断して通常のコマンド処理結果を接触式カードリーダ・ライタ２ｂへ応答し、不一致の場合は、コマンド処理結果を破棄して、自己診断異常を意味するエラーコードを接触式カードリーダ・ライタ２ｂへ応答する。
【００４９】
このように、プログラムコードの自己診断を１つのコマンド処理内で全て実行するのではなく、複数のコマンド処理毎に分割して実行する。
【００５０】
〔第１の実施の形態のバリエーション１〕  
第１の実施の形態のバリエーションでは、図１に示すように、ＩＣカード１が複数の通信手段（通信インターフェース）を持つ場合の処理について説明する。
【００５１】
図６は、第１の実施の形態のバリエーション１に係る自己診断処理手順の一部を示すフローチャートである。図６に示す処理は、図４のステップＳ５の処理に対応する。
【００５２】
コマンドを受信すると、ステップＳ５１において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグの状態をチェックし、「終了（異常）」かどうかを判断する。
【００５３】
自己診断結果フラグが「終了（異常）」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップＳ２０の処理を実行する。
【００５４】
自己診断結果フラグが「終了（異常）」を示していない場合、ステップＳ５２において、受信したコマンドが所定の通信インターフェースを介して取得されたかどうかを調べる。通信インターフェースには、上述のように「非接触通信インターフェース」、「接触通信インターフェース」などがあり、それぞれ通信する情報の種類が異なる。また、「接触通信インターフェース」であっても、「ＵＳＢ」、「ＳＷＰ」などがあり同様に通信する情報の種類が異なる。従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とが通信インターフェースによって識別できる場合は、対象通信インターフェースから取得したコマンドは、コマンド処理に長時間を要しても良い処理であると判断することができる。そして、コマンド処理に長時間を要しても良い処理である場合には、自己診断処理を実行する。
【００５５】
従って、対象通信インターフェースからのコマンドでない場合（ステップＳ５２  Ｎｏ）は、自己診断処理を実行せず、ステップＳ１５において、ＣＰＵ１０１は、受信したコマンドの処理を開始する。
【００５６】
対象通信インターフェースからのコマンドである場合（ステップＳ５２  Ｙｅｓ）は、ステップＳ５３において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグの状態をチェックし、「終了（正常）」かどうかを判断する。
【００５７】
自己診断結果フラグが「終了（正常）」を示していた場合、ステップＳ１５において、ＣＰＵ１０１は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了（正常）」を示していなかった場合、ステップＳ６において、ＣＰＵ１０１は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【００５８】
上述のようにバリエーション１に係る形態では、特定の通信手段経由で受信したコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、他の通信手段経由で受信したコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【００５９】
〔第１の実施の形態のバリエーション２〕  
図７は、第１の実施の形態のバリエーション２に係る自己診断処理手順の一部を示すフローチャートである。図７に示す処理は、図４のステップＳ５の処理に対応する。
【００６０】
コマンドを受信すると、ステップＳ５１において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグの状態をチェックし、「終了（異常）」かどうかを判断する。
【００６１】
自己診断結果フラグが「終了（異常）」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップＳ２０の処理を実行する。  
自己診断結果フラグが「終了（異常）」を示していない場合、ステップＳ５４において、受信したコマンドが対象チャンネルからのものかどうかを調べる。
【００６２】
図８は、第１の実施の形態のバリエーション２に係るリーダライタ用コマンドの概略のフォーマットを示す図である。
【００６３】
図８は、リーダライタ用コマンドにおけるコマンドブロック内のＤＡＴ部のフォーマットである。このフォーマットの項目「ＣＬＡ」（コマンドの層別）には、チャンネルの指定が０〜３の値で記載されている。例えば、チャネル指定が０のときは、チャネル０：携帯電話の３Ｇアプリを指定し、チャネル指定が１のときは、チャネル１：クレジットアプリを指定する。
【００６４】
従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とがチャネルによって識別できる場合は、対象チャネルから取得したコマンドは、コマンド処理に長時間を要しても良い処理であると判断することができる。
【００６５】
従って、対象チャネルから取得したコマンドでない場合（ステップＳ５４  Ｎｏ）は、自己診断処理を実行せず、ステップＳ１５において、ＣＰＵ１０１は、受信したコマンドの処理を開始する。
【００６６】
対象チャネルから取得したコマンドである場合（ステップＳ５４  Ｙｅｓ）は、ステップＳ５３において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグの状態をチェックし、「終了（正常）」かどうかを判断する。
【００６７】
自己診断結果フラグが「終了（正常）」を示していた場合、ステップＳ１５において、ＣＰＵ１０１は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了（正常）」を示していなかった場合、ステップＳ６において、ＣＰＵ１０１は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【００６８】
上述のようにバリエーション２に係る形態では、当該ＩＣカードが、ＩＳＯ／ＩＥＣ７８１６−４に規定される論理チャネルを少なくとも２つ以上持つ場合において、特定の論理チャネル経由で受信したコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、他の論理チャネル経由で受信したコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【００６９】
〔第１の実施の形態のバリエーション３〕  
図９は、第１の実施の形態のバリエーション３に係る自己診断処理手順の一部を示すフローチャートである。図９に示す処理は、図４のステップＳ５の処理に対応する。
【００７０】
コマンドを受信すると、ステップＳ５１において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグの状態をチェックし、「終了（異常）」かどうかを判断する。
【００７１】
自己診断結果フラグが「終了（異常）」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップＳ２０の処理を実行する。  
自己診断結果フラグが「終了（異常）」を示していない場合、ステップＳ５４において、受信したコマンドが対象とするコマンドかどうかを調べる。
【００７２】
対象とするコマンドとは、コマンド処理に長時間を要するものである。例えば、ファイルのアクセスが含まれている処理が該当する。このようなコマンド処理を行なう場合は、それに併せて自己診断処理を実行した場合であっても、コマンド処理においてタイムアウトなどの不具合を発生させることを回避することができる。
【００７３】
従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とがコマンド名によって識別できる場合は、取得したコマンド名から、コマンド処理に長時間を要しても良い処理であると判断することができる。
【００７４】
従って、取得したコマンドが対象コマンドでない場合（ステップＳ５５  Ｎｏ）は、自己診断処理を実行せずに、ステップＳ１５において、ＣＰＵ１０１は、受信したコマンドの処理を開始する。
【００７５】
取得したコマンドが対象コマンドである場合（ステップＳ５５  Ｙｅｓ）は、ステップＳ５３において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグの状態をチェックし、「終了（正常）」かどうかを判断する。
【００７６】
自己診断結果フラグが「終了（正常）」を示していた場合、ステップＳ１５において、ＣＰＵ１０１は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了（正常）」を示していなかった場合、ステップＳ６において、ＣＰＵ１０１は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【００７７】
上述のようにバリエーション３に係る形態では、当該ＩＣカードが、特定のコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、その他のコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【００７８】
〔第１の実施の形態のバリエーション４〕  
図１０は、第１の実施の形態のバリエーション４に係る自己診断処理手順の一部を示すフローチャートである。図１０に示す処理は、図４のステップＳ６〜Ｓ１０の処理に対応する。バリエーション４に係る形態では、自己診断の分割数を指定したコマンドを外部装置から受信する。
【００７９】
ステップＳ６において、ＣＰＵ１０１は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、ＣＰＵ１０１は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。
【００８０】
ステップＳ６の判定の結果、自己診断結果フラグが、「未実施」を示していた場合、ＣＰＵ１０１は、ステップＳ７において、初回の自己診断を開始するために、自己診断処理に受け渡すパラメータである「開始アドレス」、「チェックコード算出値」を設定する。なお、「開始アドレス」、「チェックコード算出値」は初期値である。そして、ステップＳ５６の処理を実行する。
【００８１】
ステップＳ６の判定の結果、自己診断結果フラグが、「実施中」を示していた場合、ＣＰＵ１０１は、今回の処理で自己診断を再開するために、前回コマンドで行なった自己診断の中間情報をＲＡＭ１０３から復帰する。
【００８２】
すなわち、ステップＳ８において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ｃに記憶されている中間結果のチェックコード算出値をセットする。ステップＳ９において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ｂに記憶されている自己診断終了アドレスに「＋１」した値を自己診断開始アドレスにセットする。そして、ステップＳ５６の処理を実行する。
【００８３】
ステップＳ５６において、ＣＰＵ１０１は、取得したコマンドが、自己診断をいくつの回数Ｎに分割して実行するか、を指定する専用のコマンドかどうかを調べる。  
専用のコマンドでない場合は、ステップＳ１０の自己診断処理を実行する。  
専用のコマンドである場合は、ステップＳ５７において、ＣＰＵ１０１は、分割した１回当たりにチェックするプログラムコードのサイズを求め、領域１０３ｅの「分割サイズ」にセットする。１回当たりにチェックするプログラムコードのサイズＳは、プログラムコードの全サイズＴ、分割数Ｎを用いて次の式（１）で表される。
【００８４】
Ｓ＝［Ｔ／Ｎ］＋１            ・・・式（１）  
ここで、演算［  ］は、演算結果の小数点以下を切り捨てて整数値とするガウスの記号である。なお、演算結果が割り切れて整数値となる場合は、次の式（２）で表される。
【００８５】
Ｓ＝［Ｔ／Ｎ］                ・・・式（２）
ステップＳ１０において、ＣＰＵ１０１は、ＲＯＭ１０４内のプログラムコードに対する自己診断を実行する。この自己診断では、上記セットされた「開始アドレス」、「チェックコード算出値」を用いる。また、領域１０３ｅの「分割サイズ」で表されるサイズだけのコードをチェックする。
【００８６】
なお、ステップＳ５７において、コマンド処理を行なったため、図５のステップＳ１５に示すコマンド処理は実行しない。
【００８７】
上述のようにバリエーション４に係る形態では、分割数を指定した専用のコマンドを受信した場合に、プログラム領域のサイズおよび指定された分割数から、1つのコマンドを受信した際に行うべきチェックコード算出サイズを決定する。従って、適切な分割数で自己診断を行なうことができるため、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【００８８】
〔第２の実施の形態〕  
図１１は、第２の実施の形態の自己診断処理手順の一部を示すフローチャートである。図１１に示す処理では、ステップＳ３５の処理が第１の実施の形態と異なっている。第１の実施の形態と同一の部位には同一の符号を付してその詳細の説明は省略する。
【００８９】
ステップＳ３１〜Ｓ３４の処理は、第１の実施の形態のステップＳ１〜Ｓ４の処理と同じであるためその説明は省略する。
【００９０】
ステップ３５において、ＣＰＵ１０１は、ＲＡＭ１０３の領域１０３ａに記憶されている自己診断結果フラグの状態をチェックし、「終了（異常）」かどうかを判定する。
【００９１】
ステップＳ３５の判定の結果、自己診断結果フラグが「終了（異常）」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。この後の処理は第１の実施の形態と同一であるため詳細の説明は省略する。
【００９２】
ステップＳ５の判定の結果、自己診断結果フラグが「終了（異常）」でない場合、ステップＳ３６において、ＣＰＵ１０１は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、ＣＰＵ１０１は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。この後の処理は第１の実施の形態と同一であるため詳細の説明は省略する。
【００９３】
この第２の実施の形態によれば、ステップＳ３５では、第１の実施の形態と異なって自己診断結果フラグの状態が「終了（正常）」かどうかを判断していない。従って、自己診断結果フラグの状態が「終了（異常）」でなければ、自己診断が終了した後も、後続するコマンドを受信したときに新たに自己診断を開始する。
【００９４】
第１の実施の形態では、コマンドを受信するごとに分割して自己診断を実施することができるため、コマンド処理において不具合が発生することを回避することができ、ＩＣカードの信頼度を維持向上することができる。
【００９５】
〔第２の実施の形態のバリエーション〕  
第２の実施の形態のバリエーションの形態では、自己診断が終了した後に、所定数のコマンドを受信する毎に自己診断を再度実行する。
【００９６】
この動作は次のようにして実現することができる。例えば、自己診断が終了したときは、領域１０３ｄのコマンドカウンタの値を０にリセットする。そして、以降コマンドを受信するごとにこのコマンドカウンタの値を＋１カウントアップする。そしてコマンドカウンタの値が所定の値Ｃ以上であるときに再度分割した自己診断の実行を制御する。この動作を繰り返すことで、コマンドを所定数Ｃだけ受取るごとに自己診断を実施することができる。なお、上述の第２の実施の形態は、所定の値Ｃ＝１の場合に相当する。
【００９７】
なお、上述の各実施の形態で説明した機能は、ハードウェアを用いて構成するに留まらず、ソフトウェアを用いて各機能を記載したプログラムをコンピュータに読み込ませて実現することもできる。また、各機能は、適宜ソフトウェア、ハードウェアのいずれかを選択して構成するものであっても良い。
【００９８】
尚、本発明は、上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。  
上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に亘る構成要素を適宜組み合せてもよい。
【００９９】
例えば、第１の実施の形態、第２の実施の形態、及びそれぞれのバリエーションの形態を適宜組み合わせて構成することができる。
【符号の説明】
【０１００】
１…ＩＣカード、１ａ…ＩＣカード本体、２ａ…非接触式カードリーダ・ライタ、２ｂ…接触式カードリーダ・ライタ、２…ＩＣカード、１１…ＩＣモジュール、１２…ＩＣチップ、１３ａ…非接触通信部、１３ｂ…接触端子、１０１…ＣＰＵ、１０２…データメモリ、１０３…ＲＡＭ、１０３ａ〜１０３ｅ…領域、１０４…ＲＯＭ、１０５ａ…非接触通信インターフェース、１０５ｂ．１０５ｃ…接触通信インターフェース。
【図１】
2013011988.tif 000003
【図２】
2013011988.tif 000004
【図３】
2013011988.tif 000005
【図４】
2013011988.tif 000006
【図５】
2013011988.tif 000007
【図６】
2013011988.tif 000008
【図７】
2013011988.tif 000009
【図８】
2013011988.tif 000010
【図９】
2013011988.tif 000011
【図１０】
2013011988.tif 000012
【図１１】
2013011988.tif 000013