Changeset 95 for ssp_qb_r5f100le_cs/trunk/kernel/task.c
- Timestamp:
- Jun 2, 2015, 3:39:53 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ssp_qb_r5f100le_cs/trunk/kernel/task.c
-
Property svn:mime-type
set to
text/plain; charset=shift_jis
r93 r95 11 11 * Copyright (C) 2010 by Meika Sugimoto 12 12 * 13 * ãLì ÒÍCÈºÌ (1)`(4) Ìðð½·êÉÀèC{\tgEF 14 * Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»EüÏE 15 * ÄzziȺCpÆÄÔj·é±Æð³Åø·éD 16 * (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 17 * \¦C±Ìpð¨æѺL̳ÛØKèªC»ÌÜÜÌ`Å\[X 18 * R[hÉÜÜêÄ¢é±ÆD 19 * (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉgp 20 * Å«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 21 gipÒ} 22 * j 23 AÈÇjÉCãLÌì \¦C±Ìpð¨æѺLÌ³Û 24 * ØKèðfÚ·é±ÆD 25 * (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉgp 26 * Å«È¢`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·±ÆD 27 * (a) Äzzɺ¤hL 28 gipÒ}j 29 AÈÇjÉCãLÌì 30 * \¦C±Ìpð¨æѺL̳ÛØKèðfÚ·é±ÆD 31 * (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉñ 32 * ·é±ÆD 33 * (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹Q 34 * ©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆDܽC 35 * {\tgEFAÌ[UܽÍGh[U©çÌ¢©ÈéRÉîà 36 * ¿©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 13 * 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ 14 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・ 15 * 再配布(以下,利用と呼ぶ)することを無償で許諾する. 16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権 17 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース 18 * コード中に含まれていること. 19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用 20 * できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ 21 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保 22 * 証規定を掲載すること. 23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用 24 * できない形で再配布する場合には,次のいずれかの条件を満たすこと. 25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作 26 * 権表示,この利用条件および下記の無保証規定を掲載すること. 27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報 28 * 告すること. 29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害 30 * からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また, 31 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ 32 * く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 37 33 * 38 * {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨æ39 * ÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚIÉη40 * éK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEFAÌp41 * Éæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»ÌÓCð42 * íÈ¢D34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ 35 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す 36 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用 37 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負 38 * わない. 43 39 * 44 40 */ … … 48 44 49 45 /* 50 * g[XO}NÌftHgè`46 * トレースログマクロのデフォルト定義 51 47 */ 52 48 … … 60 56 61 57 62 extern const intptr_t tinib_exinf[]; /* ^XNÌg£îñ*/63 extern const TASK tinib_task[]; /* ^XNÌN®Ôn*/64 extern const uint_t tinib_epriority[]; /* ^XNÌÀsDæxià\»j*/65 66 /* àÖÌvg^Cvé¾*/58 extern const intptr_t tinib_exinf[]; /* タスクの拡張情報 */ 59 extern const TASK tinib_task[]; /* タスクの起動番地 */ 60 extern const uint_t tinib_epriority[]; /* タスクの実行時優先度(内部表現) */ 61 62 /* 内部関数のプロトタイプ宣言 */ 67 63 Inline bool_t primap_empty(void); 68 64 Inline bool_t primap_test(uint_t pri); … … 76 72 77 73 /* 78 * ÀsóÔ^XNÌ»ÝDæx74 * 実行状態タスクの現在優先度 79 75 */ 80 76 uint_t runtsk_curpri; 81 77 82 78 /* 83 * ÀsóÔ^XNÌN®Dæx79 * 実行状態タスクの起動時優先度 84 80 */ 85 81 uint_t runtsk_ipri; 86 82 87 83 /* 88 * fBL 89 [T[`̽ßÌrbg}bv 84 * レディキューサーチのためのビットマップ 90 85 */ 91 86 volatile uint_t ready_primap; 92 87 93 88 /* 94 * N®vL 95 [COÌrbg}bv 89 * 起動要求キューイングのビットマップ 96 90 */ 97 91 uint_t actque_bitmap; 98 92 99 93 /* 100 * ^XNfBXpb`N®vtO94 * タスクディスパッチ起動要求フラグ 101 95 */ 102 96 bool_t reqflg; 103 97 104 98 /* 105 * fBXpb`Ö~óÔ99 * ディスパッチ禁止状態 106 100 */ 107 101 bool_t disdsp; 108 102 109 103 /* 110 * read_primap Ìúl104 * read_primapの初期値 111 105 */ 112 106 extern const uint_t init_rdypmap; … … 117 111 118 112 /* 119 * ^XNID©çÌN®Dæxæ¾(^XNReLXgp)113 * タスクIDからの起動時優先度取得(タスクコンテキスト用) 120 114 */ 121 115 uint_t … … 138 132 139 133 /* 140 * ^XNID©çÌN®Dæxæ¾(ñ^XNReLXgp)134 * タスクIDからの起動時優先度取得(非タスクコンテキスト用) 141 135 */ 142 136 #ifdef TOPPERS_get_ipri … … 151 145 152 146 /* 153 * rbg}bvT[`Ö147 * ビットマップサーチ関数 154 148 * 155 * bitmap àÌ1ÌrbgÌàCÅàºÊiEjÌàÌðT[`µC»Ìrb156 * gÔðÔ·DrbgÔÍCźÊrbgð0Æ·éDbitmapÉ0ðwè157 * µÄÍÈçÈ¢D±ÌÖÅÍCbitmapª8rbgÅ é±Æð¼èµC158 * uint8_t ^ƵĢéD149 * bitmap内の1のビットの内,最も下位(右)のものをサーチし,そのビッ 150 * ト番号を返す.ビット番号は,最下位ビットを0とする.bitmapに0を指定 151 * してはならない.この関数では,bitmapが8ビットであることを仮定し, 152 * uint8_t型としている. 159 153 * 160 * rbgT[`½ßðÂvZbTÅÍCrbgT[`½ßðg¤æ¤É161 * «¼µ½ûªø¦ªÇ¢êª éD±Ìæ¤ÈêÉÍC^[Qbg162 * ˶ÅrbgT[`½ßðgÁ½bitmap_searchðè`µC163 * OMIT_BITMAP_SEARCH ð}Nè`·êÎæ¢DܽCrbgT[`½ßÌ164 * T[`ûüªtÈÇÌRÅDæxÆrbgÆÌÎðÏXµ½¢êÉ165 * ÍCPRIMAP_BITð}Nè`·êÎæ¢D154 * ビットサーチ命令を持つプロセッサでは,ビットサーチ命令を使うように 155 * 書き直した方が効率が良い場合がある.このような場合には,ターゲット 156 * 依存部でビットサーチ命令を使ったbitmap_searchを定義し, 157 * OMIT_BITMAP_SEARCHをマクロ定義すればよい.また,ビットサーチ命令の 158 * サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に 159 * は,PRIMAP_BITをマクロ定義すればよい. 166 160 * 167 * ܽCWCuÉffsª éÈçCÌæ¤Éè`µÄWCu168 * ðgÁ½ûªø¦ªÇ¢Â\«à éD161 * また,標準ライブラリにffsがあるなら,次のように定義して標準ライブ 162 * ラリを使った方が効率が良い可能性もある. 169 163 * #define bitmap_search(bitmap) (ffs(bitmap) - 1) 170 164 */ … … 201 195 202 196 /* 203 * N®Dæxrbg}bvªó©Ì`FbN197 * 起動時優先度ビットマップが空かのチェック 204 198 */ 205 199 Inline bool_t … … 210 204 211 205 /* 212 * wèµ½N®DæxÌN®Dæxrbg}bvªZbg³êÄ¢é©Ç¤©Ì`FbN206 * 指定した起動時優先度の起動時優先度ビットマップがセットされているかどうかのチェック 213 207 */ 214 208 Inline bool_t … … 219 213 220 214 /* 221 * N®Dæxrbg}bvÌT[`215 * 起動時優先度ビットマップのサーチ 222 216 */ 223 217 Inline uint_t … … 228 222 229 223 /* 230 * N®Dæxrbg}bvÌZbg224 * 起動時優先度ビットマップのセット 231 225 */ 232 226 Inline void … … 237 231 238 232 /* 239 * N®Dæxrbg}bvÌNA233 * 起動時優先度ビットマップのクリア 240 234 */ 241 235 Inline void … … 246 240 247 241 /* 248 * ÅDæÊ^XNÌT[`242 * 最高優先順位タスクのサーチ 249 243 */ 250 244 … … 261 255 #ifdef TOPPERS_tskdmt 262 256 /* 263 * wèµ½N®DæxÌ^XNªÀsÅ«éóԩǤ©ÌeXg257 * 指定した起動時優先度のタスクが実行できる状態かどうかのテスト 264 258 * 265 259 */ … … 273 267 274 268 /* 275 * ^XNÇW 276 [Ìú» 269 * タスク管理モジュールの初期化 277 270 */ 278 271 … … 283 276 initialize_task(void) 284 277 { 285 /* N®Dæxrbg}bvÌú»*/278 /* 起動時優先度ビットマップの初期化 */ 286 279 ready_primap = init_rdypmap; 287 280 288 /* ^XNDæxÌú»*/281 /* タスク優先度の初期化 */ 289 282 runtsk_curpri = TSKPRI_NULL; 290 283 runtsk_ipri = TSKPRI_NULL; 291 284 292 /* N®vL 293 [COÌú» */ 285 /* 起動要求キューイングの初期化 */ 294 286 actque_bitmap = 0U; 295 287 296 /* ÝÖ~tOÌú»*/288 /* 割込み禁止フラグの初期化 */ 297 289 disdsp = false; 298 290 } … … 301 293 302 294 /* 303 * ^XNÌN®295 * タスクの起動 304 296 */ 305 297 … … 314 306 315 307 /* 316 * ÀsóÔ^XNÌ»ÝDæxÆøÅwè³ê½317 * N®ÎÛ^XNÌúDæxðärµCÀsóÔ^XNð318 * ÏX·é©»è·éD308 * 実行状態タスクの現在優先度と引数で指定された 309 * 起動対象タスクの初期優先度を比較し,実行状態タスクを 310 * 変更するか判定する. 319 311 * 320 * ½¾µÀsóÔ^XNðÏX·éêÍfBXpb`Ö~óÔàQÆ·éD312 * ただし実行状態タスクを変更する場合はディスパッチ禁止状態も参照する. 321 313 */ 322 314 if(ipri < runtsk_curpri) { … … 334 326 335 327 /* 336 * ^XNÌÀs328 * タスクの実行 337 329 */ 338 330 … … 342 334 run_task(uint_t ipri) 343 335 { 344 uint_t next_pri; /* ÉÀsJn·é^XNÌN®Dæx*/345 uint_t saved_ipri; /* ÄÑoµ³^XNÌúDæx*/346 uint_t saved_curpri; /* ÄÑoµ³^XNÌ»ÝDæx*/336 uint_t next_pri; /* 次に実行開始するタスクの起動時優先度 */ 337 uint_t saved_ipri; /* 呼び出し元タスクの初期優先度 */ 338 uint_t saved_curpri; /* 呼び出し元タスクの現在優先度 */ 347 339 bool_t cont; 348 340 349 /* ÅDæÊ^XNðÀs·éOÉC»ÝÀsÌ^XNÌ»ÝDæxÆúDæxðÛ¶·é*/341 /* 最高優先順位タスクを実行する前に,現在実行中のタスクの現在優先度と初期優先度を保存する */ 350 342 next_pri = ipri; 351 343 saved_ipri = runtsk_ipri; … … 353 345 354 346 do { 355 /* Às·é^XNÌ»ÝDæxðÀsDæxÉÝè·é*/347 /* 実行するタスクの現在優先度を実行時優先度に設定する */ 356 348 runtsk_curpri = tinib_epriority[next_pri]; 357 349 runtsk_ipri = next_pri; 358 350 359 /* CPU bNð*/351 /* CPUロック解除 */ 360 352 t_unlock_cpu(); 361 353 362 /* ^XNÀsJn*/354 /* タスク実行開始 */ 363 355 (*((TASK)(tinib_task[next_pri])))(tinib_exinf[next_pri]); 364 356 365 357 if (t_sense_lock()) { 366 358 /* 367 * CPU bNóÔÅext_tskªÄÎê½êÍCCPUbNððµ368 * Ä©ç^XNðI¹·éDÀãÍCT[rXR[àÅÌCPU369 * bNðȪ·êÎ梾¯D359 * CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し 360 * てからタスクを終了する.実装上は,サービスコール内でのCPU 361 * ロックを省略すればよいだけ. 370 362 */ 371 363 } 372 364 else { 373 365 /* 374 * ±Ìt_lock_cpuð±ÌºÌdisdspÌÝèÌæ¤ÉµÈ¢ÌÍC375 * CPU bNÉÄxt_lock_cpuðÄÎÈ¢½ßÅ éD366 * このt_lock_cpuをこの下のdisdspの設定のようにしないのは, 367 * CPUロック中に再度t_lock_cpuを呼ばないためである. 376 368 */ 377 369 t_lock_cpu(); 378 370 } 379 371 380 /* ÝDæx}XNÍSðóÔÌ͸ÈÌÅC½àµÈ¢*/372 /* 割込み優先度マスクは全解除状態のはずなので,何もしない */ 381 373 382 374 /* 383 * fBXpb`Ö~óÔÅext_tskªÄÎê½êÍCfBXpb384 * `ÂóÔɵĩç^XNðI¹·éD375 * ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ 376 * チ許可状態にしてからタスクを終了する. 385 377 * 386 * {ÍȺÌæ¤ÉLq·×«Å éªC¢¸êɹædisdspð387 * false É·ê΢¢½ßCPÉfalseÉÝè·éD378 * 本来は以下のように記述すべきであるが,いずれにせよdisdspを 379 * falseにすればいいため,単にfalseに設定する. 388 380 * 389 381 * if (disdsp) { … … 393 385 disdsp = false; 394 386 395 /* rbg}bvNAD*/387 /* ビットマップクリア. */ 396 388 primap_clear(next_pri); 397 389 398 390 cont = false; 399 391 400 /* ^XNN®vL 401 [COÌ`FbN */ 392 /* タスク起動要求キューイングのチェック */ 402 393 if (actque_test(next_pri)) { 403 394 actque_clear(next_pri); … … 405 396 } 406 397 407 /* ¢¸ê©Ì^XNªÀsÂ\óÔÉÈÁÄ¢é©*/398 /* いずれかのタスクが実行可能状態になっているか */ 408 399 if(!primap_empty()) 409 400 { 410 /* ßèæ^XNÌ»ÝDæxæè¢N®DæxðàÂ^XNªN®³ê½©*/401 /* 戻り先タスクの現在優先度より高い起動時優先度をもつタスクが起動されたか */ 411 402 next_pri = search_schedtsk(); 412 403 if(saved_curpri > next_pri) … … 424 415 425 416 /* 426 * ^XNfBXpb`417 * タスクディスパッチャ 427 418 */ 428 419 … … 434 425 do { 435 426 if(!primap_empty()) { 436 /* ^XNÌJn*/427 /* タスクの開始 */ 437 428 run_task(search_schedtsk()); 438 429 } -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.