Ignore:
Timestamp:
Mar 8, 2016, 8:37:45 PM (8 years ago)
Author:
coas-nagasima
Message:

MIMEにSJISを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • UsbWattMeter/trunk/asp_dcre/kernel/task.h

    • Property svn:mime-type changed from text/x-chdr to text/x-chdr; charset=SHIFT_JIS
    r164 r167  
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
    11  *  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    12  *  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    13  *  •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    14  *  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    15  *      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    16  *      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    17  *  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    18  *      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    19 ƒƒ“ƒgi—˜—p
    20  *      ŽÒƒ}ƒjƒ
    21 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    22  *      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    23  *  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    24  *      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    25  *      ‚ƁD
    26  *    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    27 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    28 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    29  *        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    30  *    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    31  *        •ñ‚·‚邱‚ƁD
    32  *  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    33  *      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    34  *      ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    35  *      —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    36  *      –Ɛӂ·‚邱‚ƁD
     11 *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     12 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     13 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     14 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     15 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     16 *      スコード中に含まれていること.
     17 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     18 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     19 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     20 *      の無保証規定を掲載すること.
     21 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     22 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     23 *      と.
     24 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     25 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     26 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     27 *        報告すること.
     28 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     29 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     30 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     31 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     32 *      免責すること.
    3733 *
    38  *  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    39  *  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    40  *  ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    41  *  ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    42  *  ‚̐ӔC‚𕉂í‚È‚¢D
     34 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     35 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     36 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     37 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     38 *  の責任を負わない.
    4339 *
    4440 *  $Id$
     
    4642
    4743/*
    48  *              ƒ^ƒXƒNŠÇ—ƒ‚ƒWƒ
    49 [ƒ‹
     44 *              タスク管理モジュール
    5045 */
    5146
     
    5752
    5853/*
    59  *  ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
     54 *  トレースログマクロのデフォルト定義
    6055 */
    6156#ifndef LOG_TSKSTAT
     
    6459
    6560/*
    66  *  ƒ^ƒXƒN—Dæ“x‚Ì“à•”•\Œ»EŠO•”•\Œ»•ÏŠ·ƒ}ƒNƒ
     61 *  タスク優先度の内部表現・外部表現変換マクロ
    6762 */
    6863#define INT_PRIORITY(x)         ((uint_t)((x) - TMIN_TPRI))
     
    7065
    7166/*
    72  *  ƒ^ƒXƒNó‘Ô‚Ì“à•”•\Œ»
    73  *
    74  *  TCB’†‚̃^ƒXƒNó‘Ԃł́CŽÀsó‘ԁiRUNNINGj‚ÆŽÀs‰Â”\ó‘ԁiREADYj
    75  *  ‚Í‹æ•Ê‚µ‚È‚¢D—¼ó‘Ԃ𑍏̂µ‚āCŽÀs‚Å‚«‚éó‘ԁiRUNNABLEj‚ƌĂԁD
    76  *  “ñd‘Ò‚¿ó‘Ԃ́C(TS_WAITING | TS_SUSPENDED)‚Å•\‚·DTS_WAIT_???‚Í‘Ò
    77  *  ‚¿—vˆö‚ð•\‚µC‘Ò‚¿ó‘ԁi“ñd‘Ò‚¿ó‘Ô‚ðŠÜ‚ށj‚̏ꍇ‚ɂ̂ݐݒ肷‚éD
    78  */
    79 #define TS_DORMANT              0x00U                   /* ‹xŽ~ó‘Ô */
    80 #define TS_RUNNABLE             0x01U                   /* ŽÀs‚Å‚«‚éó‘Ô */
    81 #define TS_WAITING              0x02U                   /* ‘Ò‚¿ó‘Ô */
    82 #define TS_SUSPENDED    0x04U                   /* ‹­§‘Ò‚¿ó‘Ô */
    83 
    84 #define TS_WAIT_DLY             (0x00U << 3)    /* ŽžŠÔŒo‰ß‘Ò‚¿ */
    85 #define TS_WAIT_SLP             (0x01U << 3)    /* ‹N°‘Ò‚¿ */
    86 #define TS_WAIT_RDTQ    (0x02U << 3)    /* ƒf[ƒ^ƒLƒ
    87 [‚©‚ç‚ÌŽóM‘Ò‚¿ */
    88 #define TS_WAIT_RPDQ    (0x03U << 3)    /* —Dæ“xƒf[ƒ^ƒLƒ
    89 [‚©‚ç‚ÌŽóM‘Ò‚¿ */
    90 #define TS_WAIT_SEM             (0x04U << 3)    /* ƒZƒ}ƒtƒHŽ‘Œ¹‚ÌŠl“¾‘Ò‚¿ */
    91 #define TS_WAIT_FLG             (0x05U << 3)    /* ƒCƒxƒ“ƒgƒtƒ‰ƒO‘Ò‚¿ */
    92 #define TS_WAIT_SDTQ    (0x06U << 3)    /* ƒf[ƒ^ƒLƒ
    93 [‚Ö‚Ì‘—M‘Ò‚¿ */
    94 #define TS_WAIT_SPDQ    (0x07U << 3)    /* —Dæ“xƒf[ƒ^ƒLƒ
    95 [‚Ö‚Ì‘—M‘Ò‚¿ */
    96 #define TS_WAIT_MBX             (0x08U << 3)    /* ƒ[ƒ‹ƒ{ƒbƒNƒX‚©‚ç‚ÌŽóM‘Ò‚¿ */
    97 #define TS_WAIT_MPF             (0x09U << 3)    /* ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚ÌŠl“¾‘Ò‚¿ */
    98 
    99 /*
    100  *  ƒ^ƒXƒNó‘Ô”»•Êƒ}ƒNƒ
    101  *
    102  *  TSTAT_DORMANT‚̓^ƒXƒN‚ª‹xŽ~ó‘Ô‚Å‚ ‚é‚©‚Ç‚¤‚©‚ðCTSTAT_RUNNABLE‚Í
    103  *  ƒ^ƒXƒN‚ªŽÀs‚Å‚«‚éó‘Ô‚Å‚ ‚é‚©‚Ç‚¤‚©‚ð”»•Ê‚·‚éDTSTAT_WAITING‚Í‘Ò
    104  *  ‚¿ó‘Ô‚Æ“ñd‘Ò‚¿ó‘Ô‚Ì‚¢‚¸‚ê‚©‚Å‚ ‚é‚©‚Ç‚¤‚©‚ðCTSTAT_SUSPENDED‚Í
    105  *  ‹­§‘Ò‚¿ó‘Ô‚Æ“ñd‘Ò‚¿ó‘Ô‚Ì‚¢‚¸‚ê‚©‚Å‚ ‚é‚©‚Ç‚¤‚©‚ð”»•Ê‚·‚éD
     67 *  タスク状態の内部表現
     68 *
     69 *  TCB中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY)
     70 *  は区別しない.両状態を総称して,実行できる状態(RUNNABLE)と呼ぶ.
     71 *  二重待ち状態は,(TS_WAITING | TS_SUSPENDED)で表す.TS_WAIT_???は待
     72 *  ち要因を表し,待ち状態(二重待ち状態を含む)の場合にのみ設定する.
     73 */
     74#define TS_DORMANT              0x00U                   /* 休止状態 */
     75#define TS_RUNNABLE             0x01U                   /* 実行できる状態 */
     76#define TS_WAITING              0x02U                   /* 待ち状態 */
     77#define TS_SUSPENDED    0x04U                   /* 強制待ち状態 */
     78
     79#define TS_WAIT_DLY             (0x00U << 3)    /* 時間経過待ち */
     80#define TS_WAIT_SLP             (0x01U << 3)    /* 起床待ち */
     81#define TS_WAIT_RDTQ    (0x02U << 3)    /* データキューからの受信待ち */
     82#define TS_WAIT_RPDQ    (0x03U << 3)    /* 優先度データキューからの受信待ち */
     83#define TS_WAIT_SEM             (0x04U << 3)    /* セマフォ資源の獲得待ち */
     84#define TS_WAIT_FLG             (0x05U << 3)    /* イベントフラグ待ち */
     85#define TS_WAIT_SDTQ    (0x06U << 3)    /* データキューへの送信待ち */
     86#define TS_WAIT_SPDQ    (0x07U << 3)    /* 優先度データキューへの送信待ち */
     87#define TS_WAIT_MBX             (0x08U << 3)    /* メールボックスからの受信待ち */
     88#define TS_WAIT_MPF             (0x09U << 3)    /* 固定長メモリブロックの獲得待ち */
     89
     90/*
     91 *  タスク状態判別マクロ
     92 *
     93 *  TSTAT_DORMANTはタスクが休止状態であるかどうかを,TSTAT_RUNNABLEは
     94 *  タスクが実行できる状態であるかどうかを判別する.TSTAT_WAITINGは待
     95 *  ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDEDは
     96 *  強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する.
    10697 */
    10798#define TSTAT_DORMANT(tstat)    ((tstat) == TS_DORMANT)
     
    111102
    112103/*
    113  *  ƒ^ƒXƒN‘Ò‚¿—vˆö”»•Êƒ}ƒNƒ
    114  *
    115  *  TSTAT_WAIT_SLP‚̓^ƒXƒN‚ª‹N°‘Ò‚¿‚Å‚ ‚é‚©‚Ç‚¤‚©‚ðCTSTAT_WAIT_WOBJ
    116  *  ‚̓^ƒXƒN‚ª“¯ŠúE’ʐMƒIƒuƒWƒFƒNƒg‚ɑ΂·‚é‘Ò‚¿‚Å‚ ‚é‚©iŒ¾‚¢Š·‚¦‚é‚ƁC
    117  *  “¯Šú’ʐMƒIƒuƒWƒFƒNƒg‚Ì‘Ò‚¿ƒLƒ
    118 [‚ɂ‚Ȃª‚ê‚Ä‚¢‚é‚©j‚Ç‚¤‚©‚ð”»•Ê‚·
    119  *  ‚éD‚Ü‚½CTSTAT_WAIT_WOBJCB‚̓^ƒXƒN‚ª“¯ŠúE’ʐMƒIƒuƒWƒFƒNƒg‚ÌŠÇ—
    120  *  ƒuƒƒbƒN‚Ì‹¤’Ê•”•ªiWOBJCBj‚Ì‘Ò‚¿ƒLƒ
    121 [‚ɂ‚Ȃª‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ð
    122  *  ”»•Ê‚·‚éD
    123  *
    124  *  TSTAT_WAIT_SLP‚́C”CˆÓ‚̃^ƒXƒNó‘Ô‚Ì’†‚©‚çCƒ^ƒXƒN‚ª‹N°‘Ò‚¿‚Å‚ ‚é
    125  *  ‚±‚Æ‚ð”»•Ê‚Å‚«‚éD‚·‚È‚í‚¿CTSTAT_WAITING‚É‚æ‚è‘Ò‚¿ó‘Ô‚Å‚ ‚邱‚Æ‚ð
    126  *  ”»•Ê‚¹‚¸‚ɁCTSTAT_SLP‚¾‚¯‚ð—p‚¢‚Ä‹N°‘Ò‚¿ó‘Ô‚Å‚ ‚邱‚Æ‚ð”»•Ê‚Å‚«‚éD
    127  *  ‚±‚ê‚ðŒø—¦“I‚ÉŽÀŒ»‚·‚邽‚߂ɁCTS_WAIT_SLP‚Ì’l‚ðC(0x00U << 3)‚Å‚Í‚È
    128  *  ‚­(0x01U << 3)‚Æ‚µ‚Ä‚¢‚éD‚»‚Ì‚½‚߁Cƒ^ƒXƒN‚ªŽžŠÔŒo‰ß‘Ò‚¿ó‘Ô‚Å‚ ‚é
    129  *  ‚±‚Æ‚ð”»•Ê‚·‚邽‚ß‚ÌTSTAT_WAIT_DLY‚ðCTSTAT_WAIT_SLP‚Æ“¯—l‚Ì•û–@‚Å
    130  *  ŽÀŒ»‚·‚邱‚Æ‚Í‚Å‚«‚È‚¢D
    131  */
    132 #define TS_WAIT_MASK    (0x0fU << 3)    /* ‘Ò‚¿—vˆö‚ÌŽæo‚µƒ}ƒXƒN */
     104 *  タスク待ち要因判別マクロ
     105 *
     106 *  TSTAT_WAIT_SLPはタスクが起床待ちであるかどうかを,TSTAT_WAIT_WOBJ
     107 *  はタスクが同期・通信オブジェクトに対する待ちであるか(言い換えると,
     108 *  同期通信オブジェクトの待ちキューにつながれているか)どうかを判別す
     109 *  る.また,TSTAT_WAIT_WOBJCBはタスクが同期・通信オブジェクトの管理
     110 *  ブロックの共通部分(WOBJCB)の待ちキューにつながれているかどうかを
     111 *  判別する.
     112 *
     113 *  TSTAT_WAIT_SLPは,任意のタスク状態の中から,タスクが起床待ちである
     114 *  ことを判別できる.すなわち,TSTAT_WAITINGにより待ち状態であることを
     115 *  判別せずに,TSTAT_SLPだけを用いて起床待ち状態であることを判別できる.
     116 *  これを効率的に実現するために,TS_WAIT_SLPの値を,(0x00U << 3)ではな
     117 *  く(0x01U << 3)としている.そのため,タスクが時間経過待ち状態である
     118 *  ことを判別するためのTSTAT_WAIT_DLYを,TSTAT_WAIT_SLPと同様の方法で
     119 *  実現することはできない.
     120 */
     121#define TS_WAIT_MASK    (0x0fU << 3)    /* 待ち要因の取出しマスク */
    133122
    134123#define TSTAT_WAIT_SLP(tstat)           (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP)
     
    137126
    138127/*
    139  *  ‘Ò‚¿î•ñƒuƒƒbƒNiWINFOj‚Ì’è‹`
    140  *
    141  *  ƒ^ƒXƒN‚ª‘Ò‚¿ó‘Ԃ̊Ԃ́CTCB‚¨‚æ‚Ñ‚»‚Ìp_winfo‚ÅŽw‚³‚ê‚éWINFO‚ðŽŸ‚Ì
    142  *  ‚悤‚ɐݒ肵‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    143  *
    144  *  (a) TCB‚̃^ƒXƒNó‘Ô‚ð‘Ò‚¿ó‘ԁiTS_WAITINGj‚É‚·‚éD‚»‚̍ۂɁC‘Ò‚¿
    145  *  —vˆöiTS_WAIT_???j‚àÝ’è‚·‚éD
    146  *
    147  *  (b) ƒ^ƒCƒ€ƒAƒEƒg‚ðŠÄŽ‹‚·‚邽‚߂ɁCƒ^ƒCƒ€ƒCƒxƒ“ƒgƒuƒƒbƒN‚ð“o˜^‚·‚éD
    148  *  “o˜^‚·‚éƒ^ƒCƒ€ƒCƒxƒ“ƒgƒuƒƒbƒN‚́C‘Ò‚¿‚É“ü‚éƒT[ƒrƒXƒR[ƒ‹ˆ—ŠÖ”
    149  *  ‚̃[ƒJƒ‹•Ï”‚Æ‚µ‚ÄŠm•Û‚µC‚»‚ê‚ւ̃|ƒCƒ“ƒ^‚ðWINFO‚Ìp_tmevtb‚É‹L
    150  *  ‰¯‚·‚éDƒ^ƒCƒ€ƒAƒEƒg‚ÌŠÄŽ‹‚ª•K—v‚È‚¢ê‡i‰i‹v‘Ò‚¿‚̏ꍇj‚ɂ́C
    151  *  p_tmevtb‚ðNULL‚É‚·‚éD
    152  *
    153  *  “¯ŠúE’ʐMƒIƒuƒWƒFƒNƒg‚ɑ΂·‚é‘Ò‚¿ó‘Ԃ̏ꍇ‚ɂ́C•W€‚ÌWINFO‚É
    154  *  p_wobjcbƒtƒB[ƒ‹ƒh‚ð’ljÁ‚µ‚½\‘¢‘́iWINFO_WOBJCwait.h‚Å’è‹`j‚ðŽg
    155  *  ‚¤D‚Ü‚½CˆÈ‰º‚Ì(c)`(e)‚̐ݒè‚ðs‚¤•K—v‚ª‚ ‚éD“¯ŠúE’ʐMƒIƒuƒWƒF
    156  *  ƒNƒg‚ÉŠÖŒW‚µ‚È‚¢‘Ò‚¿i‹N°‘Ò‚¿CŽžŠÔŒo‰ß‘Ò‚¿j‚̏ꍇ‚ɂ́C(c)`(e)
    157  *  ‚Í•K—v‚È‚¢D
    158  *
    159  *  (c) TCB‚ð‘Ò‚¿‘Ώۂ̓¯ŠúE’ʐMƒIƒuƒWƒFƒNƒg‚Ì‘Ò‚¿ƒLƒ
    160 [‚ɂ‚Ȃ®D‘Ò
    161  *  ‚¿ƒLƒ
    162 [‚ɂ‚Ȃ®‚½‚߂ɁCtask_queue‚ðŽg‚¤D
    163  *
    164  *  (d) ‘Ò‚¿‘Ώۂ̓¯ŠúE’ʐMƒIƒuƒWƒFƒNƒg‚ÌŠÇ—ƒuƒƒbƒN‚ւ̃|ƒCƒ“ƒ^‚ðC
    165  *  WINFO_WOBJ‚Ìp_wobjcb‚É‹L‰¯‚·‚éD
    166  *
    167  *  (e) ‘Ò‚¿‘Ώۂ̓¯ŠúE’ʐMƒIƒuƒWƒFƒNƒg‚Ɉˑ¶‚µ‚Ä‹L‰¯‚·‚邱‚Æ‚ª•K—v‚È
    168  *  î•ñ‚ª‚ ‚éê‡‚ɂ́CWINFO_WOBJ‚É•K—v‚ȏî•ñ‚Ì‚½‚߂̃tƒB[ƒ‹ƒh‚ð’ljÁ
    169  *  ‚µ‚½\‘¢‘Ì‚ð’è‹`‚µCWINFO_WOBJ‚Ì‘ã‚í‚è‚É—p‚¢‚éD
    170  *
    171  *  ‘Ò‚¿ó‘Ô‚ð‰ðœ‚·‚éÛ‚ɂ́C‘Ò‚¿‰ðœ‚µ‚½ƒ^ƒXƒN‚ɑ΂·‚é•Ô’l‚ðWINFO‚Ì
    172  *  wercd‚ɐݒ肷‚éDwercd‚ª•K—v‚È‚Ì‚Í‘Ò‚¿‰ðœˆÈ~‚Å‚ ‚é‚̂ɑ΂µ‚āC
    173  *  p_tmevtb‚Í‘Ò‚¿‰ðœŒã‚Í•K—v‚È‚¢‚½‚߁Cƒƒ‚ƒŠß–ñ‚Ì‚½‚ß‚É‹¤—p‘Ì‚ðŽg‚Á
    174  *  ‚Ä‚¢‚éD‚»‚Ì‚½‚߁Cwercd‚ÖƒGƒ‰[ƒR[ƒh‚ðÝ’è‚·‚é‚̂́Cƒ^ƒCƒ€ƒCƒxƒ“ƒg
    175  *  ƒuƒƒbƒN‚ð“o˜^‰ðœ‚µ‚½Œã‚É‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
     128 *  待ち情報ブロック(WINFO)の定義
     129 *
     130 *  タスクが待ち状態の間は,TCBおよびそのp_winfoで指されるWINFOを次の
     131 *  ように設定しなければならない.
     132 *
     133 *  (a) TCBのタスク状態を待ち状態(TS_WAITING)にする.その際に,待ち
     134 *  要因(TS_WAIT_???)も設定する.
     135 *
     136 *  (b) タイムアウトを監視するために,タイムイベントブロックを登録する.
     137 *  登録するタイムイベントブロックは,待ちに入るサービスコール処理関数
     138 *  のローカル変数として確保し,それへのポインタをWINFOのp_tmevtbに記
     139 *  憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には,
     140 *  p_tmevtbをNULLにする.
     141 *
     142 *  同期・通信オブジェクトに対する待ち状態の場合には,標準のWINFOに
     143 *  p_wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.hで定義)を使
     144 *  う.また,以下の(c)〜(e)の設定を行う必要がある.同期・通信オブジェ
     145 *  クトに関係しない待ち(起床待ち,時間経過待ち)の場合には,(c)〜(e)
     146 *  は必要ない.
     147 *
     148 *  (c) TCBを待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待
     149 *  ちキューにつなぐために,task_queueを使う.
     150 *
     151 *  (d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを,
     152 *  WINFO_WOBJのp_wobjcbに記憶する.
     153 *
     154 *  (e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な
     155 *  情報がある場合には,WINFO_WOBJに必要な情報のためのフィールドを追加
     156 *  した構造体を定義し,WINFO_WOBJの代わりに用いる.
     157 *
     158 *  待ち状態を解除する際には,待ち解除したタスクに対する返値をWINFOの
     159 *  wercdに設定する.wercdが必要なのは待ち解除以降であるのに対して,
     160 *  p_tmevtbは待ち解除後は必要ないため,メモリ節約のために共用体を使っ
     161 *  ている.そのため,wercdへエラーコードを設定するのは,タイムイベント
     162 *  ブロックを登録解除した後にしなければならない.
    176163 */
    177164typedef union waiting_information {
    178         ER              wercd;                  /* ‘Ò‚¿‰ðœŽž‚̃Gƒ‰[ƒR[ƒh */
    179         TMEVTB  *p_tmevtb;              /* ‘Ò‚¿ó‘Ô—p‚̃^ƒCƒ€ƒCƒxƒ“ƒgƒuƒƒbƒN */
     165        ER              wercd;                  /* 待ち解除時のエラーコード */
     166        TMEVTB  *p_tmevtb;              /* 待ち状態用のタイムイベントブロック */
    180167} WINFO;
    181168
    182169/*
    183  *  ƒ^ƒXƒN‰Šú‰»ƒuƒƒbƒN
    184  *
    185  *  ƒ^ƒXƒN‚ÉŠÖ‚·‚éî•ñ‚ðC’l‚ª•Ï‚í‚ç‚È‚¢‚½‚ß‚ÉROM‚É’u‚¯‚é•”•ªiƒ^ƒXƒN
    186  *  ‰Šú‰»ƒuƒƒbƒNj‚ƁC’l‚ª•Ï‰»‚·‚邽‚ß‚ÉRAM‚É’u‚©‚È‚¯‚ê‚΂Ȃç‚È‚¢•”
    187  *  •ªiƒ^ƒXƒNŠÇ—ƒuƒƒbƒNCTCBj‚É•ª—£‚µCTCB“à‚ɑΉž‚·‚éƒ^ƒXƒN‰Šú‰»
    188  *  ƒuƒƒbƒN‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ð“ü‚ê‚éDƒ^ƒXƒN‰Šú‰»ƒuƒƒbƒN“à‚ɑΉž‚·‚é
    189  *  TCB‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ð“ü‚ê‚é•û–@‚Ì•û‚ªCRAM‚̐ߖñ‚ÌŠÏ“_‚©‚ç‚Í–]‚Ü‚µ‚¢
    190  *  ‚ªCŽÀsŒø—¦‚ªˆ«‚­‚Ȃ邽‚߂ɍ̗p‚µ‚Ä‚¢‚È‚¢D‘¼‚̃IƒuƒWƒFƒNƒg‚ɂ‚¢
    191  *  ‚Ä‚à“¯—l‚Ɉµ‚¤D
    192  *
    193  *  ƒ^ƒXƒN‰Šú‰»ƒuƒƒbƒN‚ɂ́CDEF_TEX‚Å’è‹`‚³‚ê‚éƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`
    194  *  ƒ“‚ÉŠÖ‚·‚éî•ñ‚àŠÜ‚ށD
     170 *  タスク初期化ブロック
     171 *
     172 *  タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク
     173 *  初期化ブロック)と,値が変化するためにRAMに置かなければならない部
     174 *  分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化
     175 *  ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する
     176 *  TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい
     177 *  が,実行効率が悪くなるために採用していない.他のオブジェクトについ
     178 *  ても同様に扱う.
     179 *
     180 *  タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ
     181 *  ンに関する情報も含む.
    195182 */
    196183typedef struct task_initialization_block {
    197         ATR                     tskatr;                 /* ƒ^ƒXƒN‘®« */
    198         intptr_t        exinf;                  /* ƒ^ƒXƒN‚ÌŠg’£î•ñ */
    199         TASK            task;                   /* ƒ^ƒXƒN‚Ì‹N“®”Ô’n */
    200         uint_t          ipriority;              /* ƒ^ƒXƒN‚Ì‹N“®Žž—Dæ“xi“à•”•\Œ»j */
     184        ATR                     tskatr;                 /* タスク属性 */
     185        intptr_t        exinf;                  /* タスクの拡張情報 */
     186        TASK            task;                   /* タスクの起動番地 */
     187        uint_t          ipriority;              /* タスクの起動時優先度(内部表現) */
    201188
    202189#ifdef USE_TSKINICTXB
    203         TSKINICTXB      tskinictxb;             /* ƒ^ƒXƒN‰Šú‰»ƒRƒ“ƒeƒLƒXƒgƒuƒƒbƒN */
     190        TSKINICTXB      tskinictxb;             /* タスク初期化コンテキストブロック */
    204191#else /* USE_TSKINICTXB */
    205         SIZE            stksz;                  /* ƒXƒ^ƒbƒN—̈æ‚̃TƒCƒYiŠÛ‚ß‚½’lj */
    206         void            *stk;                   /* ƒXƒ^ƒbƒN—̈æ‚̐擪”Ô’n */
     192        SIZE            stksz;                  /* スタック領域のサイズ(丸めた値) */
     193        void            *stk;                   /* スタック領域の先頭番地 */
    207194#endif /* USE_TSKINICTXB */
    208195
    209         ATR                     texatr;                 /* ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‘®« */
    210         TEXRTN          texrtn;                 /* ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚Ì‹N“®”Ô’n */
     196        ATR                     texatr;                 /* タスク例外処理ルーチン属性 */
     197        TEXRTN          texrtn;                 /* タスク例外処理ルーチンの起動番地 */
    211198} TINIB;
    212199
    213200/*
    214  *  TCB’†‚̃tƒB[ƒ‹ƒh‚̃rƒbƒg•‚Ì’è‹`
    215  *
    216  *  ƒvƒƒZƒbƒT‚É‚æ‚Á‚ẮCTCB’†‚̃tƒB[ƒ‹ƒh‚̃rƒbƒg•‚сƒ‚ƒŠŽg—p—Ê‚Æ
    217  *  «”\‚ªƒgƒŒ[ƒhƒIƒt‚ɂȂ邽‚߁Cƒ^[ƒQƒbƒgˆË‘¶‚ɃtƒB[ƒ‹ƒh‚̃rƒbƒg•
    218  *  ‚ð•ÏX‚·‚邱‚Æ‚ð‹–‚µ‚Ä‚¢‚éD
     201 *  TCB中のフィールドのビット幅の定義
     202 *
     203 *  プロセッサによっては,TCB中のフィールドのビット幅でメモリ使用量と
     204 *  性能がトレードオフになるため,ターゲット依存にフィールドのビット幅
     205 *  を変更することを許している.
    219206 */
    220207#ifndef TBIT_TCB_PRIORITY
    221 #define TBIT_TCB_PRIORITY               8               /* priorityƒtƒB[ƒ‹ƒh‚̃rƒbƒg• */
     208#define TBIT_TCB_PRIORITY               8               /* priorityフィールドのビット幅 */
    222209#endif /* TBIT_TCB_PRIORITY */
    223210
    224211/*
    225  *  ƒ^ƒXƒNŠÇ—ƒuƒƒbƒNiTCBj
    226  *
    227  *  ASPƒJ[ƒlƒ‹‚ł́Cƒ^ƒXƒN‚Ì‹N“®—v‹ƒLƒ
    228 [ƒCƒ“ƒO”‚̍őå’liTMAX_ACTCNTj
    229  *  ‚Æ‹N°—v‹ƒLƒ
    230 [ƒCƒ“ƒO”‚̍őå’liTMAX_WUPCNTj‚Í1‚ɌŒ肳‚ê‚Ä‚¢‚é
    231  *  ‚½‚߁CƒLƒ
    232 [ƒCƒ“ƒO‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚̐^‹U’l‚Å•\Œ»‚·‚邱‚Æ‚ª‚Å‚«‚éD
    233  *  ‚Ü‚½C‹­§‘Ò‚¿—v‹ƒlƒXƒg”‚̍őå’liTMAX_SUSCNTj‚ª1‚ɌŒ肳‚ê‚Ä‚¢
    234  *  ‚é‚̂ŁC‹­§‘Ò‚¿—v‹ƒlƒXƒg”isuscntj‚Í•K—v‚È‚¢D
    235  *
    236  *  TCB‚Ì‚¢‚­‚‚©‚̃tƒB[ƒ‹ƒh‚́C“Á’è‚̃^ƒXƒNó‘Ô‚Å‚Ì‚Ý—LŒø‚È’l‚ð•ÛŽ‚µC
    237  *  ‚»‚êˆÈŠO‚̏ꍇ‚Í’l‚ª•ÛØ‚³‚ê‚È‚¢i‚æ‚Á‚āCŽQÆ‚µ‚Ä‚Í‚È‚ç‚È‚¢jDŠe
    238  *  ƒtƒB[ƒ‹ƒh‚ª—LŒø‚È’l‚ð•ÛŽ‚·‚éðŒ‚ÍŽŸ‚Ì’Ê‚èD
    239  *
    240  *  E‰Šú‰»Œã‚͏í‚É—LŒøF
    241  *              p_tinibCtstatCactque
    242  *  E‹xŽ~ó‘ԈȊO‚Å—LŒøi‹xŽ~ó‘Ԃł͏‰Šú’l‚É‚È‚Á‚Ä‚¢‚éjF
    243  *              priorityCwupqueCenatexCtexptn
    244  *  E‘Ò‚¿ó‘ԁi“ñd‘Ò‚¿ó‘Ô‚ðŠÜ‚ށj‚Å—LŒøF
     212 *  タスク管理ブロック(TCB)
     213 *
     214 *  ASPカーネルでは,タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)
     215 *  と起床要求キューイング数の最大値(TMAX_WUPCNT)は1に固定されている
     216 *  ため,キューイングされているかどうかの真偽値で表現することができる.
     217 *  また,強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が1に固定されてい
     218 *  るので,強制待ち要求ネスト数(suscnt)は必要ない.
     219 *
     220 *  TCBのいくつかのフィールドは,特定のタスク状態でのみ有効な値を保持し,
     221 *  それ以外の場合は値が保証されない(よって,参照してはならない).各
     222 *  フィールドが有効な値を保持する条件は次の通り.
     223 *
     224 *  ・初期化後は常に有効:
     225 *              p_tinib,tstat,actque
     226 *  ・休止状態以外で有効(休止状態では初期値になっている):
     227 *              priority,wupque,enatex,texptn
     228 *  ・待ち状態(二重待ち状態を含む)で有効:
    245229 *              p_winfo
    246  *  EŽÀs‚Å‚«‚éó‘Ô‚Æ“¯ŠúE’ʐMƒIƒuƒWƒFƒNƒg‚ɑ΂·‚é‘Ò‚¿ó‘Ô‚Å—LŒøF
     230 *  ・実行できる状態と同期・通信オブジェクトに対する待ち状態で有効:
    247231 *              task_queue
    248  *  EŽÀs‰Â”\ó‘ԁC‘Ò‚¿ó‘ԁC‹­§‘Ò‚¿ó‘ԁC“ñd‘Ò‚¿ó‘Ô‚Å—LŒøF
     232 *  ・実行可能状態,待ち状態,強制待ち状態,二重待ち状態で有効:
    249233 *              tskctxb
    250234 */
    251235typedef struct task_control_block {
    252         QUEUE                   task_queue;             /* ƒ^ƒXƒNƒLƒ
    253 [ */
    254         const TINIB             *p_tinib;               /* ‰Šú‰»ƒuƒƒbƒN‚ւ̃|ƒCƒ“ƒ^ */
     236        QUEUE                   task_queue;             /* タスクキュー */
     237        const TINIB             *p_tinib;               /* 初期化ブロックへのポインタ */
    255238
    256239#ifdef UINT8_MAX
    257         uint8_t                 tstat;                  /* ƒ^ƒXƒNó‘ԁi“à•”•\Œ»j*/
     240        uint8_t                 tstat;                  /* タスク状態(内部表現)*/
    258241#else /* UINT8_MAX */
    259         BIT_FIELD_UINT  tstat : 8;              /* ƒ^ƒXƒNó‘ԁi“à•”•\Œ»j*/
     242        BIT_FIELD_UINT  tstat : 8;              /* タスク状態(内部表現)*/
    260243#endif /* UINT8_MAX */
    261244#if defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8)
    262         uint8_t                 priority;               /* Œ»Ý‚Ì—Dæ“xi“à•”•\Œ»j*/
     245        uint8_t                 priority;               /* 現在の優先度(内部表現)*/
    263246#else /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
    264247        BIT_FIELD_UINT  priority : TBIT_TCB_PRIORITY;
    265                                                                         /* Œ»Ý‚Ì—Dæ“xi“à•”•\Œ»j*/
     248                                                                        /* 現在の優先度(内部表現)*/
    266249#endif /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
    267         BIT_FIELD_BOOL  actque : 1;             /* ‹N“®—v‹ƒLƒ
    268 [ƒCƒ“ƒO */
    269         BIT_FIELD_BOOL  wupque : 1;             /* ‹N°—v‹ƒLƒ
    270 [ƒCƒ“ƒO */
    271         BIT_FIELD_BOOL  enatex : 1;             /* ƒ^ƒXƒN—áŠOˆ—‹–‰Âó‘Ô */
    272 
    273         TEXPTN                  texptn;                 /* •Û—¯—áŠO—vˆö */
    274         WINFO                   *p_winfo;               /* ‘Ò‚¿î•ñƒuƒƒbƒN‚ւ̃|ƒCƒ“ƒ^ */
    275         TSKCTXB                 tskctxb;                /* ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgƒuƒƒbƒN */
     250        BIT_FIELD_BOOL  actque : 1;             /* 起動要求キューイング */
     251        BIT_FIELD_BOOL  wupque : 1;             /* 起床要求キューイング */
     252        BIT_FIELD_BOOL  enatex : 1;             /* タスク例外処理許可状態 */
     253
     254        TEXPTN                  texptn;                 /* 保留例外要因 */
     255        WINFO                   *p_winfo;               /* 待ち情報ブロックへのポインタ */
     256        TSKCTXB                 tskctxb;                /* タスクコンテキストブロック */
    276257} TCB;
    277258
    278259/*
    279  *  ŽÀsó‘Ԃ̃^ƒXƒN
    280  *
    281  *  ŽÀsó‘Ԃ̃^ƒXƒNiƒvƒƒZƒbƒT‚ªƒRƒ“ƒeƒLƒXƒg‚ðŽ‚Á‚Ä‚¢‚éƒ^ƒXƒNj‚Ì
    282  *  TCB‚ðŽw‚·ƒ|ƒCƒ“ƒ^DŽÀsó‘Ԃ̃^ƒXƒN‚ª‚È‚¢ê‡‚ÍNULL‚É‚·‚éD
    283  *
    284  *  ƒT[ƒrƒXƒR[ƒ‹‚̏ˆ—’†‚ŁCŽ©ƒ^ƒXƒNiƒT[ƒrƒXƒR[ƒ‹‚ðŒÄ‚яo‚µ‚½ƒ^ƒX
    285  *  ƒNj‚ÉŠÖ‚·‚éî•ñ‚ðŽQÆ‚·‚éê‡‚Íp_runtsk‚ðŽg‚¤Dp_runtsk‚ð‘‚«Š·‚¦
    286  *  ‚é‚̂́CƒfƒBƒXƒpƒbƒ`ƒƒi‚Ə‰Šú‰»ˆ—j‚Ì‚Ý‚Å‚ ‚éD
     260 *  実行状態のタスク
     261 *
     262 *  実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の
     263 *  TCBを指すポインタ.実行状態のタスクがない場合はNULLにする.
     264 *
     265 *  サービスコールの処理中で,自タスク(サービスコールを呼び出したタス
     266 *  ク)に関する情報を参照する場合はp_runtskを使う.p_runtskを書き換え
     267 *  るのは,ディスパッチャ(と初期化処理)のみである.
    287268 */
    288269extern TCB      *p_runtsk;
    289270
    290271/*
    291  *  Å‚—Dæ‡ˆÊ‚̃^ƒXƒN
    292  *
    293  *  ŽÀs‚Å‚«‚éƒ^ƒXƒN‚Ì’†‚ōō‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ÌTCB‚ðŽw‚·ƒ|ƒCƒ“ƒ^DŽÀ
    294  *  s‚Å‚«‚éƒ^ƒXƒN‚ª‚È‚¢ê‡‚ÍNULL‚É‚·‚éD
    295  *
    296  *  ƒfƒBƒXƒpƒbƒ`‹ÖŽ~ó‘ԂȂǁCƒfƒBƒXƒpƒbƒ`‚ª•Û—¯‚³‚ê‚Ä‚¢‚éŠÔ‚Íp_runtsk
    297  *  ‚ƈê’v‚µ‚Ä‚¢‚é‚Æ‚ÍŒÀ‚ç‚È‚¢D
     272 *  最高優先順位のタスク
     273 *
     274 *  実行できるタスクの中で最高優先順位のタスクのTCBを指すポインタ.実
     275 *  行できるタスクがない場合はNULLにする.
     276 *
     277 *  ディスパッチ禁止状態など,ディスパッチが保留されている間はp_runtsk
     278 *  と一致しているとは限らない.
    298279 */
    299280extern TCB      *p_schedtsk;
    300281
    301282/*
    302  *  ƒfƒBƒXƒpƒbƒ`^ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‹N“®—v‹ƒtƒ‰ƒO
    303  *
    304  *  Š„ž‚݃nƒ“ƒhƒ‰^CPU—áŠOƒnƒ“ƒhƒ‰‚̏oŒûˆ—‚ɁCƒfƒBƒXƒpƒbƒ`‚Ü‚½‚Í
    305  *  ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚Ì‹N“®‚ð—v‹‚·‚邱‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOD
     283 *  ディスパッチ/タスク例外処理ルーチン起動要求フラグ
     284 *
     285 *  割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは
     286 *  タスク例外処理ルーチンの起動を要求することを示すフラグ.
    306287 */
    307288extern bool_t   reqflg;
    308289
    309290/*
    310  *  Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô
    311  *
    312  *  Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô‚Å‚ ‚邱‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOD
     291 *  割込み優先度マスク全解除状態
     292 *
     293 *  割込み優先度マスク全解除状態であることを示すフラグ.
    313294 */
    314295extern bool_t   ipmflg;
    315296
    316297/*
    317  *  ƒfƒBƒXƒpƒbƒ`‹ÖŽ~ó‘Ô
    318  *
    319  *  ƒfƒBƒXƒpƒbƒ`‹ÖŽ~ó‘Ô‚Å‚ ‚邱‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOD
     298 *  ディスパッチ禁止状態
     299 *
     300 *  ディスパッチ禁止状態であることを示すフラグ.
    320301 */
    321302extern bool_t   disdsp;
    322303
    323304/*
    324  *  ƒ^ƒXƒNƒfƒBƒXƒpƒbƒ`‰Â”\ó‘Ô
    325  *
    326  *  Š„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô‚Å‚ ‚èCƒfƒBƒXƒpƒbƒ`‹–‰Âó‘Ô‚Å‚ ‚éiƒfƒB
    327  *  ƒXƒpƒbƒ`‹ÖŽ~ó‘Ô‚Å‚È‚¢j‚±‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOD
     305 *  タスクディスパッチ可能状態
     306 *
     307 *  割込み優先度マスク全解除状態であり,ディスパッチ許可状態である(ディ
     308 *  スパッチ禁止状態でない)ことを示すフラグ.
    328309 */
    329310extern bool_t   dspflg;
    330311
    331312/*
    332  *  ƒŒƒfƒBƒLƒ
    333 [
    334  *
    335  *  ƒŒƒfƒBƒLƒ
    336 [‚́CŽÀs‚Å‚«‚éó‘Ԃ̃^ƒXƒN‚ðŠÇ—‚·‚邽‚߂̃Lƒ
    337 [‚Å‚ ‚éD
    338  *  ŽÀsó‘Ԃ̃^ƒXƒN‚àŠÇ—‚µ‚Ä‚¢‚邽‚߁CƒŒƒfƒBiŽÀs‰Â”\jƒLƒ
    339 [‚Æ‚¢‚¤
    340  *  –¼Ì‚͐³Šm‚Å‚Í‚È‚¢‚ªCƒŒƒfƒBƒLƒ
    341 [‚Æ‚¢‚¤–¼Ì‚ª’è’
    342 ‚µ‚Ä‚¢‚邽‚߁C‚±
    343  *  ‚Ì–¼Ì‚ŌĂԂ±‚Æ‚É‚·‚éD
    344  *
    345  *  ƒŒƒfƒBƒLƒ
    346 [‚́C—Dæ“x‚²‚Ƃ̃^ƒXƒNƒLƒ
    347 [‚ō\¬‚³‚ê‚Ä‚¢‚éDƒ^ƒXƒN‚Ì
    348  *  TCB‚́CŠY“–‚·‚é—Dæ“x‚̃Lƒ
    349 [‚É“o˜^‚³‚ê‚éD
     313 *  レディキュー
     314 *
     315 *  レディキューは,実行できる状態のタスクを管理するためのキューである.
     316 *  実行状態のタスクも管理しているため,レディ(実行可能)キューという
     317 *  名称は正確ではないが,レディキューという名称が定着しているため,こ
     318 *  の名称で呼ぶことにする.
     319 *
     320 *  レディキューは,優先度ごとのタスクキューで構成されている.タスクの
     321 *  TCBは,該当する優先度のキューに登録される.
    350322 */
    351323extern QUEUE    ready_queue[TNUM_TPRI];
    352324
    353325/*
    354  *  ƒŒƒfƒBƒLƒ
    355 [ƒT[ƒ`‚Ì‚½‚߂̃rƒbƒgƒ}ƒbƒv
    356  *
    357  *  ƒŒƒfƒBƒLƒ
    358 [‚̃T[ƒ`‚ðŒø—¦‚æ‚­s‚¤‚½‚߂ɁC—Dæ“x‚²‚Ƃ̃^ƒXƒNƒLƒ
    359 [
    360  *  ‚Ƀ^ƒXƒN‚ª“ü‚Á‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ðŽ¦‚·ƒrƒbƒgƒ}ƒbƒv‚ð—pˆÓ‚µ‚Ä‚¢‚éDƒrƒb
    361  *  ƒgƒ}ƒbƒv‚ðŽg‚¤‚±‚ƂŁCƒƒ‚ƒŠƒAƒNƒZƒX‚̉ñ”‚ðŒ¸‚ç‚·‚±‚Æ‚ª‚Å‚«‚邪C
    362  *  ƒrƒbƒg‘€ì–½—ß‚ª[ŽÀ‚µ‚Ä‚¢‚È‚¢ƒvƒƒZƒbƒT‚ŁC—Dæ“x‚Ì’iŠK”‚ª­‚È‚¢
    363  *  ê‡‚ɂ́Cƒrƒbƒgƒ}ƒbƒv‘€ì‚̃I[ƒo[ƒwƒbƒh‚Ì‚½‚߂ɁC‹t‚ÉŒø—¦‚ª—Ž‚¿
    364  *  ‚é‰Â”\«‚à‚ ‚éD
    365  *
    366  *  —Dæ“x‚ª16’iŠK‚Å‚ ‚邱‚Æ‚ð‰¼’è‚µ‚Ä‚¢‚邽‚߁Cuint16_tŒ^‚Æ‚µ‚Ä‚¢‚éD
     326 *  レディキューサーチのためのビットマップ
     327 *
     328 *  レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー
     329 *  にタスクが入っているかどうかを示すビットマップを用意している.ビッ
     330 *  トマップを使うことで,メモリアクセスの回数を減らすことができるが,
     331 *  ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない
     332 *  場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち
     333 *  る可能性もある.
     334 *
     335 *  優先度が16段階であることを仮定しているため,uint16_t型としている.
    367336 */
    368337extern uint16_t ready_primap;
    369338
    370339/*
    371  *  Žg—p‚µ‚Ä‚¢‚È‚¢TCB‚̃ŠƒXƒg
     340 *  使用していないTCBのリスト
    372341 */
    373342extern QUEUE    free_tcb;
    374343
    375344/*
    376  *  ƒ^ƒXƒNID‚̍őå’likernel_cfg.cj
     345 *  タスクIDの最大値(kernel_cfg.c)
    377346 */
    378347extern const ID tmax_tskid;
     
    380349
    381350/*
    382  *  ƒ^ƒXƒN‰Šú‰»ƒuƒƒbƒN‚̃GƒŠƒAikernel_cfg.cj
     351 *  タスク初期化ブロックのエリア(kernel_cfg.c)
    383352 */
    384353extern const TINIB      tinib_table[];
     
    386355
    387356/*
    388  *  ƒ^ƒXƒN¶¬‡˜ƒe[ƒuƒ‹ikernel_cfg.cj
     357 *  タスク生成順序テーブル(kernel_cfg.c)
    389358 */
    390359extern const ID torder_table[];
    391360
    392361/*
    393  *  TCB‚̃GƒŠƒAikernel_cfg.cj
     362 *  TCBのエリア(kernel_cfg.c)
    394363 */
    395364extern TCB      tcb_table[];
    396365
    397366/*
    398  *  ƒ^ƒXƒN‚̐”
     367 *  タスクの数
    399368 */
    400369#define tnum_tsk        ((uint_t)(tmax_tskid - TMIN_TSKID + 1))
     
    402371
    403372/*
    404  *  ƒ^ƒXƒNID‚©‚çTCB‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
     373 *  タスクIDからTCBを取り出すためのマクロ
    405374 */
    406375#define INDEX_TSK(tskid)        ((uint_t)((tskid) - TMIN_TSKID))
     
    409378
    410379/*
    411  *  TCB‚©‚çƒ^ƒXƒNID‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
     380 *  TCBからタスクIDを取り出すためのマクロ
    412381 */
    413382#define TSKID(p_tcb)    ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID))
    414383
    415384/*
    416  *  ƒ^ƒXƒNŠÇ—ƒ‚ƒWƒ
    417 [ƒ‹‚̏‰Šú‰»
     385 *  タスク管理モジュールの初期化
    418386 */
    419387extern void     initialize_task(void);
    420388
    421389/*
    422  *  Å‚—Dæ‡ˆÊƒ^ƒXƒN‚̃T[ƒ`
    423  *
    424  *  ƒŒƒfƒBƒLƒ
    425 [’†‚̍ō‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ðƒT[ƒ`‚µC‚»‚ÌTCB‚ւ̃|ƒCƒ“ƒ^
    426  *  ‚ð•Ô‚·DƒŒƒfƒBƒLƒ
    427 [‚ª‹ó‚̏ꍇ‚ɂ́C‚±‚̊֐”‚ðŒÄ‚яo‚µ‚Ä‚Í‚È‚ç‚È‚¢D
     390 *  最高優先順位タスクのサーチ
     391 *
     392 *  レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ
     393 *  を返す.レディキューが空の場合には,この関数を呼び出してはならない.
    428394 */
    429395extern TCB      *search_schedtsk(void);
    430396
    431397/*
    432  *  ŽÀs‚Å‚«‚éó‘Ô‚Ö‚Ì‘JˆÚ
    433  *
    434  *  p_tcb‚ÅŽw’肳‚ê‚éƒ^ƒXƒN‚ðƒŒƒfƒBƒLƒ
    435 [‚É‘}“ü‚·‚éDƒŒƒfƒBƒLƒ
    436 [‚É‘}“ü
    437  *  ‚µ‚½ƒ^ƒXƒN‚Ì—Dæ“x‚ªCÅ‚—Dæ‡ˆÊ‚̃^ƒXƒN‚Ì—Dæ“x‚æ‚è‚à‚‚¢ê‡‚́C
    438  *  Å‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ðXV‚µCƒfƒBƒXƒpƒbƒ`‹–‰Âó‘Ô‚Å‚ ‚ê‚Îtrue‚ð•Ô
    439  *  ‚·D‚»‚¤‚Å‚È‚¢ê‡‚Ífalse‚ð•Ô‚·D
     398 *  実行できる状態への遷移
     399 *
     400 *  p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入
     401 *  したタスクの優先度が,最高優先順位のタスクの優先度よりも高い場合は,
     402 *  最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを返
     403 *  す.そうでない場合はfalseを返す.
    440404 */
    441405extern bool_t   make_runnable(TCB *p_tcb);
    442406
    443407/*
    444  *  ŽÀs‚Å‚«‚éó‘Ô‚©‚瑼‚̏ó‘Ô‚Ö‚Ì‘JˆÚ
    445  *
    446  *  p_tcb‚ÅŽw’肳‚ê‚éƒ^ƒXƒN‚ðƒŒƒfƒBƒLƒ
    447 [‚©‚çíœ‚·‚éDp_tcb‚ÅŽw’肵‚½
    448  *  ƒ^ƒXƒN‚ªÅ‚—Dæ‡ˆÊ‚̃^ƒXƒN‚Å‚ ‚Á‚½ê‡‚ɂ́CÅ‚—Dæ‡ˆÊ‚̃^ƒXƒN
    449  *  ‚ðÝ’肵‚È‚¨‚µCƒfƒBƒXƒpƒbƒ`‹–‰Âó‘Ô‚Å‚ ‚ê‚Îtrue‚ð•Ô‚·D‚»‚¤‚Å‚È‚¢
    450  *  ê‡‚Ífalse‚ð•Ô‚·Dƒ^ƒXƒN‚̏ó‘Ԃ͍XV‚µ‚È‚¢D
     408 *  実行できる状態から他の状態への遷移
     409 *
     410 *  p_tcbで指定されるタスクをレディキューから削除する.p_tcbで指定した
     411 *  タスクが最高優先順位のタスクであった場合には,最高優先順位のタスク
     412 *  を設定しなおし,ディスパッチ許可状態であればtrueを返す.そうでない
     413 *  場合はfalseを返す.タスクの状態は更新しない.
    451414 */
    452415extern bool_t   make_non_runnable(TCB *p_tcb);
    453416
    454417/*
    455  *  ‹xŽ~ó‘Ô‚Ö‚Ì‘JˆÚ
    456  *
    457  *  p_tcb‚ÅŽw’肳‚ê‚éƒ^ƒXƒN‚̏ó‘Ô‚ð‹xŽ~ó‘Ô‚Æ‚·‚éD‚Ü‚½Cƒ^ƒXƒN‚Ì‹N“®
    458  *  Žž‚ɏ‰Šú‰»‚·‚ׂ«•Ï”‚̏‰Šú‰»‚ƁCƒ^ƒXƒN‹N“®‚Ì‚½‚߂̃Rƒ“ƒeƒLƒXƒg‚ðÝ
    459  *  ’è‚·‚éD
     418 *  休止状態への遷移
     419 *
     420 *  p_tcbで指定されるタスクの状態を休止状態とする.また,タスクの起動
     421 *  時に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設
     422 *  定する.
    460423 */
    461424extern void     make_dormant(TCB *p_tcb);
    462425
    463426/*
    464  *  ‹xŽ~ó‘Ô‚©‚çŽÀs‚Å‚«‚éó‘Ô‚Ö‚Ì‘JˆÚ
    465  *
    466  *  p_tcb‚ÅŽw’肳‚ê‚éƒ^ƒXƒN‚̏ó‘Ô‚ð‹xŽ~ó‘Ô‚©‚çŽÀs‚Å‚«‚éó‘Ô‚Æ‚·‚éD
    467  *  ŽÀs‚Å‚«‚éó‘Ô‚É‘JˆÚ‚µ‚½ƒ^ƒXƒN‚ւ̃fƒBƒXƒpƒbƒ`‚ª•K—v‚ȏꍇ‚ÍtrueC
    468  *  ‚»‚¤‚Å‚È‚¢ê‡‚Ífalse‚ð•Ô‚·D
     427 *  休止状態から実行できる状態への遷移
     428 *
     429 *  p_tcbで指定されるタスクの状態を休止状態から実行できる状態とする.
     430 *  実行できる状態に遷移したタスクへのディスパッチが必要な場合はtrue,
     431 *  そうでない場合はfalseを返す.
    469432 */
    470433extern bool_t   make_active(TCB *p_tcb);
    471434
    472435/*
    473  *  ƒ^ƒXƒN‚Ì—Dæ“x‚̕ύX
    474  *
    475  *  p_tcb‚ÅŽw’肳‚ê‚éƒ^ƒXƒN‚Ì—Dæ“x‚ðnewprii“à•”•\Œ»j‚ɕύX‚·‚éD‚Ü‚½C
    476  *  •K—v‚ȏꍇ‚ɂ͍ō‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ðXV‚µCƒfƒBƒXƒpƒbƒ`‹–‰Âó‘Ô‚Å
    477  *  ‚ ‚ê‚Îtrue‚ð•Ô‚·D‚»‚¤‚Å‚È‚¢ê‡‚Ífalse‚ð•Ô‚·D
     436 *  タスクの優先度の変更
     437 *
     438 *  p_tcbで指定されるタスクの優先度をnewpri(内部表現)に変更する.また,
     439 *  必要な場合には最高優先順位のタスクを更新し,ディスパッチ許可状態で
     440 *  あればtrueを返す.そうでない場合はfalseを返す.
    478441 */
    479442extern bool_t   change_priority(TCB *p_tcb, uint_t newpri);
    480443
    481444/*
    482  *  ƒŒƒfƒBƒLƒ
    483 [‚̉ñ“]
    484  *
    485  *  ƒŒƒfƒBƒLƒ
    486 [’†‚́Cpri‚ÅŽw’肳‚ê‚é—Dæ“x‚̃^ƒXƒNƒLƒ
    487 [‚ð‰ñ“]‚³‚¹‚éD
    488  *  ‚Ü‚½C•K—v‚ȏꍇ‚ɂ͍ō‚—Dæ‡ˆÊ‚̃^ƒXƒN‚ð•ÏX‚µCƒfƒBƒXƒpƒbƒ`‚ª•Û
    489  *  —¯‚³‚ê‚Ä‚¢‚È‚¯‚ê‚Îtrue‚ð•Ô‚·D‚»‚¤‚Å‚È‚¢ê‡‚Ífalse‚ð•Ô‚·D
     445 *  レディキューの回転
     446 *
     447 *  レディキュー中の,priで指定される優先度のタスクキューを回転させる.
     448 *  また,必要な場合には最高優先順位のタスクを変更し,ディスパッチが保
     449 *  留されていなければtrueを返す.そうでない場合はfalseを返す.
    490450 */
    491451extern bool_t   rotate_ready_queue(uint_t pri);
    492452
    493453/*
    494  *  ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚̌ďo‚µ
    495  *
    496  *  ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚ðŒÄ‚яo‚·DŒÄ‚яo‚·‘O‚ɁCŽÀsó‘Ԃ̃^ƒXƒN‚Ì
    497  *  •Û—¯—áŠO—vˆö‚ðƒNƒŠƒA‚µCƒ^ƒXƒN—áŠOˆ—‹ÖŽ~ó‘Ô‚É‚µCCPUƒƒbƒN‚ð‰ð
    498  *  œ‚·‚éD
    499  *
    500  *  ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚©‚ç–ß‚é‚ƁC‚Ü‚¸CPUƒƒbƒNó‘Ô‚É–ß‚µC‚»‚ÌŠÔ
    501  *  ‚É•Û—¯—áŠO—vˆö‚ª0‚Å‚È‚­‚È‚Á‚Ä‚¢‚ê‚΁CÄ‚у^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚ð
    502  *  ŒÄ‚яo‚·D•Û—¯—áŠO—vˆö‚ª0‚̏ꍇ‚ɂ́C—áŠOˆ—‹–‰Âó‘Ô‚É‚µ‚Ċ֐”‚©
    503  *  ‚烊ƒ^[ƒ“‚·‚éD
    504  *
    505  *  ‚±‚̊֐”‚́CŽÀsó‘Ԃ̃^ƒXƒN‚ªCƒ^ƒXƒN—áŠOˆ—‹–‰Âó‘ԁienatex‚ª
    506  *  truej‚ŁC•Û—¯—áŠO—vˆö‚ª0‚Å‚È‚¢itexptn‚ª0‚Å‚È‚¢jê‡‚ɌĂяo‚·‚±
    507  *  ‚Æ‚ð‘z’肵‚Ä‚¢‚éD‚±‚̊֐”‚́CCPUƒƒbƒNó‘ԂŌĂяo‚³‚È‚¯‚ê‚΂Ȃç
    508  *  ‚È‚¢D
     454 *  タスク例外処理ルーチンの呼出し
     455 *
     456 *  タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの
     457 *  保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解
     458 *  除する.
     459 *
     460 *  タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間
     461 *  に保留例外要因が0でなくなっていれば,再びタスク例外処理ルーチンを
     462 *  呼び出す.保留例外要因が0の場合には,例外処理許可状態にして関数か
     463 *  らリターンする.
     464 *
     465 *  この関数は,実行状態のタスクが,タスク例外処理許可状態(enatexが
     466 *  true)で,保留例外要因が0でない(texptnが0でない)場合に呼び出すこ
     467 *  とを想定している.この関数は,CPUロック状態で呼び出さなければなら
     468 *  ない.
    509469 */
    510470extern void     call_texrtn(void);
    511471
    512472/*
    513  *  ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚Ì‹N“®
    514  *
    515  *  ŽÀsó‘Ԃ̃^ƒXƒN‚ªƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚Ì‹N“®ðŒ‚ð–ž‚½‚µ‚Ä‚¢‚ê‚΁C
    516  *  ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚ðŒÄ‚яo‚·DCPU—áŠOˆ—ƒ‹[ƒ`ƒ“‚ðŒÄ‚яo‚·Žž
    517  *  ‚́CˆêŽž“I‚ÉCPUƒƒbƒN‚ð‰ðœ‚·‚éD
    518  *
    519  *  ‚±‚̊֐”‚́CƒfƒBƒXƒpƒbƒ`ƒƒ‚⊄ž‚݃nƒ“ƒhƒ‰^CPU—áŠOƒnƒ“ƒhƒ‰‚̏oŒû
    520  *  ˆ—‚©‚çŒÄ‚яo‚³‚ê‚邱‚Æ‚ð‘z’肵‚Ä‚¢‚éD‚±‚̊֐”‚́CCPUƒƒbƒNó‘Ô
    521  *  ‚ŌĂяo‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    522  *
    523  *  ŽÀsŒø—¦‚ðã‚°‚邽‚߂ɁC‚±‚̊֐”‚ðƒ^[ƒQƒbƒgˆË‘¶•”‚Å‹Lq‚µ‚Ä‚à‚æ‚¢D
    524  *  ‚»‚̏ꍇ‚ɂ́COMIT_CALLTEX‚ðƒ}ƒNƒ’è‹`‚·‚éD
     473 *  タスク例外処理ルーチンの起動
     474 *
     475 *  実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば,
     476 *  タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時
     477 *  は,一時的にCPUロックを解除する.
     478 *
     479 *  この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口
     480 *  処理から呼び出されることを想定している.この関数は,CPUロック状態
     481 *  で呼び出さなければならない.
     482 *
     483 *  実行効率を上げるために,この関数をターゲット依存部で記述してもよい.
     484 *  その場合には,OMIT_CALLTEXをマクロ定義する.
    525485 */
    526486extern void     calltex(void);
Note: See TracChangeset for help on using the changeset viewer.