本節では組み込みソフトウェアで代表的なリアルタイム制御系ソフトウェアを 扱い,モデルベース開発ソフトウェアの特徴について述べる.はじめに,リアル タイム制御系ソフトウェアの例として,Mathwork社により公開されている燃料比 制御システムの気流推定のサブシステム[Mata]を図3.1に示す.
図3.1のモデルではスロットル開度,速度,排出ガス,吸気圧力等のセンサー情 報(sensors)や燃料噴射モード(fuel mode)を入力として,推定気流(est airflow)を 算出する.図3.1内では
・Sumブロック(Sum, Sum1)による加減算
・Productブロック(Product, Product1, Product2)による乗算
・Relational Operatorブロック(Relational Operator, Relational Operator1)による比 較演算
・Switchブロック(Switch)による信号の切り替え(分岐)
・Lookup Tableブロック(Lookup Table, Lookup Table2)による数学関数の近似 等で構成される.
リアルタイム制御系ソフトウェアではセンサー情報,ドライバーによる指示や モードで処理を切り替えるため,Relational OperatorやSwitchブロックを使った比 較演算や条件分岐の処理が多い構成になる.また,図3.1中でLookup Tableが使 われているように,リアルタイム制御系ソフトウェアを組み込みプロセッサで動
図3.1: リアルタイム制御系のSimulinkモデルの例
作させる際に,プロセッサの計算量の問題からMath Functionブロックのような数 学演算ではなく,テーブル探索から近似処理を行うLookup Tableを使うことが一 般的である[KLBS04, WHKS14].
図3.1に対して,Embedded CoderによりCコード生成した中の一部分を図3.2 に示す.airflow calc step関数は図3.1内の処理を実行するアルゴリズム関数であ る.例えば,図3.1上のSumとSum1が24から25行目と32行目の加減算処理に 該当する.Product,Product1とProduct2が17行目,38行目と19行目の乗算処理 に該当する.Relational OperatorとRelational Operator1は28行目と9行目の比較 演算に該当する.Switchは27行目から41行目のif elseの条件分岐に該当する.ま た,Lookup Table1とLookup Table2は13行目と34行目のlook2 iflf linlcaの関数 呼び出しに該当する.
1 /* Model step function */
2 void airflow_calc_step(void)
3 {
4 boolean_T rtb_enable_integration;
5 real32_T rtb_Product2;
6 real32_T rtb_LookupTable2;
7 real32_T ThrottleTransient_tmp;
8
9 rtb_enable_integration = (rtU.fuel_mode == LOW);
10
11 rtb_enable_integration = (rtU.O2_normal && rtb_enable_integration);
12
13 rtb_Product2 = look2_iflf_linlca(rtU.es_o.speed, rtU.es_o.map,
14 rtConstP.LookupTable_bp01Data, rtConstP.LookupTable_bp02Data,
15 rtConstP.LookupTable_tableDa, rtConstP.LookupTable_maxIndex, 18U);
16
17 rtb_Product2 *= rtU.es_o.speed;
18
19 rtb_Product2 *= rtU.es_o.map;
20
21 ThrottleTransient_tmp = rtU.es_o.throttle;
22 ThrottleTransient_tmp -= -0.8F * rtDWork.ThrottleTransient_states;
23 rtY.est_airflow = 0.01F * ThrottleTransient_tmp;
24 rtY.est_airflow += -0.01F * rtDWork.ThrottleTransient_states;
25 rtY.est_airflow += rtb_Product2;
26
27 if (rtb_enable_integration) {
28 rtb_enable_integration = (rtU.es_o.ego <= 0.5F);
29
30 rtb_Product2 = rtb_enable_integration;
31
32 rtb_Product2 -= 0.5F;
33
34 rtb_LookupTable2 = look2_iflf_linlca(rtU.es_o.speed, rtU.es_o.map,
35 rtConstP.LookupTable2_bp01Data, rtConstP.LookupTable2_bp02Data,
36 rtConstP.LookupTable2_tableDa, rtConstP.LookupTable2_maxIndex, 6U);
37
38 rtb_Product2 *= rtb_LookupTable2;
39 } else {
40 rtb_Product2 = 0.0F;
41 }
42
43 rtY.fb_correction = rtDWork.DiscreteIntegrator_DSTATE;
44
45 rtDWork.DiscreteIntegrator_DSTATE += 0.01F * rtb_Product2;
46
47 rtDWork.ThrottleTransient_states = ThrottleTransient_tmp;
48 }
図3.2: Embedded Coderを使って自動生成されたCコードの例
このように,モデルベース開発されたリアルタイム制御系ソフトウェアには比 較演算,条件分岐,算術代入文,Lookup Table等が多く存在し,ループ処理がほ とんど存在しないという特徴がある.そのため,科学技術計算等で行われてきた ループ並列化による高速化が実現できない.そこで,このようなループがなく,比 較演算,条件分岐,算術代入文,Lookup Table等で構成されるモデルベース開発 されたリアルタイム制御系ソフトウェアをOSCAR自動並列化コンパイラの粗粒 度タスク並列処理により高速化する.