(57)【特許請求の範囲】
【請求項１】
アセンブリコードに変換したプログラムソースの中から、一定間隔で繰り返し実行する周期処理を埋め込むための分岐先を探索する分岐先探索部と、
前記分岐先に対し、前記周期処理と前記周期処理の実行を前記周期処理が前回実行されてからの経過時間で判定する判定処理を埋め込む第１のプログラム埋め込み部と、
を備えることを特徴とするプログラム埋め込み装置。
【請求項２】
前記分岐先探索部は、前記アセンブリコードに記述された命令のうち、特定の命令を分岐先として探索することを特徴とする請求項１に記載のプログラム埋め込み装置。
【請求項３】
前記分岐先探索部、前記分岐先探索部が探索した分岐先に対し、時刻を測定し経過時間をログに出力する処理を埋め込む第２のプログラム埋め込み部、を有する第１の周期処理埋め込み部と、
前記分岐先に対し、前記周期処理の実行を前記第１の周期処理埋め込み部が出力したプログラムを実行した結果得られる経過時間ログを参照し、前記周期処理を埋め込む位置を決定する位置決定部、前記位置決定部が決定した前記分岐先に、前記周期処理を埋め込む前記第１のプログラム埋め込み部、を有する第２の周期処理埋め込み部と、
を備えることを特徴とする請求項１または２に記載のプログラム埋め込み装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムに周期処理を埋め込む装置に関するものである。
【背景技術】
【０００２】
制御システムのような高い信頼性が要求されるシステムでは、システム内のＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）および実行中のアプリケーションの異常を検知するための手段としてＷＤＴ（Ｗａｔｃｈ  Ｄｏｇ  Ｔｉｍｅｒ）を用いて定期的に監視することが一般的である。
ＷＤＴとはハードウェア内部のタイマであり、所定の時間が経過（タイムアップ）すると、システムに異常が発生していると判断し、Ｈ／Ｗ（Ｈａｒｄ  Ｗａｒｅ）を強制的にリセットするという特徴を持つ。システムはリセットすることによって異常を回避することができる。
これに対し、システム内のＯＳおよび実行中のアプリケーションは、このＷＤＴがタイムアップする前にＷＤＴのカウントを設定し直す処理（周期処理）を一定の時間（周期時間）おきに実行する必要がある。
【０００３】
このような周期処理は、マイコンのタイマ割り込みを利用した割り込み処理ルーチンで実現するのが一般的である。しかし、ブートローダ起動時およびＯＳ起動の初期段階では、利用できるＨ／Ｗが制約されるため、周期処理をタイマ割り込みに依存した割り込み処理ルーチンで記述することができない。このため、通常時に実行するプログラム（メインプログラム）のソースコードに直接周期処理を埋め込む必要がある。
例えば、特許文献１では、ＣＰＵ資源の利用を制御するため、周期処理を関数呼出し単位、プログラム行、基本ブロックなどの間隔でプログラムのソースコードに埋め込む技術について開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１０−１３４４９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
従来のプログラム埋め込み装置は、関数呼出し単位、プログラム行、基本ブロックなどプログラムの記述内容に従った間隔で埋め込みを実現していた。しかし、プログラムの実行時間については考慮されていないため、埋め込まれたプログラムが過度に実行する、もしくは周期時間内に実行できないといった課題がある。
【０００６】
本発明は、上記のような課題を解決するためのものであり、プログラムの実行時間を計測しつつ周期時間内に周期処理を実行するよう、ソースコードへ周期処理実行命令の埋め込みを実現することを目的とする。
【課題を解決するための手段】
【０００７】
本発明のプログラム埋め込み装置は、アセンブリコードに変換したプログラムソースの中から、一定間隔で繰り返し実行する周期処理を埋め込むための分岐先を探索する分岐先探索部と、前記分岐先に対し、前記周期処理と前記周期処理の実行を前記周期処理が前回実行されてからの経過時間で判定する判定処理を埋め込む第１のプログラム埋め込み部とを備える。
【発明の効果】
【０００８】
本発明によれば、タイマ割り込みが利用できない状況においても、周期処理を周期時間に間に合う間隔で実行できるよう、周期処理をプログラムに埋め込むことが可能となる。
【図面の簡単な説明】
【０００９】
【図１】この発明の実施の形態１におけるシステム構成の一例を示す図である。
【図２】この発明の実施の形態１におけるプログラム埋め込み装置２０および実行用装置３０のハードウェア構成の一例を示す図である。
【図３】この発明の実施の形態１におけるプログラム埋め込み装置２０上で動作するソフトウェアの全体構成図である。
【図４】この発明の実施の形態１における埋め込み用周期処理コード２２の一例を示す図である。
【図５】この発明の実施の形態１における埋め込み用周期処理コード２２の埋め込みを完了した後のアセンブリコードの一例を示す図である。
【図６】この発明の実施の形態１におけるプログラム埋め込み装置２０の動作を示すフローチャートである。
【図７】この発明の実施の形態１における経過時間計測処理コード２２０の動作を示すフローチャートである。
【図８】この発明の実施の形態２におけるシステム構成の一例を示す図である。
【図９】この発明の実施の形態２におけるプログラム埋め込み装置２０が第１の動作を行う場合のシステム構成を示す図である。
【図１０】この発明の実施の形態２における実行用装置３０上で動作を行う場合のシステム構成を示す図である。
【図１１】この発明の実施の形態２におけるプログラム埋め込み装置２０が第２の動作を行う場合のシステム構成を示す図である。
【図１２】この発明の実施の形態２におけるプログラム埋め込み装置２０上で動作するソフトウェアの全体構成図である。
【図１３】この発明の実施の形態２におけるプログラム埋め込み装置２０上で動作するソフトウェアのうち、第１の動作を行う場合に着目したソフトウェア構成図である。
【図１４】この発明の実施の形態２におけるプログラム埋め込み装置２０上で動作するソフトウェアのうち、第２の動作を行う場合に着目したソフトウェア構成図である。
【図１５】この発明の実施の形態２における埋め込み用周期処理コード２７の一例を示す図である。
【図１６】この発明の実施の形態２におけるプログラム埋め込み装置２０の第１の動作を説明するフロー図である。
【図１７】この発明の実施の形態２における埋め込み用時間計測処理コード２４の動作を説明するフロー図である。
【図１８】この発明の実施の形態２における経過時間ログ２６の一例を示す図である。
【図１９】この発明の実施の形態２におけるプログラム埋め込み装置２０の第２の動作を説明するフロー図である。
【図２０】この発明の実施の形態２における埋め込み位置記録テーブルの一例を示す図である。
【図２１】この発明の実施の形態２における複数回目用埋め込み用周期処理コードの一例を示す図である。
【図２２】この発明の実施の形態２における埋め込み位置決定部２０６０の動作を説明するフロー図である。
【図２３】この発明の実施の形態３におけるシステム構成の一例を示す図である。
【図２４】この発明の実施の形態３におけるプログラム埋め込み装置２０上で動作するソフトウェアの全体構成図である。
【図２５】この発明の実施の形態３における命令実行クロック数一覧２９の一例を示す図である。
【図２６】この発明の実施の形態３におけるプログラム埋め込み装置２０の動作を示すフローチャートである。
【発明を実施するための形態】
【００１０】
実施の形態１．
図１は、本実施の形態におけるシステム構成図の一例である。本実施の形態におけるシステムでは、開発用装置１０、プログラム埋め込み装置２０、実行用装置３０で構成される。
なお、開発用装置１０からプログラム埋め込み装置２０に対し、メインプログラムのソースコード２１および埋め込み用周期処理コード２２が渡され、プログラム埋め込み装置２０から実行用装置３０に対し、周期処理埋め込みバイナリ２３が渡される。
【００１１】
開発用装置１０は、実行用装置３０上で動作するプログラムを開発するための装置である。開発用装置１０で開発されたメインプログラムのソースコード２１と埋め込み用周期処理コード２２が、プログラム埋め込み装置２０に渡される。
【００１２】
メインプログラムのソースコード２１は、実行用装置３０上で動作させたいプログラムのソースコードである。また、メインプログラムのソースコード２１は、ＣやＣ＋＋などのコンパイル可能なプログラミング言語で記述されたものであり、複数のファイルから構成されていてもよい。
【００１３】
埋め込み用周期処理コード２２は、本来、実行用装置３０上でタイマ割り込みを使用することができた場合に実行する周期処理プログラムのアセンブリコードである。埋め込み用周期処理コード２２は、周期処理及び、前記周期処理を周期的に実行するためのプログラムのアセンブリコードで構成される。
埋め込み用周期処理コード２２はアセンブリコードであるが、メインプログラムのソースコード２１と同様、ＣやＣ＋＋などのコンパイル可能なプログラミング言語で記述されたものであっても良い。しかし、その場合は以降で説明するアセンブリコード変換部２０１により、埋め込み前にアセンブリコードに変換する必要がある。
【００１４】
プログラム埋め込み装置２０は、開発用装置１０から受け取ったメインプログラムのソースコード２１と埋め込み用周期処理コード２２から周期処理埋め込みバイナリ２３を生成し、実行用装置３０に渡す。
【００１５】
実行用装置３０は、プログラム埋め込み装置２０から渡された周期処理埋め込みバイナリ２３を実行する。
【００１６】
なお、本実施の形態では、開発用装置１０とプログラム埋め込み装置２０を別の装置として説明をしたが、同一の装置上で、メインプログラムのソースコード２１と埋め込み用周期処理コード２２の開発および、周期処理埋め込みバイナリ２３の生成を行っても良い。
【００１７】
図２は、本実施の形態における、プログラム埋め込み装置２０および実行用装置３０のハードウェア構成図の一例である。なお、プログラム埋め込み装置２０および実行用装置３０のハードウェア構成は、いずれかもしくはどちらも図２に示す構成と異なる構成であっても構わない。
【００１８】
図２において、プログラム埋め込み装置２０および実行用装置３０は、プログラムを実行するＣＰＵ１（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｏｒ  Ｕｎｉｔ）、プログラムやデータを記憶するＲＯＭ２（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、プログラムが使用・参照できるよう一時的にデータを記憶するＲＡＭ３（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）に加え、開発用装置１０、プログラム埋め込み装置２０、実行用装置３０との間でファイルのやりとりを行うための通信モジュール４、時刻やプログラムの実行時間、デバイス７への出力タイミングなどを計測するタイマ５など複数のハードウェアを備えている。
【００１９】
ＲＯＭ２は、プログラムや固定データを格納する領域を提供する。フラッシュメモリなどが相当し、書き込まれたプログラム内容を書き換えることが可能である。
ＲＡＭ３は、プログラムが使用するデータを保存及び参照するための作業領域を提供する。
【００２０】
通信モジュール４は、ネットワークを通じて、開発用装置１０、プログラム埋め込み装置２０、実行用装置３０との間でファイルの受け渡しを行う。なお、本実施の形態では、通信モジュール４を用いたハードウェア構成の一例を示したが、通信モジュール４を用いず、例えば、開発用装置１０、プログラム埋め込み装置２０、実行用装置３０との間でＭＴ（磁気テープ）、ＦＤ（フレキシブルディスク）などのメディア媒体で受け渡しを行ってもよい。
タイマ５は、時刻のほか、周期処理を実行するタイミングなどを計測する。
【００２１】
図３は、実施の形態１におけるプログラム埋め込み装置２０上で動作するソフトウェアの全体構成図である。これらのソフトウェアは、プログラム埋め込み装置２０のＲＯＭ２またはＲＡＭ３上に記憶され、ＣＰＵ１により実行される。
【００２２】
図３において、プログラム埋め込み装置２０は、プログラミング言語で記述されたソースコードをアセンブリコードに変換するアセンブリコード変換部２０１と、埋め込み用周期処理コード２２をアセンブリレベルでメインプログラムへ埋め込む周期処理埋め込み部２０２と、周期処理の埋め込みが完了したアセンブリコードをＣＰＵ１で実行可能なオブジェクトコードに変換するオブジェクトコード変換部２０３と、オブジェクトコード（複数でもよい）との共有とライブラリとを結合するバイナリ変換部２０４を備えている。
なお、周期処理埋め込み部２０２は、アセンブリコードの中から分岐先ラベルを探索する分岐先ラベル探索部（分岐先探索部）２０２０と、埋め込み用周期処理コード２２をアセンブリコードへ埋め込む処理を行うプログラム埋め込み部（第１のプログラム埋め込み部）２０２１を備えている。
【００２３】
プログラム埋め込み装置２０上で動作するソフトウェアの詳細について説明する。
【００２４】
アセンブリコード変換部２０１は、開発用装置１０からメインプログラムのソースコード２１を受け取り、アセンブリコードに変換を行う。アセンブリコード変換部２０１は、変換したアセンブリコードを周期処理埋め込み部２０２に渡す。
【００２５】
周期処理埋め込み部２０２は、アセンブリコード変換部２０１からメインプログラムのアセンブリコードを受け取り、分岐先ラベル探索部２０２０で、周期処理コードを埋め込む位置を決定する。分岐先ラベル探索部２０２０は、例えば、アセンブリコードで使用されている全てのラベルの探索を行う。
なお、本実施の形態では、ラベルを埋め込み箇所としているが、例えば、条件分岐命令があった箇所を分岐先ラベルの埋め込み箇所としても良い。条件分岐命令があった箇所を分岐先ラベルの埋め込み箇所とした場合、アセンブリコードの中から条件分岐命令の探索を行う。分岐先として探索するラベルは、一つだけとしても良いし、複数の組み合わせ、例えば「条件分岐命令と加算命令」のような組み合わせであってもよい。
【００２６】
プログラム埋め込み部２０２１は、分岐先ラベル探索部２０２０が決定した埋め込む位置に、埋め込み用周期処理コード２２を埋め込む。図４を用いて、埋め込まれるアセンブリコードについて詳しく説明する。
【００２７】
図４は、埋め込み用周期処理コード２２の一例を示す図である。埋め込み用周期処理コード２２は、経過時間計測処理コード（判定処理）２２０と周期処理コード２２１を備える。
【００２８】
経過時間計測処理コード２２０は、現在の時刻を獲得し、同処理コードが前回呼び出された際の時刻との差分から経過時間を計測し、予め設定した時間を経過していた場合、周期処理を呼び出す処理が記述されたアセンブリコードである。
例えば、周期時間が１０ミリ秒の周期処理であった場合、周期処理が前回実行した時刻から８ミリ秒経過していた場合、周期処理を実行し、現在の時刻を記録する。次に経過時間計測処理コード２２０が呼び出された際には、この記録された時刻が、前回の時刻となる。
【００２９】
周期処理コード２２１は、周期処理を行うアセンブリコードである。本実施の形態では、周期処理コード２２１を開発用装置１０で開発し、プログラム埋め込み装置２０へ渡す構成で説明を行ったが、周期処理コード２２１を予めオブジェクトコードで提供しておき、バイナリ変換部２０４でバイナリ変換を行う際、同時に行ってもよい。
このような埋め込み用周期処理コード２２の場合、前述したプログラム埋め込み部２０２１は、分岐先ラベル探索部２０２０が決定した埋め込む位置に、経過時間計測処理コード２２０と周期処理コード２２１を埋め込む。
【００３０】
なお、周期処理コード２２１は、全ての位置に経過時間計測処理コード２２０と同時に埋め込んでもよいし、一か所だけ関数として埋め込み、経過時間計測処理コード２２０から呼び出すようにしても良い。前者の全ての位置に埋め込む方法であれば、処理速度を向上でき、後者の一か所だけ関数として埋め込む方法だと、メモリを節約できる。
また、関数呼び出しとした場合、アセンブリコードとして周期処理コード２２１を用いるのではなく、オブジェクトコードとして用い（図示せず）、実行バイナリへ変換する際、一緒に変換しても良い。埋め込み用周期処理コード２２の埋め込みを完了した後のアセンブリコードの一例を図５に示す。
【００３１】
オブジェクトコード変換部２０３は、周期処理埋め込み部２０２から、埋め込み用周期処理コード２２の埋め込みを完了した後のアセンブリコードを受け取り、オブジェクトコードへの変換を行う。
オブジェクトコード変換部２０３は、変換したオブジェクトコードをバイナリ変換部２０４に渡す。
【００３２】
バイナリ変換部２０４は、オブジェクトコード変換部２０３からオブジェクトコードを受け取り、実行用装置３０上で実行が可能なバイナリ、周期処理埋め込みバイナリ２３への変換を行う。
バイナリ変換部２０４は、変換した周期処理埋め込みバイナリ２３を実行用装置３０へ渡す。
【００３３】
周期処理埋め込みバイナリ２３は、実行用装置３０上のＲＯＭ２またはＲＡＭ３に記憶され、実行用装置３０上のＣＰＵ１が実行するソフトウェアである。実行用装置３０上のＣＰＵ１は、周期処理埋め込みバイナリ２３を実行する際、分岐先ラベルを通過する度に経過時間計測処理コードを実行し、予め設定された周期時間が経過したか否かを判定する。例えば８割以上経過していた場合、実行用装置３０上のＣＰＵ１は、周期処理コードを実行する。
【００３４】
次に図６を用いて、本実施の形態におけるプログラム埋め込み装置２０の動作について説明する。なお、本実施の形態では、周期処理が一周経過する時間（周期時間）の間に分岐先ラベルを複数回通過すると仮定し、周期処理を埋め込む位置を分岐先ラベルの先頭に設定している。
【００３５】
まず、アセンブリコード変換部２０１が、開発用装置１０から受け取ったメインプログラムのソースコード２１をアセンブリコードに変換する（Ｓ１０１）。メインプログラムのソースコード２１をアセンブリコードに変換する方法は、例えば、ｇｃｃ（ＧＮＵ  Ｃ  Ｃｏｍｐｉｌｅｒ）を用いた場合であれば、オプション“Ｓ”を設定することによって、行っても良い。
【００３６】
アセンブリコード変換部２０１は、変換したアセンブリコードを周期処理埋め込み部２０２に渡す。
次に、分岐先ラベル探索部２０２０が、アセンブリコード変換部２０１から受け取ったアセンブリコードの先頭から１行ずつ読み込み（Ｓ１０２）、分岐先ラベルが記述されているかを判定する（Ｓ１０３）。
【００３７】
分岐先ラベルが記述されていなかった場合（Ｓ１０３：ＮＯ）、分岐先ラベル探索部２０２０は、現在読み込んだ１行が、アセンブリコードの終端であるかを確認する（Ｓ１０５）。
一方、分岐先ラベルが記述されていた場合（Ｓ１０３：ＹＥＳ）、分岐先ラベル探索部２０２０は、プログラム埋め込み部２０２１を呼び出す。
【００３８】
プログラム埋め込み部２０２１は、分岐先ラベル探索部２０２０が読み込んだ行の次の行へ、経過時間計測処理コード２２０を埋め込む（Ｓ１０４）。
次に分岐先ラベル探索部２０２０は、現在読み込んだ１行が、アセンブリコードの終端であるかを確認する（Ｓ１０５）。
【００３９】
アセンブリコードの終端ではなかった場合（Ｓ１０５：ＮＯ）、分岐先ラベル探索部２０２０は、アセンブリコードの１行読み込み（Ｓ１０２）を再度実行し、次の１行を読み込む。
アセンブリコードの終端であった場合（Ｓ１０５：ＹＥＳ）、分岐先ラベル探索部２０２０は、プログラム埋め込み部２０２１を呼び出す。
【００４０】
プログラム埋め込み部２０２１は、周期処理コード２２１をアセンブリコードに埋め込む（Ｓ１０６）。周期処理コード２２１を埋め込む位置はアセンブリコード内のどこでもよい。また、本実施の形態では、分岐先ラベルを抽出する処理の後に周期処理コード２２１を埋め込んだが、分岐先ラベルを抽出する前に行っても良い。
【００４１】
次にオブジェクトコード変換部２０３は、周期処理埋め込み部２０２が出力した埋め込み完了後アセンブリコードを、バイナリ形式であるオブジェクトコードに変換する（Ｓ１０７）。なお、本実施の形態では、周期処理コード２２１を埋め込み完了後アセンブリコードの一部となるよう埋め込んだが、埋め込み完了後アセンブリコードとは別のファイルとし、埋め込み完了後アセンブリコードとは別にオブジェクトコードに変換しても良い。
【００４２】
最後にバイナリ変換部２０４が、オブジェクトコード（複数でもよい）と共有ライブラリを結合し、実行用装置上のＣＰＵ１で実行可能な形式である周期処理埋め込みバイナリ２３を出力する。
【００４３】
次に図７を用いて、周期処理埋め込みバイナリ２３に埋め込まれた経過時間計測処理コード２２０の動作について説明する。なお、周期処理埋め込みバイナリ２３は、実行用装置３０上のＲＯＭ２またはＲＡＭ３上に記憶され、実行用装置３０上のＣＰＵ１により実行される。周期処理埋め込みバイナリ２３に埋め込まれた経過時間計測処理コード２２０が参照するタイマ５も、実行用装置３０上のものである。
【００４４】
経過時間計測処理コード２２０は、タイマ５の値を読み込み、周期処理コード２２１が前回実行された時間との差分を計算する（Ｓ２０１）。
なお、本実施の形態では、タイマ５の初期値は０であり、周期処理埋め込みバイナリ２３の実行開始と同時にカウントを開始していることを前提とする。つまり、経過時間計測処理コード２２０が読み込んだタイマ５の値は、前回周期処理コード２２１を実行してからの経過時間（差分）となる。
【００４５】
次に、経過時間計測処理コード２２０は、Ｓ２０１にて算出した差分が周期時間の８割以上であるかを判定する（Ｓ２０２）。なお、本実施の形態では、周期処理を周期時間内に確実に実行することを目的としているため、周期処理の実行条件を周期時間の８割経過時と定義としたが、周期時間を越えなければ特に８割以外であってもよい。
【００４６】
判定した結果、８割以上であった場合（Ｓ２０２：ＹＥＳ）、経過時間計測処理コード２２０は、周期処理コード２２１を呼び出す（Ｓ２０３）。
経過時間計測処理コード２２０は、周期処理コード２２１を呼び出した後、現在のタイマ５のカウント値を前回実行時の値として記録（更新）する（Ｓ２０４）。
【００４７】
判定した結果８割未満であった場合（Ｓ２０２：ＮＯ）、経過時間計測処理コード２２０は、何もせずに終了する。
【００４８】
以上のように、メインプログラムのソースコード２１を変換したアセンブリコードの中から分岐先ラベルを探索する分岐先ラベル探索部２０２０と、埋め込み用周期処理コード２２をアセンブリコードへ埋め込む処理を行うプログラム埋め込み部２０２１を備えることにより、タイマ割り込みを利用せずとも周期処理を実行するバイナリ（周期処理埋め込みバイナリ２３）を生成することが可能となる。
【００４９】
また、周期処理埋め込みバイナリ２３を実行用装置３０上で実行する際には、タイマ５のカウント値を確認しながら周期処理コード２２１を実行するか否かを判断するため、周期処理コード２２１の実行を必要最低限に留めることが可能となる。
【００５０】
さらに、タイマ５のカウント値を確認しながら周期処理コード２２１を実行するか否かを判断しているため、メインプログラムのソースコード２１の内容が変化した場合でも、確実に周期処理を周期時間内に実行することが可能である。
【００５１】
実施の形態２．
実施の形態１では、メインプログラムのソースコード２１を変換したアセンブリコードの中から分岐先ラベルを探索する分岐先ラベル探索部２０２０と、埋め込み用周期処理コード２２をアセンブリコードへ埋め込む処理を行うプログラム埋め込み部２０２１を備えることにより、実行用装置３０上で、タイマ割り込みを利用せずとも周期処理を実行するバイナリを生成するプログラム埋め込み装置２０について述べた。
実施の形態１で生成されたバイナリ（周期処理埋め込みバイナリ２３）は、全ての分岐先ラベルの通過時に、周期処理を実行するか否かの判定を行っている。
本実施の形態では、実行用装置３０で予めメインプログラムを実行しておき、各分岐先ラベルで計測した経過時間のログから周期処理が周期時間内に実行するために必要な分岐先ラベルの通過時のみ、周期処理の実行命令を埋め込むプログラム埋め込み装置２０について述べる。
図８は、本実施の形態におけるシステムの構成図の一例である。本実施の形態におけるシステムでは、開発用装置１０、プログラム埋め込み装置２０、実行用装置３０で構成される。
開発用装置１０からプログラム埋め込み装置２０に対し、メインプログラムのソースコード２１、埋め込み用時間計測処理コード２４および埋め込み用周期処理コード２７が渡され、プログラム埋め込み装置２０から実行用装置３０に対し、測定用周期処理埋め込みバイナリ２５と周期処理埋め込みバイナリ２８が渡され、実行用装置３０からプログラム埋め込み装置２０に対し、経過時間ログ２６が渡される。
なお、本実施の形態におけるプログラム埋め込み装置２０は、第１の動作と第２の動作の２種類の動作を順に行う。このため、図９〜１１を用いて、プログラム埋め込み装置２０が第１の動作を行う場合のシステム構成（図９）、第１の動作によって生成された測定用周期処理埋め込みバイナリ２５を受け取った実行用装置３０が動作を行う場合のシステム構成（図１０）、プログラム埋め込み装置２０が第２の動作を行う場合のシステム構成（図１１）について説明する。なお、図９〜１１において、それぞれの各動作に関係のない構成要素については点線とした。
【００５２】
図９は、プログラム埋め込み装置２０が第１の動作を行う場合のシステム構成図である。開発用装置１０は、実行用装置３０上で動作するプログラムを開発するための装置である。開発用装置１０で開発されたメインプログラムのソースコード２１と、埋め込み用時間計測処理コード２４は、プログラム埋め込み装置２０に渡される。
【００５３】
メインプログラムのソースコード２１は、実行用装置３０上で動作させたいプログラムのソースコードである。また、メインプログラムのソースコード２１は、ＣやＣ＋＋などのコンパイル可能なプログラミング言語で記述されたものであり、複数のファイルから構成されていてもよい。
【００５４】
埋め込み用時間計測処理コード２４は、プログラムの実行（経過）時間を記録するアセンブリコードである。
埋め込み用時間計測処理コード２４は、アセンブリコードであるが、メインプログラムのソースコード２１と同様、ＣやＣ＋＋などのコンパイル可能なプログラミング言語で記述されたものであっても良い。しかし、その場合はアセンブリコード変換部２０１により、埋め込み前にアセンブリコードに変換する必要がある。
第１の動作において、プログラム埋め込み装置２０は、開発用装置１０から受け取ったメインプログラムのソースコード２１と埋め込み用時間計測処理コード２４から測定用周期処理埋め込みバイナリ２５を生成し、実行用装置３０に渡す。
【００５５】
図１０は、プログラム埋め込み装置２０の第１の動作によって生成された測定用周期処理埋め込みバイナリ２５を受け取った実行用装置３０が動作を行う場合のシステム構成図である。実行用装置３０は、プログラム埋め込み装置２０から渡された測定用周期処理埋め込みバイナリ２５を実行し、経過時間ログ２６を出力する。実行用装置３０が出力した経過時間ログ２６は、プログラム埋め込み装置２０に渡される。
【００５６】
図１１は、プログラム埋め込み装置２０が第２の動作を行う場合のシステム構成図である。開発用装置１０で開発されたメインプログラムのソースコード２１と埋め込み用周期処理コード２７および、実行用装置３０が測定用周期処理埋め込みバイナリ２５を実行した結果出力した経過時間ログ２６がプログラム埋め込み装置２０に渡される。
【００５７】
埋め込み用周期処理コード２７は、本来、実行用装置３０上でタイマ割り込みを使用することができた場合に実行する周期処理プログラムのアセンブリコードである。埋め込み用周期処理コード２７は、周期処理及び、前期周期処理を実行するか否かを判定するためのプログラムのアセンブリコードで構成される。
埋め込み用周期処理コード２７はアセンブリコードであるが、メインプログラムのソースコード２１と同様、ＣやＣ＋＋などのコンパイル可能なプログラミング言語で記述されたものであっても良い。しかし、その場合はアセンブリコード変換部２０１により、埋め込み前にアセンブリコードに変換する必要がある。
第２の動作において、プログラム埋め込み装置２０は、開発用装置１０から受け取ったメインプログラムのソースコード２１と埋め込み用周期処理コード２７および、実行用装置３０から受け取った経過時間ログ２６から、周期処理埋め込みバイナリ２８を生成し、実行用装置３０に渡す。
【００５８】
図１２は、本実施の形態２におけるプログラム埋め込み装置２０上で動作するソフトウェアの全体構成図である。これらのソフトウェアは、プログラム埋め込み装置２０のＲＯＭ２またはＲＡＭ３上に記憶され、ＣＰＵ１により実行される。
【００５９】
図１２において、プログラム埋め込み装置２０は、プログラミング言語で記述されたソースコードをアセンブリコードに変換するアセンブリコード変換部２０１と、埋め込み用時間計測処理コード２４をアセンブリレベルでメインプログラムへ埋め込む第１の周期処理埋め込み部２０５と、経過時間ログ２６を参照しつつ、埋め込み用周期処理コード２７をアセンブリレベルでメインプログラムへ埋め込む第２の周期処理埋め込み部２０６と、埋め込み用時間計測処理コード２４もしくは埋め込み用周期処理コード２７の埋め込みが完了したアセンブリコードを（実行用装置３０上の）ＣＰＵ１で実行可能なオブジェクトコードに変換するオブジェクトコード変換部２０３と、オブジェクトコード（複数でもよい）との共有とライブラリとを結合するバイナリ変換部２０４を備えている。
【００６０】
なお、第１の周期処理埋め込み部２０５は、アセンブリコードの中から分岐先ラベルを探索する分岐先ラベル探索部２０２０と、埋め込み用時間計測処理コード２４をアセンブリコードへ埋め込む処理を行うプログラム埋め込み部（第２のプログラム埋め込み部）２０５０を備えており、第２の周期処理埋め込み部２０６は、経過時間ログ２６を参照し、アセンブリコードの中に埋め込み用周期処理コード２７を埋め込む位置を決定する埋め込み位置決定部２０６０と、埋め込み用周期処理コード２７をアセンブリコードへ埋め込む処理を行うプログラム埋め込み部２０２１を備えている。
【００６１】
前述したように、本実施の形態におけるプログラム埋め込み装置２０は、第１の動作と第２の動作の２種類の動作を順に行う。それぞれの動作に着目した場合のプログラム埋め込み装置２０上で動作するソフトウェアの全体構成図を図１３と図１４に示す。
本実施の形態では、２種類の周期処理埋め込み部から構成されており、実行動作に応じて処理を切り替える必要がある。処理の切替は、ソフトウェア実行時の引数などからプログラム埋め込み装置２０が経過時間ログ２６を受け取っているかどうかで判断させてもよい。また、経過時間ログ２６が入力された場合には、第２の周期処理埋め込み部２０６を実行するように判断しても良い。
【００６２】
図１３は、本実施の形態２におけるプログラム埋め込み装置２０上で動作するソフトウェアの全体構成のうち、第１の動作を行う場合に着目したソフトウェア構成図である。
図１３において、埋め込み用時間計測処理コード２４は、実行用装置３０上のタイマ５のカウント値、埋め込み用時間計測処理コード２４が埋め込まれたファイル名、および分岐先ラベルを記録する命令が記述されたアセンブリコードである。
プログラム埋め込み部２０５０は、入力されたコードに関わらず、分岐先ラベル探索部２０２０が決定した埋め込む位置への埋め込みを実現する。
【００６３】
図１４は、本実施の形態２におけるプログラム埋め込み装置２０上で動作するソフトウェアの全体構成のうち、第２の動作を行う場合に着目したソフトウェア構成図である。
図１４において、埋め込み位置決定部２０６０は、経過時間ログ２６を参照して周期処理を実行する分岐先ラベルの位置を決定するものである。また、ループ処理などの場合は、同じ分岐先ラベルを複数回通過することが想定されるため、埋め込み位置決定部２０６０は、周期処理を実行する分岐先ラベルと通過回数を含めて埋め込み位置を決定する。
【００６４】
図１５を用いて、埋め込み用周期処理コード２７を説明する。
埋め込み用周期処理コード２７は、分岐先ラベルが通過した回数を計測しながら周期処理の実行を判定する通過回数計測コード２７０、および周期処理コード２２１から構成される。
プログラム埋め込み部２０２１は、埋め込み位置決定部２０６０にて決定した位置にコードの埋め込みを行う。なお、通過回数が１回の場合には、周期処理コード２２１のみを埋め込み、複数回通過する場合には、通過回数計測コード２７０と併せて周期処理コード２２１を埋め込む。
【００６５】
第１、第２の動作に共通してオブジェクトコード変換部２０３は、埋め込みが完了したアセンブリコードを受け取り、オブジェクトコードへの変換を行う。
オブジェクトコード変換部２０３は、変換したオブジェクトコードをバイナリ変換部２０４に渡す。
バイナリ変換部２０４は、オブジェクトコード変換部２０３からオブジェクトコードを受け取り、実行用装置３０上で実行が可能なバイナリへの変換を行う。
第１の動作の際は、測定用周期処理埋め込みバイナリ２５へと変換し、第２の動作の際は、周期処理埋め込みバイナリ２８へと変換する。
【００６６】
測定用周期処理埋め込みバイナリ２５は、実行用装置３０上のＲＯＭ２またはＲＡＭ３に記憶され、実行用装置３０上のＣＰＵ１が実行するソフトウェアである。
実行用装置３０上のＣＰＵ１は、測定用周期処理埋め込みバイナリ２５を実行する際、分岐先ラベルを通過する度にタイマ５の値を記録し、メインプログラムの経過時間を測定する。
【００６７】
周期処理埋め込みバイナリ２８は、実行用装置３０上のＲＯＭ２またはＲＡＭ３に記憶され、実行用装置３０上のＣＰＵ１が実行するソフトウェアである。
実行用装置３０上のＣＰＵ１は、周期処理埋め込みバイナリ２８を実行する際、埋め込み用周期処理コードが埋め込まれた分岐先ラベルを通過する度に、周期処理コード２２１を実行する。
【００６８】
次に、図１６を用いて、本実施の形態におけるプログラム埋め込み装置２０の第１の動作について説明する。
第１の動作とは、プログラム埋め込み装置２０がメインプログラムのソースコード２１と埋め込み用時間計測処理コード２４から、実行用装置３０で動作可能な測定用周期処理埋め込みバイナリ２５を生成することを示す。
第１の動作においてプログラム埋め込み装置２０は、分岐先ラベルの先頭行に埋め込み用時間計測処理コード２４を挿入する（Ｓ３０１）。その他の動作内容については、実施の形態１で示した図６と同じである。
【００６９】
次に、図１７を用いて、測定用周期処理埋め込みバイナリ２５に挿入された埋め込み用時間計測処理コード２４の動作について説明する。なお、測定用周期処理埋め込みバイナリ２５は、実行用装置３０上のＲＯＭ２またはＲＡＭ３上に記憶され、実行用装置３０上のＣＰＵ１により実行される。測定用周期処理埋め込みバイナリ２５に挿入された埋め込み用時間計測処理コード２４が参照するタイマ５も実行用装置３０上のものである。
【００７０】
埋め込み用時間計測処理コード２４は、埋め込まれたプログラムのファイル名、および分岐先ラベル名を取得する（Ｓ２０６、Ｓ２０７）。
次に、埋め込み用時間計測処理コード２４は、タイマ５の値を読み込む（Ｓ２０８）。最後に、取得した情報（ファイル名、分岐先ラベル、タイマ５の値）を経過ログに記録する（Ｓ２０９）。
【００７１】
図１６、１７では、埋め込み用時間計測処理コード２４内にログを記録する命令を記述する場合の例を示したが、これらの命令は一か所だけ関数として埋め込み、埋め込み用時間計測処理コード２４から呼び出すようにしても良い。
【００７２】
第１の動作によって生成された、測定用周期処理埋め込みバイナリ２５を実行用装置３０上で実行することによって経過時間ログ２６が出力される。
図１８は、実行用装置３０上で測定用周期処理埋め込みバイナリ２５を動作させた結果出力された、経過時間ログ２６の一例である。
【００７３】
次に、図１９を用いて、本実施の形態におけるプログラム埋め込み装置２０の第２の動作について説明する。
第２の動作とは、プログラム埋め込み装置２０がメインプログラムのソースコード２１と埋め込み用周期処理コード２７を用いて、実行用装置３０で動作可能な周期処理埋め込みバイナリ２８を生成することを示す。
【００７４】
第２に動作において、まずアセンブリコード変換部２０１が開発用装置１０から受け取ったメインプログラムのソースコード２１をアセンブリコードに変換する（Ｓ１０１）。
アセンブリコード変換部２０１は、変換したアセンブリコードを第２の周期処理埋め込み部２０６に渡す。
次に、埋め込み位置決定部２０６０が、実行用装置３０から受け取った経過時間ログ２６に基づいて、埋め込み用周期処理コード２７を挿入する位置を決定し、埋め込み位置テーブルに記録する（Ｓ３０２）。
【００７５】
埋め込み位置テーブルは、周期処理を行うファイル名、分岐先ラベル、通過回数を記録するためのものである。図２０に埋め込み位置テーブルの一例を示す。Ｓ３０２の詳細な動作フローについては後述する。
【００７６】
埋め込み位置決定部２０６０は、埋め込み位置テーブルに記録された分岐先ラベルを１行ずつ読み込む（Ｓ３０３）。
次に、埋め込み位置決定部２０６０は、アセンブリコード変換部２０１から受け取ったメインプログラムのアセンブリコードの先頭から１行ずつ読み込み（Ｓ３０４）、Ｓ３０３で読み込んだ分岐先ラベルと一致するか判定する（Ｓ３０５）。
【００７７】
埋め込み位置テーブルの分岐先ラベルと一致しなかった場合（Ｓ３０５：ＮＯ）、埋め込み位置決定部２０６０は、アセンブリコードの１行読み込み（Ｓ３０４）を再度実行し、次の行を読み込む。
一方、埋め込み位置テーブルの分岐先ラベルと一致した場合（Ｓ３０５：ＹＥＳ）、埋め込み位置決定部２０６０は、埋め込み位置テーブルに記録されている分岐先ラベルの通過回数を判定する（Ｓ３０６）。
【００７８】
埋め込み位置テーブルの通過回数が一回であった場合（Ｓ３０６：一回）、埋め込み位置決定部２０６０は、プログラム埋め込み部２０２１を呼び出す。
プログラム埋め込み部２０２１は、埋め込み位置決定部２０６０がアセンブリコードから読み込んだ分岐先ラベルの次の行へ周期処理コード２２１を挿入する（Ｓ３０８）。
なお、周期処理コード２２１は、全ての位置に埋め込んでもよいし、一か所だけ関数として埋め込み、分岐先ラベルには関数の呼び出し命令のみを挿入するようにしても良い。前者の全ての位置に埋め込む方法であれば、処理速度を向上でき、後者の一か所だけ関数として埋め込む方法だと、メモリを節約できる。
【００７９】
埋め込み位置テーブルの通過回数が複数回であった場合、埋め込み位置決定部２０６０は、アセンブリコードから読み込んだ分岐先ラベルの次の行へ通過回数計測コード２７０を挿入するよう、プログラム埋め込み部２０２１を呼び出し（Ｓ３０７）、さらに周期処理コード２２１を挿入するよう、プログラム埋め込み部２０２１を呼び出す（Ｓ３０８）。
なお、周期処理コード２２１は、全ての位置に通過回数計測コード２７０と同時に埋め込んでもよいし、一か所だけ関数として埋め込み、通過回数計測コード２７０から呼び出すようにしても良い。前者の全ての位置に埋め込む方法であれば、処理速度を向上でき、後者の一か所だけ関数として埋め込む方法だと、メモリを節約できる。
【００８０】
次に、埋め込み位置決定部２０６０は、現在読み込んだ分岐先ラベルが埋め込み位置テーブルの終端であるかを確認する（Ｓ３０９）。
埋め込み位置テーブルの終端でなかった場合（Ｓ３０９：ＮＯ）、埋め込み位置決定部２０６０は、埋め込み位置テーブルの分岐先ラベルの読み込みを再度実行し（Ｓ３０３）、次の１行を読み込む。
【００８１】
埋め込み位置テーブルの終端であった場合（Ｓ３０９：ＹＥＳ）、埋め込み位置決定部２０６０は、オブジェクトコード変換部２０３を呼び出す。
オブジェクトコード変換部２０３とバイナリ変換部２０４の動作内容（Ｓ１０６、Ｓ１０７）は実施の形態１と同様である。
【００８２】
次に、図２１を用いて、周期処理埋め込みバイナリ２８に挿入された通過回数計測コード２７０の動作について説明する。なお、周期処理埋め込みバイナリ２８は、実行用装置３０上のＲＯＭ２またはＲＡＭ３上に記憶され、実行用装置３０上のＣＰＵ１により実行される。
【００８３】
通過回数計測コード２７０は、分岐先ラベルの通過回数をカウントしながら周期処理を実行するべきか判定する。
まず、通過回数計測コード２７０は、分岐先ラベルの通過回数に１を加算する（Ｓ２１０）。なお、通過回数計測コード２７０は、各分岐先ラベル毎の通過回数をカウントするためのテーブルなどを保持していることを前提とする。
【００８４】
次に、通過回数計測コード２７０は、加算した通過回数が埋め込み位置テーブルに記録された周期処理を行う通過回数であるかを判定する（Ｓ２０３）。
周期処理を行う通過回数と一致した場合（Ｓ２０３：ＹＥＳ）、通過回数計測コード２７０は、周期処理コード２２１を呼び出し（Ｓ２０３）、終了する。
一方、周期処理を行う通過回数と一致しなかった場合（Ｓ２０３：ＮＯ）、通過回数計測コード２７０は何もせず終了する。
【００８５】
次に、図２２を用いて、第２の周期処理埋め込み部２０６における埋め込み位置決定部２０６０が、経過ログ２６を参照し埋め込み位置テーブルを作成する動作フロー（図１９：Ｓ３０２の詳細）について説明する。
【００８６】
まず、埋め込み位置決定部２０６０は、実行用装置３０から受け取った経過時間ログ２６を先頭から１行ずつ読み込み（Ｓ３１０）、読み込んだ分岐先ラベルの通過回数に１を加算する（Ｓ３１１）。なお、埋め込み位置決定部２０６０は、各分岐先ラベル毎の通過回数をカウントするためのテーブルなどを保持していることを前提とする。
【００８７】
次に、埋め込み位置決定部２０６０は、経過時間ログ２６に記録されているタイマの値を読み込み、周期処理コード２２１が前回実行された時間との差分を計算する（Ｓ３１２）。なお、本実施の形態では、前回実行時の初期値は０に設定する。
【００８８】
次に、埋め込み位置決定部２０６０は、Ｓ３１２にて算出した差分が周期時間未満であるかを判定する（Ｓ３１３）。
判定した結果、周期時間以上であった場合（Ｓ３１３：ＹＥＳ）、埋め込み位置決定部２０６０は経過時間ログに記録されている内容を一時バッファに記憶し（Ｓ３１４）、経過時間ログの終端であるか判定する（Ｓ３１７）。
【００８９】
一方、判定した結果が周期時間未満であった場合（Ｓ３１３：ＹＥＳ）、埋め込み位置決定部２０６０は一時バッファに記録されているファイル名、分岐先ラベル、および該当する分岐先ラベルの通過回数を埋め込み位置テーブルに記録し（Ｓ３１５）、経過時間ログから読み込んだ現在のタイマの値を前回実行時の値として記録（更新）する（Ｓ３１６）。
【００９０】
最後に、埋め込み位置決定部２０６０は、読み込んだ行が経過時間ログ２６の終端であるかを判定する（Ｓ３１７）。
判定の結果、経過時間ログの終端ではない場合（Ｓ３１７：ＮＯ）、埋め込み位置決定部２０６０は、経過時間ログの１行読み込み（Ｓ３１０）を再度実行し、次の１行を読み込む。
一方、判定の結果、経過時間ログの終端であった場合（Ｓ３１７：ＹＥＳ）、埋め込み位置決定部２０６０は何もせず終了する。
【００９１】
以上のように、メインプログラムのソースコード２１を変換したアセンブリコードの中から分岐先ラベルを探索する分岐先ラベル探索部２０２０と、埋め込み用時間計測処理コード２４をアセンブリコードへ埋め込む処理を行う第１の周期処理埋め込み部２０５と、事前に出力したメインプログラムの経過時間ログ２６を参照して、周期処理コード２２１を周期時間内に実行するうえで、最低限必要な埋め込み位置を決定し、アセンブリコードへ埋め込む処理を行う第２の周期処理埋め込み部２０６とを備えることにより、タイマ割り込みを利用せずとも周期処理を実行するバイナリ（周期処理埋め込みバイナリ２８）を生成することが可能となる。
【００９２】
また、周期処理を埋め込む前に実行用装置３０で動作可能な測定用周期処理埋め込みバイナリ２５を生成しプログラムの実行時間を計測するため、実施の形態１のように全ての分岐先ラベル通過時に周期処理コード２２１を実行するべきか判定する必要がなくなる。
さらに、ループ処理のような複数回通過する分岐先ラベルの場合であっても特定の回数通過時にのみ周期処理コード２２１を実行するため、過度に実行されることもなくなる。
【００９３】
実施の形態３．
本実施の形態では、メインプログラムのソースコード２１に対し、静的な解析を行うことによって、プログラムのおよその実行時間を算出し、周期時間に間に合うよう周期処理の実行命令を、メインプログラムのソースコード２１に埋め込む場合について説明する。
【００９４】
図２３は、本実施の形態におけるシステム構成図の一例である。実施の形態１と同様に、本実施の形態におけるシステムでは、開発用装置１０、プログラム埋め込み装置２０、実行用装置３０で構成される。
また、実施の形態１と同様に、本実施の形態におけるシステムでは、開発用装置１０からプログラム埋め込み装置２０に対し、メインプログラムのソースコード２１および埋め込み用周期処理コード２２が渡され、プログラム埋め込み装置２０から実行用装置３０に対し、周期処理埋め込みバイナリ４０が渡される。
【００９５】
本実施の形態では、実施の形態１と違い、プログラム埋め込み装置２０が命令実行クロック数一覧２９の参照を行っている。
なお、本実施の形態では、プログラム埋め込み装置２０が直接命令実行クロック数一覧２９を参照するような構成としたが、開発用装置１０が命令実行クロック数一覧２９を管理し、開発用装置１０からプログラム埋め込み装置２０へ渡すようにしてもよい。
【００９６】
図２４は、本実施の形態におけるプログラム埋め込み装置２０上で動作するソフトウェアの全体構成図である。これらのソフトウェアは、プログラム埋め込み装置２０のＲＯＭ２またはＲＡＭ３上に記憶され、ＣＰＵ１により実行される。
【００９７】
図２４において、命令実行クロック数一覧２９は、命令の実行に必要なクロック数が記述されたものである。図２５に命令実行クロック数一覧２９の一例を示す。
本実施の形態における周期処理埋め込み部２０７は、命令実行時間算出部（分岐先探索部）２０７０と、プログラム埋め込み部２０２１を備えている。
【００９８】
命令実行時間算出部２０７０は、アセンブリコード変換部２０１から渡されたアセンブリコードの中から命令を抽出し、命令実行クロック数一覧２９を参照し、命令実行時間の算出を行う。
プログラム埋め込み部２０２１は、埋め込み用周期処理コードをアセンブリコードへ埋め込む処理を行う。
【００９９】
なお、図２４において、図３と同一の符号は、同一または相当する部分を表しており、命令実行時間算出部２０７０および命令実行クロック数一覧２９以外については、実施の形態１で用いた図３で記載したものと同じ動作をする。
【０１００】
次に図２６を用いて、本実施の形態におけるプログラム埋め込み装置２０の動作について説明する。
【０１０１】
まず、アセンブリコード変換部２０１が、開発用装置１０から受け取ったメインプログラムのソースコード２１をアセンブリコードに変換する（Ｓ１０１）。
アセンブリコード変換部２０１は、変換したアセンブリコードを周期処理埋め込み部２０７に渡す。
【０１０２】
アセンブリコード変換部２０１からアセンブリコードを受け取った命令実行時間算出部２０７０は、経過時間の初期化を行う（Ｓ５０１）。
次に命令実行時間算出部２０７０は、アセンブリコードの先頭から１行ずつ読み込み（Ｓ１０２）、ループ命令または関数呼び出し命令が記述されているかを判定する（Ｓ５０２）。
【０１０３】
ループ命令または関数呼び出し命令ではなかった場合（Ｓ５０２：ＮＯ）、命令実行時間算出部２０７０は、命令実行クロック数一覧２９を参照し、その命令を実行するのに必要なクロック数を獲得し、実行用装置３０で用いられているＣＰＵ１のクロック周波数の逆数と掛け合わせることによって実行時間を算出する（Ｓ５０３）。
例えば、実行用装置３０で用いられているＣＰＵ１のクロック周波数が１ＧＨｚであり、読み込んだ命令が「ａｄｄ（命令クロック数は４）」であった場合、実行時間は４ナノ秒となる。
【０１０４】
命令実行時間算出部２０７０は、算出した実行時間を経過時間に加算し（Ｓ５０４）、周期時間の８割以上であるかを判定する（Ｓ５０５）。なお、実施の形態１の場合と同様、本実施の形態では、周期処理を周期時間内に確実に実行することを目的としているため、周期処理の実行条件を周期時間の８割経過時と定義としたが、周期時間を越えなければ特に８割以外であってもよい。
【０１０５】
経過時間が周期時間の８割以上であった場合（Ｓ５０５：ＹＥＳ）命令実行時間算出部２０７０は、プログラム埋め込み部２０２１を呼び出す。
プログラム埋め込み部２０２１は、周期処理コード２２１を呼び出す命令を埋め込む（Ｓ５０６）。
その後、命令実行時間算出部２０７０は、経過時間を初期化する（Ｓ５０７）。
次に命令実行時間算出部２０７０は、現在読み込んだ１行が、アセンブリコードの終端であるかを確認する（Ｓ１０５）。
【０１０６】
一方、経過時間が周期時間の８割以上では無かった場合（Ｓ５０５：ＮＯ）命令実行時間算出部２０７０は、現在読み込んだ１行が、アセンブリコードの終端であるかを確認する（Ｓ１０５）。
アセンブリコードの終端であった場合（Ｓ１０５：ＹＥＳ）、命令実行算出部２０７０は、オブジェクトコード変換部２０３を呼び出す。
【０１０７】
次にオブジェクトコード変換部２０３は、周期処理埋め込み部２０７が出力した埋め込み完了後アセンブリコードを、バイナリ形式であるオブジェクトコードに変換する（Ｓ１０７）。なお、本実施の形態では、周期処理コード２２１を埋め込み完了後アセンブリコードの一部となるよう埋め込みを行ったが、埋め込み完了後アセンブリコードとは別のファイルとし、埋め込み完了後アセンブリコードとは別にオブジェクトコードに変換しても良い。
【０１０８】
ループ命令または関数呼び出し命令であった場合（Ｓ５０２：ＹＥＳ）、命令実行時間算出部２０７０は、プログラム埋め込み部２０２１を呼び出す。
プログラム埋め込み部２０２１は、命令の実行直前と命令の実行直後に周期処理コード２２１を読みだす命令を埋め込む。その後、命令実行時間算出部２０７０は、経過時間を初期化する（Ｓ５０６）。
【０１０９】
なお、ループ命令によって繰り返し実行される回数および、呼び出される関数の内部処理はプログラムが実行される条件によって変化するため、実行時間の算出が困難である。
このため、本実施の形態では、ループ命令によって繰り返し実行される周期時間内にループ命令または関数呼び出し命令による処理が終了することを前提とする。
【０１１０】
以上のように、アセンブリの命令種別に基づいて実行時間を算出し、周期処理を埋め込む位置を決定する命令実行時間算出部２０７０を備えることにより、経過時間計測処理コードを使用せずに周期処理埋め込みバイナリ４０を生成することが可能となる。
これにより、実行用装置３０にタイマ５が存在しないもしくは使用が制限されており利用できない場合においても、周期時間内に周期処理を実行することが可能となる。
【符号の説明】
【０１１１】
１  ＣＰＵ、２  ＲＯＭ、３  ＲＡＭ、４  通信モジュール、５  タイマ、１０  開発用装置、２０  プログラム埋め込み装置、２１  メインプログラムのソースコード、２２  埋め込み用周期処理コード、２３  周期処理埋め込みバイナリ、２４  埋め込み用時間計測処理コード、２５  測定用周期処理埋め込みバイナリ、２６  経過時間ログ、２７  埋め込み用周期処理コード、２８  周期処理埋め込みバイナリ、３０  実行用装置、４０  周期処理埋め込みバイナリ、２０１  アセンブリコード変換部、２０２  周期処理埋め込み部、２０３  オブジェクトコード変換部、２０４  バイナリ変換部、２０５  第１の周期処理埋め込み部、２０６  第２の周期処理埋め込み部、２０７  周期処理埋め込み部、２２０  経過時間計測処理コード、２２１  周期処理コード、２７０  通過回数計測コード、２０２０  分岐先ラベル探索部、２０２１  プログラム埋め込み部、２０５０  プログラム埋め込み部、２０６０  埋め込み位置決定部、２０７０  命令実行時間算出部。
【図１】
0006287709.tif 000002
【図２】
0006287709.tif 000003
【図３】
0006287709.tif 000004
【図４】
0006287709.tif 000005
【図５】
0006287709.tif 000006
【図６】
0006287709.tif 000007
【図７】
0006287709.tif 000008
【図８】
0006287709.tif 000009
【図９】
0006287709.tif 000010
【図１０】
0006287709.tif 000011
【図１１】
0006287709.tif 000012
【図１２】
0006287709.tif 000013
【図１３】
0006287709.tif 000014
【図１４】
0006287709.tif 000015
【図１５】
0006287709.tif 000016
【図１６】
0006287709.tif 000017
【図１７】
0006287709.tif 000018
【図１８】
0006287709.tif 000019
【図１９】
0006287709.tif 000020
【図２０】
0006287709.tif 000021
【図２１】
0006287709.tif 000022
【図２２】
0006287709.tif 000023
【図２３】
0006287709.tif 000024
【図２４】
0006287709.tif 000025
【図２５】
0006287709.tif 000026
【図２６】
0006287709.tif 000027