Changeset 285 for rubycfg_ssp/trunk/task.trb
- Timestamp:
- May 2, 2017, 5:55:20 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
rubycfg_ssp/trunk/task.trb
-
Property svn:mime-type
set to
text/plain; charset=utf-8
r284 r285 11 11 # Nagoya Municipal Industrial Research Institute, JAPAN 12 12 # 13 # ä¸è¨èä½æ¨©è 14 ã¯ï¼ä»¥ä¸ã®(1)ã(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 15 # ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 16 # å¤ã»åé 17 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 18 # (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 19 # 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 20 # ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 21 # (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 22 # ç¨ã§ããå½¢ã§åé 23 å¸ããå ´åã«ã¯ï¼åé 24 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 25 # è 26 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 27 # ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 28 # (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 29 # ç¨ã§ããªãå½¢ã§åé 30 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 31 # ã¨ï¼ 32 # (a) åé 33 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 34 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 35 # ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 36 # (b) åé 37 å¸ã®å½¢æ 38 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 39 # å ±åãããã¨ï¼ 40 # (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 41 # 害ãããï¼ä¸è¨èä½æ¨©è 42 ããã³TOPPERSããã¸ã§ã¯ããå 43 責ãããã¨ï¼ 44 # ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 45 # ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 46 ããã³TOPPERSããã¸ã§ã¯ãã 47 # å 48 責ãããã¨ï¼ 49 # 50 # æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 51 ã 52 # ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 53 # ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 54 # ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 55 # ã®è²¬ä»»ãè² ããªãï¼ 13 # 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 14 # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 15 # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 16 # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 17 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 18 # スコード中に含まれていること. 19 # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 20 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 21 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 22 # の無保証規定を掲載すること. 23 # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 24 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 25 # と. 26 # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 27 # 作権表示,この利用条件および下記の無保証規定を掲載すること. 28 # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 29 # 報告すること. 30 # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 31 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 32 # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 33 # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 34 # 免責すること. 35 # 36 # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 37 # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 38 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 39 # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 40 # の責任を負わない. 56 41 # 57 42 # $Id: task.trb 668 2016-03-03 13:57:53Z ertl-hiro $ … … 59 44 60 45 # 61 # ã¿ã¹ã¯ç®¡çã¢ã¸ã¥ã¼ã«ã®çæã¹ã¯ãªãã46 # タスク管理モジュールの生成スクリプト 62 47 # 63 48 … … 73 58 end 74 59 75 # ãªãã¸ã§ã¯ãã®IDçªå·ã®ãã¯ãå®ç¾©ã®çæ60 # オブジェクトのID番号のマクロ定義の生成 76 61 def generateIdMacro() 77 # ã¿ã¹ã¯IDãèµ·ååªå 78 度(atskpri)ã®é«ãé ã« reallocate_atskpri ã¸å²ãå½ã¦ã¦å®ç¾©ã kernel_cfg.h ã¸åºå 62 # タスクIDを起動優先度(atskpri)の高い順に reallocate_atskpri へ割り当てて定義を kernel_cfg.h へ出力 79 63 80 64 ($cfgData[:CRE_TSK].sort_by {|e| e[1][:atskpri].val}).each.with_index(1) do |e, index| … … 83 67 $kernelCfgH.add("#define #{e[1][:tskid].str} #{index}") 84 68 85 # DEF_EPR ã§å®ç¾©ããã¦ããªãã¿ã¹ã¯ã®å®è¡æåªå 86 度ãèµ·ååªå 87 度ã«è¨å®ãã 69 # DEF_EPR で定義されていないタスクの実行時優先度を起動優先度に設定する 88 70 epri = $cfgData[:DEF_EPR].find {|i| i[1][:tskid].val == e[1][:tskid].val} 89 71 if epri … … 98 80 99 81 # 100 # æå®ããã¿ã¹ã¯ã«å¯¾ããã¹ã¿ãã¯ä½¿ç¨éã®æ大ãè¨ç® 101 # å¼æ°ï¼tskidï¼ã¿ã¹ã¯ID(å 102 é¨è¡¨ç¾ï¼èµ·åæåªå 103 度ã®å 104 é¨è¡¨ç¾ã«çãã) 105 # è¿å¤ï¼å½è©²ã¿ã¹ã¯ã«è¶³ãããã¹ã¿ãã¯ä½¿ç¨éã®æ大å¤ï¼ 106 # ãã®å¤ã¯ï¼å½è©²ã¿ã¹ã¯ã®å®è¡éå§ããçµäºã¾ã§ã®éã« 107 # ãã®ã¿ã¹ã¯ã«å¯¾ããããªã¨ã³ãããèæ 108 ®ãã¦ã¹ã¿ãã¯ä½¿ç¨éã 109 # è¨ç®ããå ´åã«ï¼å¯è½æ§ã®ããçµã¿åããã®ä¸ã§æ大ã¨ãªãå¤ãè¿ãï¼ 82 # 指定したタスクに対するスタック使用量の最大を計算 83 # 引数:tskid:タスクID(内部表現.起動時優先度の内部表現に等しい) 84 # 返値:当該タスクに足しするスタック使用量の最大値. 85 # この値は,当該タスクの実行開始から終了までの間に 86 # そのタスクに対するプリエンプトを考慮してスタック使用量を 87 # 計算した場合に,可能性のある組み合わせの中で最大となる値を返す. 110 88 # 111 89 def calc_stksz(tskid, nest_level=1) … … 118 96 119 97 if @stacksize_of_tasks[tskid] 120 # è¨ç®ãæ¢ã«å®äºãã¦ããå ´åï¼è¨ç®ãã¹ããããã98 # 計算が既に完了している場合,計算をスキップする 121 99 $kernelCfgC.add(" * " + ("\t" * nest_level) + "SKIP(max_stksz[#{taskEntry[:tskid].str}] = #{@stacksize_of_tasks[tskid]})") 122 100 stksz = @stacksize_of_tasks[tskid] 123 101 else 124 # å®äºãã¦ããªãå ´å102 # 完了していない場合 125 103 $kernelCfgC.append(" * " + ("\t" * nest_level) + "Task list with higher priority than #{taskEntry[:tskid].str} = ") 126 104 @higher_pri_tsklist[tskid].each.with_index do |id, index| … … 130 108 $kernelCfgC.add() 131 109 132 # å¤æ°ã®åæå110 # 変数の初期化 133 111 higher_pri_maxstksz = 0 134 112 135 # å½è©²ã¿ã¹ã¯ID ã®å®è¡æåªå 136 度ããé«ãèµ·ååªå 137 度ãæã¤ã¿ã¹ã¯ãåå¨ããå ´å 113 # 当該タスクID の実行時優先度より高い起動優先度を持つタスクが存在する場合 138 114 if @higher_pri_tsklist[tskid].size > 0 139 # ããããã®é«åªå 140 度ã¿ã¹ã¯ã«å¯¾ãï¼ã¹ã¿ãã¯è¨ç®ãå®è¡ãã 115 # それぞれの高優先度タスクに対し,スタック計算を実行する 141 116 @higher_pri_tsklist[tskid].each do |id| 142 117 calculated_stack_size = calc_stksz(id, nest_level+1) 143 # æããµã¤ãºã大ãããã®ã ããè¦ãã¦ãã118 # 最もサイズが大きいものだけを覚えておく 144 119 if higher_pri_maxstksz < calculated_stack_size 145 120 higher_pri_maxstksz = calculated_stack_size … … 150 125 $kernelCfgC.add(" * " + ("\t" * nest_level) + "higher_pri_maxstksz[#{taskEntry[:tskid].str}] = #{higher_pri_maxstksz}") 151 126 152 # é«åªå 153 度ã¿ã¹ã¯ã®ã¹ã¿ãã¯ä½¿ç¨éã«ï¼å½è©²ã¿ã¹ã¯ã®ä½¿ç¨éãå ç®ãã 127 # 高優先度タスクのスタック使用量に,当該タスクの使用量を加算する 154 128 stksz = higher_pri_maxstksz + taskEntry[:stksz] 155 129 156 # å½è©²ã¿ã¹ã¯IDã«å¯¾ãã¦è¨ç®æ¸ã¿ã§ãããã¨ãè¨é²130 # 当該タスクIDに対して計算済みであることを記録 157 131 @stacksize_of_tasks[tskid] = stksz 158 132 $kernelCfgC.add(" * " + ("\t" * nest_level) + "DONE(stksz[#{taskEntry[:tskid].str}] = #{stksz})") 159 133 end 160 134 161 # è¦ç©ããã®æ大ãè¿ã135 # 見積もりの最大を返す 162 136 return stksz 163 137 end 164 138 165 # äºåã®ãã§ãã¯139 # 事前のチェック 166 140 def prepare() 167 141 168 142 $cfgData[@api].sort.each do |key, params| 169 143 170 # tskatr ãç¡å¹ï¼E_RSATRï¼171 # ï¼TA_ACTï¼TA_RSTRï¼TA_NULLï¼TARGET_TSKATR以å¤ã®ããããã»ããããã¦ããå ´åï¼144 # tskatrが無効(E_RSATR) 145 #(TA_ACT,TA_RSTR,TA_NULL,TARGET_TSKATR以外のビットがセットされている場合) 172 146 if (params[:tskatr] & ~($TA_ACT|$TA_RSTR|$TARGET_TSKATR)) != 0 173 147 error_illegal_id("E_RSATR", params, :tskatr, :tskid) 174 148 end 175 149 176 # (TMIN_TPRI <= atskpri && atskpri <= TMAX_TPRI) ã§ãªãå ´å150 # (TMIN_TPRI <= atskpri && atskpri <= TMAX_TPRI)でない場合 177 151 if !($TMIN_TPRI <= params[:atskpri] && params[:atskpri] <= $TMAX_TPRI) 178 152 error_illegal_id("E_PAR", params, :atskpri, :tskid) 179 153 end 180 154 181 # atskpri ãéè¤ããå ´å(E_PAR)155 # atskpri が重複する場合 (E_PAR) 182 156 @tsk_apri_list.each do |id| 183 157 if (params[:tskid].val != id) && (params[:atskpri] == $cfgData[@api][id][:atskpri]) … … 186 160 end 187 161 188 # å®è¡æåªå 189 度 162 # 実行時優先度 190 163 if $cfgData[:DEF_EPR][params[:tskid].val] 191 # exepri 㯠TMIN_TPRI ä»¥ä¸ ã㤠TMAX_TPRI 以ä¸(E_PAR)164 # exepri は TMIN_TPRI 以上 かつ TMAX_TPRI 以下(E_PAR) 192 165 exepri = $cfgData[:DEF_EPR][params[:tskid].val][:exepri] 193 166 if $TMIN_TPRI > exepri || $TMAX_TPRI < exepri … … 196 169 end 197 170 198 # exepri 㯠atskpri 以ä¸ã®å¤ããã¤(åªå 199 度ãé«ã) (E_ILUSE) 171 # exepri は atskpri 以下の値をもつ(優先度が高い) (E_ILUSE) 200 172 if exepri > params[:atskpri] 201 173 $defepr_success = false … … 204 176 end 205 177 206 # stksz ãã¿ã¼ã²ããå®ç¾©ã®æå°å¤ï¼TARGET_MIN_STKSZï¼æªå®ç¾©ã®å ´åã¯1ï¼207 # ãããå°ããå ´å178 # stkszがターゲット定義の最小値(TARGET_MIN_STKSZ,未定義の場合は1) 179 # よりも小さい場合 208 180 if params[:stksz] < $TARGET_MIN_STKSZ 209 181 error_ercd("E_PAR", params, "stksz is too small.") 210 182 end 211 183 212 # ã¹ã¿ãã¯ã®å 213 é çªå°(stk) 214 # å 215 ¨ã¦ã®å¦çåä½ã®ã¹ã¿ãã¯ã¯å 216 ±æãããï¼ 217 # ãã®ããï¼ã¹ã¿ãã¯ãµã¤ãºã«é¢ãããã§ãã¯ã¯ 218 # å 219 ±æã¹ã¿ãã¯è¨å®ã®ã¨ããã§ã¾ã¨ãã¦è¡ãï¼ 184 # スタックの先頭番地(stk) 185 # 全ての処理単位のスタックは共有される. 186 # そのため,スタックサイズに関するチェックは 187 # 共有スタック設定のところでまとめて行う. 220 188 if params[:stk] != "NULL" 221 189 error_ercd("E_PAR", params, "stk must be NULL.") … … 224 192 end 225 193 226 # ãã¼ã¿æ§é ã®çæ194 # データ構造の生成 227 195 def generateData() 228 196 229 # äºåæºåï¼ã¨ã©ã¼ãã§ãã¯ï¼ã¡ã¢ãªé åã®çæï¼197 # 事前準備(エラーチェック,メモリ領域の生成) 230 198 prepare() 231 199 232 200 # 233 # ãªãã¸ã§ã¯ãåæåãããã¯ã®çæ201 # オブジェクト初期化ブロックの生成 234 202 # 235 203 init_rdypmap = 0 236 204 237 # ã¿ã¹ã¯å±æ§(tskatr)205 # タスク属性(tskatr) 238 206 $kernelCfgC.append("const ATR\t_kernel_tinib_tskatr[TNUM_TSKID] = {") 239 207 @tsk_apri_list.each.with_index do |id, index| … … 249 217 $kernelCfgC.add("const uint_t\t_kernel_init_rdypmap = #{init_rdypmap}U;") 250 218 251 # æ¡å¼µæ 252 å ±(exinf) 219 # 拡張情報(exinf) 253 220 $kernelCfgC.append("const intptr_t\t_kernel_tinib_exinf[TNUM_TSKID] = {") 254 221 @tsk_apri_list.each.with_index do |id, index| … … 259 226 $kernelCfgC.add("};") 260 227 261 # èµ·åçªå°(task)228 # 起動番地(task) 262 229 $kernelCfgC.append("const TASK\t_kernel_tinib_task[TNUM_TSKID] = {") 263 230 @tsk_apri_list.each.with_index do |id, index| … … 268 235 $kernelCfgC.add("};") 269 236 270 # å®è¡æåªå 271 度(etskpri) 237 # 実行時優先度(etskpri) 272 238 $kernelCfgC.append("const uint_t\t_kernel_tinib_epriority[TNUM_TSKID] = {") 273 239 @tsk_apri_list.each.with_index do |id, index| … … 290 256 291 257 # 292 # åªå 293 度å²ãå½ã¦çµæãåºå 258 # 優先度割り当て結果を出力 294 259 # 295 260 $kernelCfgC.add("/*") … … 302 267 303 268 # 304 # ã¿ã¹ã¯ã®æ大ã¹ã¿ãã¯ä½¿ç¨éã®è¨ç®269 # タスクの最大スタック使用量の計算 305 270 # 306 271 307 # æ¨æ§é ã®ãã¼ã¿ä½æ272 # 木構造のデータ作成 308 273 $root_apri = [] 309 274 (@reallocate_atskpri.sort_by {|id| id[1]}).reverse_each do |id| 310 # åã¿ã¹ã¯æ¯ã«ï¼ãã®å®è¡æåªå 311 度ãããé«ãèµ·åæåªå 312 度ããã¤ã¿ã¹ã¯ã®ãªã¹ããä½ã 313 # ããã¯ããªã¨ã³ãããããå¯è½æ§ã®ããã¿ã¹ã¯ã®ãªã¹ãã¨ãªãï¼ 275 # 各タスク毎に,その実行時優先度よりも高い起動時優先度をもつタスクのリストを作る 276 # それはプリエンプトされる可能性のあるタスクのリストとなる. 314 277 @higher_pri_tsklist[id[0]] = [] 315 278 (@reallocate_atskpri.sort_by {|id| id[1]}).reverse_each do |id2| … … 320 283 end 321 284 322 # ããªã¨ã³ããããã»ãããé¢ä¿ã示ãæ¨æ§é ã®æ ¹(root)ã¨ãªãã¿ã¹ã¯ã®æ¢ç´¢ 323 # 対象ã¿ã¹ã¯(id)ã®èµ·åæåªå 324 度(reallocate_atskpri[id]ããä½ã 325 # (å¤ã¨ãã¦ã¯å¤§ãã)èµ·åæåªå 326 度ããã¤ã¿ã¹ã¯ã® higher_pri_tsklist ã« 327 # 対象ã¿ã¹ã¯(id)ãå«ã¾ããªããã°ï¼æ ¹ã¨ãªã 285 # プリエンプトする・される関係を示す木構造の根(root)となるタスクの探索 286 # 対象タスク(id)の起動時優先度(reallocate_atskpri[id]より低い 287 # (値としては大きい)起動時優先度をもつタスクの higher_pri_tsklist に 288 # 対象タスク(id)が含まれなければ,根となる 328 289 (@reallocate_atskpri.sort_by {|id| id[1]}).reverse_each do |id| 329 290 $is_root = true … … 341 302 342 303 # 343 # åºåéå§304 # 出力開始 344 305 # 345 306 $kernelCfgC.add("/* \n * Task Stack Size Estimation:") 346 307 347 # æ ¹ã¨ãªãã¿ã¹ã¯ã«å¯¾ãï¼ãã®æ大ã¿ã¹ã¯ä½¿ç¨éãè¨ç®ãï¼ãªã¹ãã¸è¿½å ãã308 # 根となるタスクに対し,その最大タスク使用量を計算し,リストへ追加する 348 309 $tstksz = 0 349 310 $stksz_estimated = [] … … 352 313 end 353 314 354 # ã¿ã¹ã¯ã®ã¹ã¿ãã¯ä½¿ç¨éã®æ大å¤ã決å®355 # ãªã¹ãä¸ã®è¦ç´ ã®æ大å¤ãã¿ã¹ã¯ã®æ大ã¹ã¿ãã¯ä½¿ç¨éã¨ãªãï¼315 # タスクのスタック使用量の最大値を決定 316 # リスト中の要素の最大値がタスクの最大スタック使用量となる. 356 317 $tstksz = 0 357 318 $stksz_estimated.each do |size| … … 361 322 end 362 323 363 # 確èª324 # 確認 364 325 $kernelCfgC.add2(<<EOS) 365 326 * List of Estimated Total Stack Sizes of Tasks = #{$stksz_estimated} … … 370 331 371 332 # 372 # åªå 373 度å²ãå½ã¦çµæãæ¨æºåºåã¸è¡¨ç¤º 333 # 優先度割り当て結果を標準出力へ表示 374 334 # 375 335 puts <<~EOS … … 387 347 388 348 # 389 # ã¿ã¹ã¯ç®¡çã«é¢ããæ 390 å ±ã®çæ 391 # 392 393 # å®è¡æåªå 394 度ã®ã³ã³ãã£ã®ã¥ã¬ã¼ã·ã§ã³ã«æåãããã©ãã 349 # タスク管理に関する情報の生成 350 # 351 352 # 実行時優先度のコンフィギュレーションに成功したかどうか 395 353 $defepr_success = true 396 354 -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.