JP2013161219A - コード生成装置、及びコード生成プログラム - Google Patents
コード生成装置、及びコード生成プログラム Download PDFInfo
- Publication number
- JP2013161219A JP2013161219A JP2012022058A JP2012022058A JP2013161219A JP 2013161219 A JP2013161219 A JP 2013161219A JP 2012022058 A JP2012022058 A JP 2012022058A JP 2012022058 A JP2012022058 A JP 2012022058A JP 2013161219 A JP2013161219 A JP 2013161219A
- Authority
- JP
- Japan
- Prior art keywords
- block group
- abnormal
- block
- pattern
- control model
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】開発者が、他のタスクや割り込みルーチン等によるグローバル変数の更新を考慮することなくモデルを作成することを可能としたコード生成装置を提供する。
【解決手段】コード生成装置として動作するPCは、制御モデルにおける関数ブロックのうち、同一グローバル変数の読み出しを行うブロックセットが複数含まれているものを対象に、予め定められた異常パターンに対応する異常ブロック群を検出する(S620)。そして、対応する正常パターンにより、該異常ブロック群を、同様の処理を実現しつつ、グローバル変数の値をローカル変数に退避させるラッチブロックの追加により他のタスク等による該グローバル変数の更新の影響を排除した正常ブロック群に変換し(S625)、該異常ブロック群を正常ブロック群に置き換えた制御モデルから、ソースコードを生成する(S640)。
【選択図】図6
【解決手段】コード生成装置として動作するPCは、制御モデルにおける関数ブロックのうち、同一グローバル変数の読み出しを行うブロックセットが複数含まれているものを対象に、予め定められた異常パターンに対応する異常ブロック群を検出する(S620)。そして、対応する正常パターンにより、該異常ブロック群を、同様の処理を実現しつつ、グローバル変数の値をローカル変数に退避させるラッチブロックの追加により他のタスク等による該グローバル変数の更新の影響を排除した正常ブロック群に変換し(S625)、該異常ブロック群を正常ブロック群に置き換えた制御モデルから、ソースコードを生成する(S640)。
【選択図】図6
Description
本発明は、モデルに基づきソースコードを生成するコード生成装置等に関する。
従来、例えば車両のエンジンECUのプログラムの開発においては、開発者が直接ソースコードを記述せず、目的とするプログラムの機能を、より作成が簡易で視認性の良い「モデル」という形態で記述する場合がある。開発者は、このモデルに対応したプログラム開発環境がインストールされたワークステーション,パーソナルコンピュータ等を用い、そのモデルにて定義された演算処理等のシミュレーションを行うと共に、該モデルからソースコードを自動生成する。
このようにしてモデルに基づきソースコードを自動生成するプログラム開発は、モデルベース開発と呼ばれており、モデルベース開発を行うためのプログラム開発環境としてMatlab(登録商標)が知られている。Matlab(登録商標)においては、開発者は、当該プログラム開発環境の付加機能を提供するSimulink(登録商標)を用いてモデルを記述する。
そして、Simulink(登録商標)においては、モデルは、各種演算やファイルからのデータの読み出し等を行う機能単位であるブロックや、ブロック間のデータの入出力を示す結線等の組合せとして記述される。すなわち、複数のブロックが結線によってつなぎ合わされることにより、エンジン制御におけるデータの入出力や、各種演算処理等を表現する集合体がモデルである。
特許文献1には、このようなモデルベース開発に用いられるソースコードの生成装置について記載されている。特許文献1に記載のコード生成装置によれば、複数の種別(例えば、装置の仕向け地や機種等)の機能が記述された一つのモデルから特定の種別に対応するソースコードを生成する際、対応しない種別についての機能の記述がモデルから除去される。これにより、不要なソースコードが生成されることを防ぐことができ、ROM容量の小さいソースコードを生成することが可能となる。
ところで、プログラムでは、当該プログラム全域でアクセス可能なグローバル変数が用いられる場合があるが、グローバル変数に基づく処理の途中で優先度のより高い他のタスクや割込みルーチンにより該グローバル変数が更新されると、異常をきたす場合ある。このため、従来のコード生成装置では、グローバル変数の値がレジスタやスタック領域等に退避されるようにソースコードが生成され、他のタスク等によるグローバル変数の更新の影響を排除する処置が施されていた。
これに対し、例えば、一のタスクが複数のブロックセット(結線により直接的或いは間接的につなぎ合わされたブロックの集まり)により記述され、2以上のブロックセットで同一のグローバル変数が読み出される場合等が想定される。このような場合には、上記処置により、グローバル変数を読み出す個々のブロックセットに対応する処理の実行期間にわたり上記影響を排除できたとしても、これらのブロックセットに対応する一連の処理の実行期間にわたり、断続的に上記影響を排除することはできなかった。
このため、タスク内の同一グローバル変数への複数の読み出し箇所で該グローバル変数の一致性が保証されず、これにより異常をきたす場合があり、開発者は、モデルを作成する際にグローバル変数をローカル変数に退避させる等の措置を講ずる必要があった。
本願発明は上記課題に鑑みてなされたものであり、開発者が、他のタスクや割り込みルーチン等によるグローバル変数の更新を考慮することなくモデルを作成することを可能としたコード生成装置等を提供することを目的とする。
上記課題に鑑みてなされた請求項1に記載のコード生成装置は、予め定められた処理手順を示すブロック同士を該ブロック間のデータの入出力を表す結線により繋ぐことでプログラムを記述した制御モデルを読み込む読込手段と、制御モデルを構成するブロックと結線との集まりであるブロック群のうち、当該ブロック群により記述された処理を中断して行われる他の処理により更新される同一のグローバル変数にアクセスする箇所を少なくとも二つ有し、該グローバル変数へのアクセスの間隙に他の処理により該グローバル変数が更新されると、記述された処理に異常をきたすおそれがあるものを異常ブロック群とし、該異常ブロック群をなすブロックと結線との組合せのパターンを登録しているパターン登録手段と、を備える。
また、パターン登録手段に登録されているパターンに対応する異常ブロック群を、該異常ブロック群と同様の処理を実現しつつ、グローバル変数の値を退避させるラッチブロックを加えることで異常の発生を防止可能となる正常ブロック群に変換するための変換方法を登録している変換方法登録手段と、読込手段により読み込まれた制御モデルから、パターン登録手段に登録されているパターンに対応する異常ブロック群を検出する検出手段と、を備える。
また、検出手段により検出された異常ブロック群に対応するパターンについての変換方法により、該異常ブロック群を正常ブロック群に変換する変換手段と、異常ブロック群が、変換手段により該異常ブロック群から変換された正常ブロック群に置き換えられた制御モデルに基づき、ソースコードを生成する生成手段と、を備える。
例えば、マルチタスクのプログラムにて、同一タスクの2箇所以上で同一グローバル変数の読み出しが行われる場合や、マルチタスクでないプログラムにて、所定条件の成立によりコールされる関数内の2箇所以上で同一グローバル変数の読み出しが行われる場合等が想定される。このような場合には、グローバル変数の値をローカル変数に退避させ、グローバル変数に替えてローカル変数の値を読み出すようプログラムを改変することで、他のタスクや割り込みルーチン等によるグローバル変数の更新の影響を排除することができる。
これに対し、請求項1に記載のコード生成装置は、読み込まれた制御モデルから、2箇所以上で同一グローバル変数にアクセスする異常ブロック群を検出することができる。そして、検出した異常ブロック群を、同様の処理を実現しつつ、グローバル変数の値をローカル変数に退避させるラッチブロックの追加により優先度のより高い他の処理によるグローバル変数の更新の影響を排除した正常ブロック群に変換する。さらに、コード生成装置は、異常ブロック群を正常ブロック群に置き換えた制御モデルからソースコードを生成する。
すなわち、仮に制御モデルに異常ブロック群が含まれていたとしても、該制御モデルから生成されるソースコードでは、該異常ブロック群により記述された処理は、グローバル変数の値が退避されたローカル変数にアクセスする処理に改変される。このため、他のタスク等によりグローバル変数が更新されたとしても、該グローバル変数にアクセスする異常ブロック群により記述された処理を正常に実行することができ、該処理への影響を防ぐことができる。
したがって、開発者は、他のタスクや割り込みルーチン等によるグローバル変数の更新を考慮することなく制御モデルを作成することが可能となり、制御モデルの作成を容易化することができる。
また、従来は、開発者が制御モデルを作成する段階で異常ブロックを正常ブロックに書き換えることが必要であったが、これを行うためには、ラッチブロックという実現される処理とは直接関係無いブロックを設ける必要があり、これにより制御モデルが複雑化してしまうという問題があった。
これに対し、請求項1に記載のコード生成装置を用いた場合には、開発者が異常ブロックを正常ブロックに書き換える必要が無くなるため、制御モデルの複雑化を抑えることができ、よりわかり易い制御モデルの作成が可能となる。
また、タスク等が複数のブロックセットにより記述される場合が想定される。
そこで、請求項2に記載のコード生成装置では、結線により直接的或いは間接的に互いにつなぎ合わされたブロックの集まりをブロックセットとし、パターン登録手段に登録されているパターンとは、複数のブロックセットから構成され、これらのうちの少なくとも二つは、同一のグローバル変数へのアクセスがなされるアクセスブロックセットである異常ブロック群に対応する。
そこで、請求項2に記載のコード生成装置では、結線により直接的或いは間接的に互いにつなぎ合わされたブロックの集まりをブロックセットとし、パターン登録手段に登録されているパターンとは、複数のブロックセットから構成され、これらのうちの少なくとも二つは、同一のグローバル変数へのアクセスがなされるアクセスブロックセットである異常ブロック群に対応する。
こうすることにより、タスク等が複数のブロックセットにより構成され、2以上のブロックセットで同一のグローバル変数にアクセスされる場合であっても、該グローバル変数に基づき行われる一連の処理の実行期間にわたり、他のタスク等による該グローバル変数の更新の影響を排除することができる。
また、同一のグローバル変数が2箇所以上で読み出されるブロック群では、該グローバル変数の読み出しタイミングの間隙に、他のタスク等により該グローバル変数が更新される場合がある。このような場合には、先に読み出されたグローバル変数の値に基づく処理と、後に読み出されたグローバル変数の値に基づく処理との間に不整合が生じ、異常が発生するおそれがある。
そこで、請求項5に記載のコード生成装置は、異常ブロック群におけるグローバル変数へのアクセスとは、該グローバル変数の読み出しであることを特徴とする。
このような構成によれば、同一のグローバル変数が2箇所以上で読み出されるブロック群を異常ブロック群として検出し、正常ブロック群に変換することが可能となり、他のタスク等によるグローバル変数の更新の影響を排除することができる。
このような構成によれば、同一のグローバル変数が2箇所以上で読み出されるブロック群を異常ブロック群として検出し、正常ブロック群に変換することが可能となり、他のタスク等によるグローバル変数の更新の影響を排除することができる。
以下、本発明の実施形態について図面を用いて説明する。なお、本発明の実施の形態は、下記の実施形態に何ら限定されることはなく、本発明の技術的範囲に属する限り種々の形態を採りうる。
[構成の説明]
図1(a)には、本実施形態におけるコード生成装置として作動する周知のパーソナルコンピュータ(PC)1の構成を示すブロック図が記載されている。このPC1は、ディスプレイ10,HDD(ハードディスクドライブ)20,CPU(演算装置)30,ROM40,RAM50,入力装置60等を備える。
図1(a)には、本実施形態におけるコード生成装置として作動する周知のパーソナルコンピュータ(PC)1の構成を示すブロック図が記載されている。このPC1は、ディスプレイ10,HDD(ハードディスクドライブ)20,CPU(演算装置)30,ROM40,RAM50,入力装置60等を備える。
ディスプレイ10は、CPU30から受けた映像信号を、ユーザに対して映像として表示する。
入力装置60は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をCPU30に出力する。
入力装置60は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をCPU30に出力する。
RAM50は読み出し、書き込み可能な揮発性メモリであり、ROM40は読み出し専用の不揮発性メモリであり、HDD20は読み出し、書き込み可能な不揮発性メモリである。ROM40、HDD20には、CPU30が読み出して実行するプログラム等が予め記憶されている。
RAM50は、CPU30がROM40,HDD20に記憶されたプログラムを実行する際に、そのプログラムを一時的に保存するための記憶領域、及び作業用のデータを一時的に保存するための記憶領域として用いられる。
CPU30は、オペレーティングシステム(OS)をHDD20から読み出して実行し、HDD20に記録されている各種プログラムをOS上のプロセスとして実行する。また、このプロセスにおいて、CPU30は必要に応じて入力装置60から信号の入力を受け付け、ディスプレイ10に映像信号を出力し、RAM50,HDD20に対してデータの読み出し/書き込みの制御を行う。
次に、PC1にインストールされている本実施形態のコード生成ツール100について、図1(b)に記載のブロック図を用いて説明する。コード生成ツール100は、HDD20に保存され、OS上のプロセスとして実行されるアプリケーションの1つであり、PC1は、コード生成ツール100を動作させることで、モデルベース開発を行うためのコード生成装置として稼動する。なお、このコード生成装置は、車載装置等といった組み込みシステム向けのプログラム開発に用いられることが考えられるが、これに限定されることは無く、あらゆる用途のプログラム開発に用いることができる。
コード生成ツール100は、入力装置60(キーボード61,マウス62)の操作によって起動し、その後ユーザの入力装置60の操作に基づいて作成された制御モデル150や、該操作により設定された詳細条件151からソースコードを生成する。
ソースコードとは、例えばC++等のプログラミング言語の仕様に則ってプログラム開発者が作成するプログラムの一表現形態である。ソースコードはコンパイラ、リンカ等に入力されることで、CPU等が直接実行できるオブジェクトコードに変換される。なお、オブジェクトコードもプログラムの一表現形態である。
また、制御モデル150とは、ソースコードよりも記述が簡易になり、かつ人による可読性を高くする目的で定められたモデル言語仕様に基づいて作成されるプログラムの一表現形態である。制御モデルとしては、例えばSimulink(登録商標)によって作成されるSimulinkモデルがある。Simulink(登録商標)モデルが、Matlab(登録商標)上で動作するReal Time Workshop(登録商標:以下RTWと記す)に入力されることにより、このRTWが当該Simulink(登録商標)モデルに対応するソースコードを生成する。
Simulink(登録商標)モデルは、特定の処理手順を示すブロックと呼ばれる機能単位の組合せとして記述され、モデルを構成するブロックは、ブロック間のデータの入出力、及び、対応する処理手順の順序を示す結線により繋ぎ合わされている。
また、複数のブロックの集合体を、関数ブロックというブロックの一種として定義することもできる。この関数ブロックは、プログラミングにおける関数に相当し、ブロックの中にブロックが含まれるような入れ子構造のブロックの作成も許されており、関数ブロックを有する制御モデルに基づき生成されたソースコードでは、関数ブロックでの処理はサブルーチンとして記述される。
また、Simulink(登録商標)モデル中の各ブロックは、それぞれ属性情報を有することができる。属性情報としては、例えば当該ブロックの名称、入出力するデータの型や値域定義等がある(なお、図2(b)では、属性情報等を詳細条件151として表している)。
本実施形態における制御モデル150も、Simulink(登録商標)モデルと同様にブロックから成り、関数ブロックの記述やブロックの入れ子構造が許され、各ブロックが属性情報を有することができる。
また、本実施形態のコード生成ツール100では、制御モデル150等からソースコードを生成することに加え、制御モデル150の一部を改変する機能を有している。
すなわち、制御モデル150では、グローバル変数(プログラム全域でアクセス可能な変数)が用いられる場合があるが、グローバル変数を読み出して行われる処理の途中で他のタスクや割り込みルーチン等により該グローバル変数が更新されると、異常をきたすおそれがある。
すなわち、制御モデル150では、グローバル変数(プログラム全域でアクセス可能な変数)が用いられる場合があるが、グローバル変数を読み出して行われる処理の途中で他のタスクや割り込みルーチン等により該グローバル変数が更新されると、異常をきたすおそれがある。
これに対し、従来のコード生成ツールでは、グローバル変数の値がレジスタやスタック領域等に退避されるようにソースコードが生成され、このような処置により、グローバル変数の個々の読み出し箇所では、他のタスク等による更新の影響を排除することができた(本実施形態のコード生成ツール100も、この点においては従来のものと同様となっている)。しかしながら、例えば、タスクが複数のブロックセットから構成され、複数のブロックセットにて同一のグローバル変数が読み出される場合等が想定される。このような場合には、上記処置を施したとしても、これらのブロックセットに対応する一連の処理の実行期間にわたり、断続的に上記影響を排除することはできなかった。
なお、ブロックセットとは、結線により直接的或いは間接的に互いに繋ぎ合わされたブロックの集まりである。このブロックセットを構成する各ブロックは、全ての他のブロックに対し、他のブロックから出力されたデータが当該ブロックの処理手順に影響を及ぼすか、或いは、当該ブロックから出力されたデータが該他のブロックの処理手順に影響を及ぼす関係にある。
これに対し、本実施形態のコード生成ツール100は、制御モデル150に含まれるブロック群(ブロックセットの集まり)から、他のタスク等によるグローバル変数の更新により異常をきたすおそれがある異常ブロック群を検出する検出部101を有する。さらに、検出部101により検出された異常ブロック群を書き換える変換部102を有し、他のタスク等によるグローバル変数の更新の影響を排除する構成となっている。
[動作の説明]
次に、本実施形態のコード生成ツール100の動作について、上述した制御モデル150の改変機能を中心に説明する。
次に、本実施形態のコード生成ツール100の動作について、上述した制御モデル150の改変機能を中心に説明する。
コード生成ツール100は、異常ブロック群の類型である異常パターンを示す異常パターンデータを有しており、この異常パターンに基づき、制御モデル150に含まれている異常ブロック群を検出する。
さらに、コード生成ツール100は、各異常パターンに対応する異常ブロック群を、同様の処理を実現可能としつつ、他のタスク等によるグローバル変数の更新の影響を排除することができる正常ブロック群に変換する変換方法を示す変換方法データを有している。そして、検出した異常ブロック群を、対応する異常パターンについての変換方法に従い正常ブロック群に変換し、異常ブロック群を正常ブロック群に置き換えた状態で、制御モデルからソースコードを生成する。
なお、異常パターンデータや変換方法データは、コード生成ツール100の一部を構成しており、これらのデータは、コード生成ツール100がインストールされているPC1のHDD20に保存されていることは、言うまでも無い。
図2(a)〜5(a)には、一例として、第1〜4異常パターン200,300,400,500が記載されている。各異常パターンは、複数のブロックセットのパターン(ブロックセットパターン)の組合せとして構成されており、これらのブロックセットのうちの少なくとも二つは、同一のグローバル変数の読み出しを行うブロックを有するアクセスブロックセットをなしている。
また、図2(b)〜5(b)には、第1〜4異常パターン200,300,400,500に対応する異常ブロック群から変換される正常ブロック群の類型である第1〜4正常パターン240,340,440,540が記載されている。これらの正常パターンを示す各データは、それぞれ、変換方法データとして第1〜4異常パターン200〜500に対応付けられており、各異常パターンに対応する異常ブロック群は、対応する変換方法データに基づき正常ブロック群に変換される。
また、これらの正常パターンは、1または複数のブロックセットパターンの組合せとして構成されており、少なくとも一つのブロックセットパターンは、アクセスブロックセットで読み出されるグローバル変数をローカル変数に保存するラッチブロックを有するものとなっている。なお、ローカル変数とは、正常パターンに対応する正常ブロック群により記述された処理が実行される際に、レジスタやスタック領域に一時的に割り当てられるテンポラリ変数であっても良い。また、RAMに静的に割り当てられ、正常ブロック群に対応するタスク等で局所的にアクセス可能な変数であっても良い。
なお、図2〜5における処理A,Bのブロックは、どのような処理手順に対応するブロックであっても良く、関数ブロックであっても良いし、ブロックセットとして構成されていても良い。また、各パターンにおけるグローバル変数X,Yは、任意のグローバル変数を示す。
また、ブロックセットパターンには、処理優先度A1〜A3,B1,B2のいずれかが設定されており、A1〜A3とB1,B2は、それぞれ、A1>A2>A3,B1>B2という処理優先度の大小関係を満たす任意の値となっている。そして、ソースコード上では、処理優先度の高いブロックセットから順に対応する処理が記述される。
次に、具体例として挙げた第1〜4異常パターン200〜500と、対応する第1〜4正常パターン240〜540について詳しく説明する。
図2(a)に記載の第1異常パターン200は、処理優先度A1,A2のブロックセットパターン210,220から構成されている。
図2(a)に記載の第1異常パターン200は、処理優先度A1,A2のブロックセットパターン210,220から構成されている。
このブロックセットパターン210は、ブロック211,213,215と、矢印として記載された結線212,214から構成されており、ブロック211は、グローバル変数Xから値を読み出して出力値とする。また、ブロック213は、ブロック211の出力値を入力(引数)として処理Aを実行すると共に、実行結果(返り値)を出力値とし、ブロック215は、ブロック213の出力値をグローバル変数Xに書き込む。なお、各結線は、当該結線が示す矢印の根元にあるブロックの出力値を、該矢印の先にあるブロックの入力値とすることを示している。
また、ブロックセットパターン220は、ブロック221,223と、結線222から構成されており、ブロック221は、グローバル変数Xから値を読み出して出力値とし、ブロック223は、ブロック221の出力値を入力(引数)として処理Bを実行する。
なお、図2(a)には、コード生成ツール100により、第1異常パターン200に対応する異常ブロック群に基づき生成されたソースコード230の一例が記載されている。このソースコード230では、グローバル変数Xは変数g_variとして表され、ブロックセットパターン210で記述された処理を表すステップ231と、ブロックセットパターン220で記述された処理を表すステップ232から構成される関数が記述されている。
このソースコード230から、ステップ231の処理とステップ232の処理の間隙に、他のタスク等により変数g_variが更新されると、関数func_sub_A(処理A)の実行結果が関数func_sub_B(処理B)に正常に反映されず、異常が発生する場合があることがわかる。
そして、コード生成ツール100では、第1異常パターン200に対応する異常ブロック群がこれに対応する変換方法データに基づき変換され、第1正常パターン240に対応する正常ブロック群が生成される(図2(b))。
この第1正常パターン240は、処理優先度B1のブロックセットパターン240として構成されており、第1異常パターン200におけるブロック211,213,215,223と、入力値(処理Aの実行結果)をローカル変数に保存すると共に、該値を出力値とするラッチブロック243から構成されている。
また、図3(a)に記載の第2異常パターン300は、処理優先度A1,A2のブロックセットパターン310,320から構成されている。このブロックセットパターン310,320は、第1異常パターン200におけるブロックセットパターン220,210と同様の構成を有している。
さらに、図3(a)には、第2異常パターン300に対応する異常ブロック群に基づき生成されたソースコード330の一例が記載されている。このソースコード330では、グローバル変数Xは変数g_variとして表され、ブロックセットパターン310で記述された処理を表すステップ331と、ブロックセットパターン320で記述された処理を表すステップ332から構成される関数が記述されている。
なお、ソースコード330からも、ステップ331の処理とステップ332の処理の間隙に他のタスク等により変数g_variが更新されると、同様の異常が発生する場合があることがわかる。
そして、コード生成ツール100では、第2異常パターン300に対応する異常ブロック群がこれに対応する変換方法データに基づき変換され、第2正常パターン340に対応する正常ブロック群が生成される(図3(b))。
この第2正常パターン340は、処理優先度B1のブロックセットパターン340として構成されており、第2異常パターン300におけるブロック311,313,323,325と、入力値(グローバル変数Xの値)をローカル変数に保存すると共に、該値を出力値とするラッチブロック342から構成されている。
また、図4(a)に記載の第3異常パターン400は、第2異常パターン300におけるブロックセット310,320と同様のブロックセット410,420から構成されているが、これらのブロックセットの処理優先度として、共にA1が設定されている。
さらに、図4(a)には、第3異常パターン400に対応する異常ブロック群に基づき生成されたソースコード430の一例が記載されており、このソースコード430は、第2異常パターン300に基づき生成されたソースコード330と同一となっている。
そして、コード生成ツール100では、第3異常パターン400に対応する異常ブロック群がこれに対応する変換方法データに基づき変換され、第3正常パターン440に対応する正常ブロック群が生成される(図4(b))。この第3正常パターン440は、第2正常パターン340と同一となっている。
また、図5(a)に記載の第4異常パターン500は、処理優先度A1〜A3のブロックセットパターン510〜530から構成されている。
このブロックセットパターン510は、第1異常パターン200におけるブロックセットパターン220等と同様の構成を有している。
このブロックセットパターン510は、第1異常パターン200におけるブロックセットパターン220等と同様の構成を有している。
また、ブロックセットパターン530は、ブロック531,533,535,537と、結線532,534,536から構成されており、ブロック531は、グローバル変数Xから値を読み出して出力値とする。また、ブロック533は、ローカル変数tmpから値(処理Bの実行結果)を読み出して出力値とすると共に、ブロック531の出力値(グローバル変数Xの値)を出力値とする。また、ブロック535は、ブロック533の二つの出力値を加算してグローバル変数Xの更新値とすると共に、該更新値を出力値とし、ブロック537は、ブロック535の出力値をグローバル変数Xに書き込む。
一方、ブロックセットパターン520は、ブロックセットパターン510,530にて読み出されるグローバル変数の読み出しが行われない通常ブロックセットに対応するものとなっている。このブロックセットパターン520は、ブロック521,523,525と、結線522,524から構成されており、ブロック521は、グローバル変数Yから値を読み出して出力値とする。また、ブロック523は、ブロック521の出力値を入力(引数)として処理Bを実行すると共に、実行結果を出力値とし、ブロック525は、ブロック523の出力値をローカル変数tmpに書き込む。
そして、コード生成ツール100では、第4異常パターン500に対応する異常ブロック群がこれに対応する変換方法データに基づき変換され、第4正常パターン540に対応する正常ブロック群が生成される(図5(b))。
この第4正常パターン540は、処理優先度B1のブロックセットパターン520aと、処理優先度B2のブロックセットパターン550とから構成されており、ブロックセットパターン520aは、第4異常パターン500におけるブロックセットパターン520と同様に構成されている。
また、ブロックセットパターン550は、第4正常パターン540におけるブロック511,513,533,535,537と、入力値(グローバル変数Xの値)をローカル変数に保存すると共に、該値を出力値とするラッチブロック552から構成されている。
図2(b)〜5(b)に記載されているように、第1〜4正常パターン240〜540に対応する正常ブロック群では、それぞれ、第1〜4異常パターン200〜500に対応する異常ブロック群と同様の処理が実現される。また、これらの正常ブロック群では、グローバル変数Xの値(或いは、グローバル変数に保存される値)をローカル変数に保存するラッチブロックが新たに加えられているため、他のタスク等によるグローバル変数Xの更新により異常が発生することは無い。
なお、図2(b)〜4(b)には、コード生成ツール100により、第1〜3正常パターン240〜440に対応する正常ブロック群に基づき生成されたソースコード250〜450が記載されている。これらのソースコードから、各異常パターンに対応する変換方法の適用により、対応する異常ブロック群と同様の処理を実現可能としつつ、他のタスク等によるグローバル変数Xの更新の影響が排除されることがわかる。
また、第1〜3異常パターン200〜400に対応する異常ブロック群は、該異常ブロック群を構成する各ブロックが示す処理手順の実行順序を維持したまま、正常ブロック群に変換される。このことは、異常ブロック群から生成されたソースコードと、対応する正常ブロック群から生成されたソースコードを比較しても明らかである。
このため、異常ブロック群により実現される処理と、該異常ブロック群を変換して得られる正常ブロック群により実現される処理との間に相違が生じることを、極力防ぐことができる。
また、第4異常パターン500では、同一グローバル変数Xの読み出しが行われる2つのブロックセットパターン510,530の処理優先度がA1,A3、該グローバル変数Xの読み出しが行われないブロックセットパターン520の処理優先度はA2となっている。このため、ブロックセットパターン510,530により記述された処理の合間に、ブロックセットパターン520により記述された処理が実行される。
このように、本実施形態のコード生成ツール100によれば、同一グローバル変数の読み出しが行われる複数のブロックセットパターンに対応する各処理が連続的に実行される場合に限らず、間隔を空けて実行される場合であっても、他のタスク等によるグローバル変数の更新の影響を排除することができる。
なお、上述した第1〜4異常パターン200〜500や第1〜4正常パターン240〜540は、あくまでも一例であり、これらに限定されること無く、様々な構成の異常パターンや正常パターンを用いることができる。
次に、コード生成装置として動作するPC1が、制御モデル150から異常ブロック群を検出し、正常ブロック群に置き換えるコード生成処理について、図6に記載のフローチャートを用いて説明する。なお、本処理は、入力装置60を介して受け付けた操作に応じて実行される。
S605では、PC1のCPU30は、開発者により作成され、HDD20やRAM50に保存されている制御モデル150を読み込むと共に、読み込んだ制御モデル150をコピーし、変換モデルとしてRAM50に保存し、S610に処理を移行する。なお、この制御モデル150は、OSにより制御されるマルチタスクのプログラムにおける各タスクの動作を記述したものとなっており、各タスクの動作は、1または複数の関数ブロック(ブロックセットの集合体)として記述されている。
S610では、CPU30は、変換モデルにおけるいずれかの関数ブロックを読み出し、該関数ブロックにて同一のグローバル変数の読み出しが2箇所以上で行われ、且つ、グローバル変数の読み出し箇所が異なるブロックセットであるか否かを判定する(換言すれば、同一グローバル変数の読み出しを行うブロックを有するアクセスブロックセットが、関数ブロックに複数含まれているか否かを判定する)。そして、肯定判定が得られた場合には(S615:Yes)、S620に処理を移行し、否定判定が得られた場合には(S615:No)、S630に処理を移行する。
S620では、CPU30は、HDD20に保存されている異常パターンデータを読み出し、関数ブロックから該異常パターンデータが示す異常パターンに対応する異常ブロック群を検出する。具体的には、関数ブロックを構成するブロック群を抽出すると共に、該ブロック群と異常パターンデータが示す各異常パターンと比較し、該ブロック群が異常パターンに対応するものである場合には、該ブロック群を異常ブロック群として検出する。
続くS625では、異常ブロック群が検出された場合には、CPU30は、HDD20に保存されている変換方法データを読み出し、該異常ブロック群に対応する正常パターンを特定する。そして、検出された異常ブロック群を、該正常パターンに基づき正常ブロック群に変換すると共に、変換モデルにおける該異常ブロック群を正常ブロック群に置き換え、S630に処理を移行する。なお、S620で異常ブロック群が検出されなかった場合には、CPU30は、S625の処理を省略してS630に処理を移行する。
S630では、CPU30は、変換モデルにおける全ての関数ブロックについての異常ブロック群の検出が完了したか否かを判定する。そして、肯定判定が得られた場合には(S630:Yes)、S635に処理を移行し、否定判定が得られた場合には(S630:No)、S610に処理を移行する。
S635では、CPU30は、変換モデルのシミュレーションを行うと共に、実行結果をディスプレイ10に表示し、S640に処理を移行する。
S640では、CPU30は、変換モデルからソースコードを生成し、本処理を終了する。
S640では、CPU30は、変換モデルからソースコードを生成し、本処理を終了する。
このように、コード生成処理では、タスクを構成する関数ブロック単位で異常ブロック群の検出が行われ、検出された異常ブロック群が正常ブロック群に置き換えられる。このため、タスクの複数箇所で同一グローバル変数の読み出しが行われる場合であっても、他のタスク等による該グローバル変数の更新による異常の発生を防ぐことができる。
また、コード生成処理では、同一グローバル変数の読み出しを行うアクセスブロックセットを複数含む関数ブロックを対象として異常ブロック群の検出が行われ、検出された異常ブロック群が正常ブロック群に置き換えられる。このため、全ての関数ブロックを対象として異常ブロック群の検出を行う場合に比べ、処理負荷を低減させることができる。
また、正常ブロックには、実現される処理とは直接関係無いラッチブロックが含まれており、正常ブロックは、変換元の異常ブロックに比べ複雑な構造を有している。このため、制御モデルに含まれる異常ブロック群を正常ブロック群に置き換えた場合には、制御モデルの構造が複雑化し、記述されている内容がわかり難くなるおそれがある。
これに対し、コード生成処理では、制御モデル150をコピーして得られた変換モデルにおける異常ブロック群が正常ブロック群に置き換えられ、制御モデル150は元の記述のままに維持される。このため、制御モデル150がわかり難い構造に書き換えられてしまうことを防ぐことができる。
また、コード生成処理では、異常ブロック群が正常ブロック群に置き換えられた変換モデルのシミュレーションが行われる。このため、制御モデル150から生成されたソースコードを実装する前に、制御モデル150の問題点や、異常ブロック群を正常ブロック群に置き換えたことの影響を調べることができ、制御モデルの検証作業をより容易にすることができる。
[他の実施形態]
(1)本実施形態のコード生成処理では、OSにより制御されるマルチタスクのプログラムにおける各タスクの動作を記述した制御モデル150が読み込まれ、該制御モデルにおける異常ブロック群が正常ブロック群に変換される。
(1)本実施形態のコード生成処理では、OSにより制御されるマルチタスクのプログラムにおける各タスクの動作を記述した制御モデル150が読み込まれ、該制御モデルにおける異常ブロック群が正常ブロック群に変換される。
しかしながら、これに限定されることは無く、OSにより制御されていないプログラムの動作を記述した制御モデル150に対し同様の処理を行っても良い。このような場合には、いわゆるメインループ等から周期的にコールされる処理や、外部からの信号の入力をトリガとして実行される処理等、モジュール化された各処理を記述した複数の関数ブロックを対象として、S610〜S630の処理を実行することが考えられる。
このような制御モデル150を対象としてコード生成処理を実行した場合であっても、同様の効果を得ることができる。
(2)また、本実施形態のコード生成処理では、開発者により作成された制御モデル150を改変せず、該制御モデル150をコピーした変換モデルに含まれる異常ブロック群を正常ブロック群に置き換えている。しかしながら、該制御モデル150に含まれる異常ブロック群を正常ブロック群に置き換えても良く、このような場合であっても、変換モデルを改変する場合と同様に、制御モデル150の作成を容易化する等の効果が得られる。
(2)また、本実施形態のコード生成処理では、開発者により作成された制御モデル150を改変せず、該制御モデル150をコピーした変換モデルに含まれる異常ブロック群を正常ブロック群に置き換えている。しかしながら、該制御モデル150に含まれる異常ブロック群を正常ブロック群に置き換えても良く、このような場合であっても、変換モデルを改変する場合と同様に、制御モデル150の作成を容易化する等の効果が得られる。
(3)また、本実施形態のコード生成処理では、異常ブロック群が正常ブロック群に置き換えられた変換モデルについてのシミュレーションを行った後に、該変換モデルからソースコードが生成される。
しかしながら、シミュレーションを行うことなく変換モデルからソースコードを生成する構成としても良い。このような場合であっても、制御モデル150の作成を容易化する等の効果が得られる。
また、ソースコードを生成せず、シミュレーションのみを行っても良く、このような場合であっても、異常ブロック群が正常ブロック群に置き換えられた制御モデル150の検証を行うことができる。
(4)また、本実施形態のコード生成処理では、制御モデル150を構成する関数ブロック毎に、同一グローバル変数の読み出しが2箇所以上で行われているか否かを判定し、肯定判定が得られた関数ブロック群を対象に異常パターンを用いた異常ブロック群の検出を行っている。しかしながら、関数ブロックを構成するブロック群毎に同様にして異常ブロック群の検出を行っても良いし、複数の関数ブロックの集まり毎に同様の検出を行っても良い。また、上記判定を行うこと無く、全ての関数ブロックに対し異常パターンを用いた異常ブロック群の検出を行っても良い。
このような場合であっても、制御モデルの作成を容易化する等の効果が得られる。
[特許請求の範囲との対応]
上記実施形態の説明で用いた用語と、特許請求の範囲の記載に用いた用語との対応を示す。
[特許請求の範囲との対応]
上記実施形態の説明で用いた用語と、特許請求の範囲の記載に用いた用語との対応を示す。
コード生成ツール100がコード生成プログラムに相当する。
また、第1〜4異常パターン200,300,400,500がパターンに相当し、第1〜4正常パターン240〜540が変換方法に相当する。
また、第1〜4異常パターン200,300,400,500がパターンに相当し、第1〜4正常パターン240〜540が変換方法に相当する。
また、PC1のHDD20がパターン登録手段,変換方法登録手段,記憶媒体に相当する。
また、コード生成処理のS605が読込手段に、S615が検出手段に、S620が検出手段,パターン読出し手段に、S625が変換手段,変換方法読出し手段に、S635がシミュレーション手段に、S640が生成手段に相当する。
また、コード生成処理のS605が読込手段に、S615が検出手段に、S620が検出手段,パターン読出し手段に、S625が変換手段,変換方法読出し手段に、S635がシミュレーション手段に、S640が生成手段に相当する。
1…PC、10…ディスプレイ、20…HDD、30…CPU、40…ROM、50…RAM、60…入力装置、100…コード生成ツール、150…制御モデル、200…第1異常パターン、240…第1正常パターン、300…第2異常パターン、340…第2正常パターン、400…第3異常パターン、440…第3正常パターン、500…第4異常パターン、540…第4正常パターン。
Claims (10)
- 予め定められた処理手順を示すブロック同士を該ブロック間のデータの入出力を表す結線により繋ぐことでプログラムを記述した制御モデルを読み込む読込手段(S605)と、
前記制御モデルを構成する前記ブロックと前記結線との集まりであるブロック群のうち、当該ブロック群により記述された処理を中断して行われる他の処理により更新される同一のグローバル変数にアクセスする箇所を少なくとも二つ有し、該グローバル変数への前記アクセスの間隙に前記他の処理により該グローバル変数が更新されると、記述された処理に異常をきたすおそれがあるものを異常ブロック群とし、該異常ブロック群をなす前記ブロックと前記結線との組合せのパターン(200,300,400,500)を登録しているパターン登録手段(20)と、
前記パターン登録手段に登録されている前記パターンに対応する前記異常ブロック群を、該異常ブロック群と同様の処理を実現しつつ、前記グローバル変数の値を退避させるラッチブロック(243,342,442,552)を加えることで前記異常の発生を防止可能となる正常ブロック群に変換するための変換方法(240,340,440,540)を登録している変換方法登録手段(20)と、
前記読込手段により読み込まれた前記制御モデルから、前記パターン登録手段に登録されている前記パターンに対応する前記異常ブロック群を検出する検出手段(S615,S620)と、
前記検出手段により検出された前記異常ブロック群に対応する前記パターンについての前記変換方法により、該異常ブロック群を前記正常ブロック群に変換する変換手段(S625)と、
前記異常ブロック群が、前記変換手段により該異常ブロック群から変換された前記正常ブロック群に置き換えられた前記制御モデルに基づき、ソースコードを生成する生成手段(S640)と、
を備えることを特徴とするコード生成装置。 - 請求項1に記載のコード生成装置において、
前記結線により直接的或いは間接的に互いにつなぎ合わされた前記ブロックの集まりをブロックセットとし、
前記パターン登録手段に登録されている前記パターンとは、複数の前記ブロックセットから構成され、これらのうちの少なくとも二つは、同一の前記グローバル変数への前記アクセスがなされるアクセスブロックセットである前記異常ブロック群に対応するものであること、
を特徴とするコード生成装置。 - 請求項2に記載のコード生成装置において、
前記制御モデルでは、当該制御モデルを構成する前記各ブロックセットにより記述された処理の優先度が定められており、
前記変換方法登録手段に登録されている前記変換方法とは、前記異常ブロック群を構成する前記ブロックセットの前記優先度と、前記結線により表された該ブロックセットを構成する前記ブロック同士の繋がりとから特定される、該異常ブロック群を構成する前記各ブロックが示す前記処理手順の実行順序を変えることなく、該異常ブロック群を前記正常ブロック群に変換する方法(240,340,440)であること、
を特徴とするコード生成装置。 - 請求項2または請求項3に記載のコード生成装置において、
前記制御モデルでは、当該制御モデルを構成する前記各ブロックセットにより記述された処理の優先度が定められており、
前記パターン登録手段に登録されている前記パターンとは、前記アクセスブロックセットではない通常ブロックセットを含む3以上の前記ブロックセットから構成され、前記通常ブロックセットとして、いずれかの前記アクセスブロックセットよりも前記優先度が高く、且つ、他の前記アクセスブロックセットよりも前記優先度が低いものを有する前記異常ブロック群に対応するもの(500)であること、
を特徴とするコード生成装置。 - 請求項1から請求項4のうちのいずれか1項に記載のコード生成装置において、
前記異常ブロック群における前記グローバル変数への前記アクセスとは、該グローバル変数の読み出しであること、
を特徴とするコード生成装置。 - 請求項5に記載のコード生成装置において、
前記検出手段は、前記読込手段により読み込まれた前記制御モデルを構成する前記ブロック群の中から、同一の前記グローバル変数への前記アクセスを行う箇所を少なくとも二つ有するものを判別し(S615)、判別した前記ブロック群の中から、前記パターン登録手段に登録されている前記パターンに対応する前記異常ブロック群を検出すること(S620)、
を特徴とするコード生成装置。 - 請求項1から請求項6のうちのいずれか1項に記載のコード生成装置において、
前記制御モデルは、マルチタスクの前記プログラムを記述したものであり、
前記パターン登録手段に登録されている前記パターンに対応する前記異常ブロック群により記述された処理とは、一のタスクにおける処理であり、該異常ブロック群により記述された処理を中断して行われる前記他の処理とは、該タスクとは別のタスクにおける処理であること、
を特徴とするコード生成装置。 - 請求項1から請求項7のうちのいずれか1項に記載のコード生成装置において、
前記変換手段は、前記読込手段により読み込まれた前記制御モデルを構成する前記異常ブロック群を、該異常ブロック群に対応する前記パターンについての前記変換方法により前記正常ブロック群に変換し、該制御モデルを構成する前記異常ブロック群を該正常ブロックに置き換えた新たな前記制御モデルである変換モデルを生成し、
前記生成手段は、前記変換手段により生成された新たな前記変換モデルに基づき、ソースコードを生成すること、
を特徴とするコード生成装置。 - 請求項1から請求項8のうちのいずれか1項に記載のコード生成装置において、
前記異常ブロック群が、前記変換手段により該異常ブロック群から変換された前記正常ブロック群に置き換えられた前記制御モデルについて、シミュレーションを行うシミュレーション手段(S635)をさらに備えること、
を特徴とするコード生成装置。 - 予め定められた処理手順を示すブロック同士を該ブロック間のデータの入出力を表す結線により繋ぐことでプログラムを記述した制御モデルを読み込む読込手段(S605)と、
前記制御モデルを構成する前記ブロックと前記結線との集まりであるブロック群のうち、当該ブロック群により記述された処理を中断して行われる他の処理により更新される同一のグローバル変数にアクセスする箇所を少なくとも二つ有し、該グローバル変数への前記アクセスの間隙に前記他の処理により該グローバル変数が更新されると、記述された処理に異常をきたすおそれがあるものを異常ブロック群とし、該異常ブロック群をなす前記ブロックと前記結線との組合せのパターン(200,300,400,500)を記憶媒体から読み出すパターン読出し手段(S620)と、
前記パターンに対応する前記異常ブロック群を、該異常ブロック群と同様の処理を実現しつつ、前記グローバル変数の値を退避させるラッチブロック(243,342,442,552)を加えることで前記異常の発生を防止可能となる正常ブロック群に変換するための変換方法(240,340,440,540)を記憶媒体から読み出す変換方法読出し手段(S625)と、
前記読込手段により読み込まれた前記制御モデルから、前記パターン読出し手段により読み出された前記パターンに対応する前記異常ブロック群を検出する検出手段(S615,S620)と、
前記変換方法読出し手段により読み出された、前記検出手段により検出された前記異常ブロック群に対応する前記パターンについての前記変換方法により、該異常ブロック群を前記正常ブロック群に変換する変換手段(S625)と、
前記異常ブロック群が、前記変換手段により該異常ブロック群から変換された前記正常ブロック群に置き換えられた前記制御モデルに基づき、ソースコードを生成する生成手段(S640)と、
してコンピュータを動作させることを特徴とするコード生成プログラム(100)。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012022058A JP2013161219A (ja) | 2012-02-03 | 2012-02-03 | コード生成装置、及びコード生成プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012022058A JP2013161219A (ja) | 2012-02-03 | 2012-02-03 | コード生成装置、及びコード生成プログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2013161219A true JP2013161219A (ja) | 2013-08-19 |
Family
ID=49173423
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012022058A Pending JP2013161219A (ja) | 2012-02-03 | 2012-02-03 | コード生成装置、及びコード生成プログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2013161219A (ja) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP6305598B1 (ja) * | 2017-03-24 | 2018-04-04 | 三菱電機株式会社 | 自動修正装置 |
JP2020144509A (ja) * | 2019-03-05 | 2020-09-10 | 株式会社デンソー | 自動コード生成方法、及び自動コード生成プログラム |
CN112035347A (zh) * | 2020-08-26 | 2020-12-04 | 北京航空航天大学 | 一种源代码的自动异常处理方法 |
-
2012
- 2012-02-03 JP JP2012022058A patent/JP2013161219A/ja active Pending
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP6305598B1 (ja) * | 2017-03-24 | 2018-04-04 | 三菱電機株式会社 | 自動修正装置 |
JP2018163432A (ja) * | 2017-03-24 | 2018-10-18 | 三菱電機株式会社 | 自動修正装置 |
JP2020144509A (ja) * | 2019-03-05 | 2020-09-10 | 株式会社デンソー | 自動コード生成方法、及び自動コード生成プログラム |
JP7156094B2 (ja) | 2019-03-05 | 2022-10-19 | 株式会社デンソー | 自動コード生成方法、及び自動コード生成プログラム |
CN112035347A (zh) * | 2020-08-26 | 2020-12-04 | 北京航空航天大学 | 一种源代码的自动异常处理方法 |
CN112035347B (zh) * | 2020-08-26 | 2022-03-01 | 北京航空航天大学 | 一种源代码的自动异常处理方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8776014B2 (en) | Software build analysis | |
CN111796831B (zh) | 一种多芯片兼容的编译方法和装置 | |
US7536678B2 (en) | System and method for determining the possibility of adverse effect arising from a code change in a computer program | |
JP2010134614A (ja) | 並列化処理方法、システム、及びプログラム | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
JP5910108B2 (ja) | 高位合成装置,高位合成方法,高位合成プログラム,集積回路の設計方法 | |
JP2014241021A (ja) | ソフトウェア評価装置および方法 | |
JP6861844B2 (ja) | ソースコードを生成するための方法 | |
WO2013085887A1 (en) | Automatic modularization of source code | |
CN105446712A (zh) | 一种应用程序缺陷修补方法及装置 | |
EP2141587A1 (en) | Method and system for generating of a control flow graph for representing a program code | |
US20090187892A1 (en) | Apparatus and program for test case generation | |
JP2013161219A (ja) | コード生成装置、及びコード生成プログラム | |
US11126408B2 (en) | Incremental code generation method | |
JP2009237610A (ja) | コード変換装置及びコード変換方法 | |
JP2012198804A (ja) | 設計支援装置、設計支援プログラム | |
Křikava et al. | SIGMA: Scala internal domain-specific languages for model manipulations | |
Willnecker et al. | Model-based prediction of automatic memory management and garbage collection behavior | |
JP2016128941A (ja) | 出力判定装置、出力判定方法、出力判定プログラム、及び、静的解析装置 | |
CN114064114A (zh) | 一种动态库生成方法及装置 | |
Pinto et al. | A methodology and framework for software memoization of functions | |
JP2007080049A (ja) | 組み込み用プログラム生成方法、組み込み用プログラム開発システム、及び情報テーブル部 | |
JP2013105349A (ja) | 動的リンクライブラリの更新、実行方法 | |
JP2018147114A (ja) | テストケース生成方法、計算機及びプログラム | |
JP5428050B2 (ja) | 計算機システム、及び、モジュール実行方法 |