
                     JSPJ[l ݌v 

             iRelease 1.4ΉCŏIXV: 15-Mar-2005j

------------------------------------------------------------------------ 
 TOPPERS/JSP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile Kernel

 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN

 L쌠҂́Cȉ (1)`(4) ̏CFree Software Foundation 
 ɂČ\Ă GNU General Public License  Version 2 ɋL
 qĂ𖞂ꍇɌC{\tgEFAi{\tgEFA
 ς̂܂ށDȉjgpEEρEĔzziȉC
 pƌĂԁj邱Ƃ𖳏ŋD
 (1) {\tgEFA\[XR[ȟ`ŗpꍇɂ́CL̒
     \C̗pщL̖ۏ؋K肪Ĉ܂܂̌`Ń\[
     XR[hɊ܂܂Ă邱ƁD
 (2) {\tgEFACCu`ȂǁC̃\tgEFAJɎg
     pł`ōĔzzꍇɂ́CĔzzɔhLgip
     ҃}jAȂǁjɁCL̒쌠\C̗pщL
     ̖ۏ؋Kfڂ邱ƁD
 (3) {\tgEFAC@ɑgݍނȂǁC̃\tgEFAJɎg
     płȂ`ōĔzzꍇɂ́Ĉꂩ̏𖞂
     ƁD
   (a) ĔzzɔhLgip҃}jAȂǁjɁCL̒
       쌠\C̗pщL̖ۏ؋Kfڂ邱ƁD
   (b) Ĕzž`ԂCʂɒ߂@ɂāCTOPPERSvWFNg
       񍐂邱ƁD
 (4) {\tgEFA̗pɂ蒼ړI܂͊ԐړIɐ邢Ȃ鑹
     QCL쌠҂TOPPERSvWFNgƐӂ邱ƁD

 {\tgEFÁCۏ؂Œ񋟂Ă̂łDL쌠҂
 TOPPERSvWFNǵC{\tgEFAɊւāC̓Kp\
 ܂߂āCȂۏ؂sȂD܂C{\tgEFA̗pɂ蒼
 ړI܂͊ԐړIɐȂ鑹QɊւĂC̐ӔC𕉂ȂD

 @(#) $Id: design.txt,v 1.1 2008/06/17 00:04:40 suikan Exp $
------------------------------------------------------------------------


PDJSPJ[lɂ鐧

(1) T|[g@\

JSPJ[ĺCO̒ʂX^_[hvt@CɊ܂܂@\݂̂
T|[gDX^_[hvt@CŐ@\́CƂăT|[g
ȂD

\̐݌vɂẮCX^_[hvt@CŐ@\T|[g
邽߂̊g͍lCX^_[hvt@CɊ܂܂@\
ǂ邱ƂڎwD

(2) T[rXR[ł݂̊̈

JSPJ[lł́CT[rXR[ׂ͂Ċ݋֎~ŎsDX^_[
hvt@C̋@\͈͓̔ł́C̕@ŏ\ƍl邪Cg@
\ǉ鎞ɂ͐݌vׂłD̓Iɂ́C^XNReL
XgĂяoꂽT[rXR[xs@L͂łD

(3) CPUOnh̎sReLXg

JSPJ[lł́CCPUOnh͔^XNReLXgŎsD

Ql: ITRON4.0dlł́C^XNReLXgŔCPUOɑ΂
CPUOnhC^XNReLXgŎs邩^XNReLXg
Ŏs邩́C`ƂĂD


QDsReLXgƃVXeԂ̉z

(1) sReLXg

sReLXǵC^XNReLXgƔ^XNReLXĝꂩ
ɕނD

sReLXg̊Ǘ̓^[QbgˑōsD̓Iɂ́C^XNR
eLXgƔ^XNReLXg𔻕ʂ֐isense_contextjC^[
QbgˑŗpӂD

܂C^XNReLXgƔ^XNReLXg̊Ԃ̑JڂC^[Qbg
ˑ̐ӔCłD̓Iɂ́C݃nh^CPUOnhN
Ɣ^XNReLXgɐ؂芷C݃nh^CPUOn
h烊^[ƌ̎sReLXgɖ߂悤C^[Qbgˑ
D

(2) CPUbN

VXéCCPUbNԂCCPUbNԂ̂ꂩɂDCPUb
NԂł́CׂĂ̊݁iJ[l̊ǗÔ̂Dȉj
֎~ĂD

CPUbNԂ̊Ǘ̓^[QbgˑōsD̓Iɂ́CCPUbNԁ^
CPUbNԂ̂̏Ԃł邩𔻕ʂ֐isense_lockC
t_sense_lockCi_sense_lockjƁCCPUbNԂCPUbNԂ̊Ԃ
Jڂ֐it_lock_cpuCt_unlock_cpuCi_lock_cpuCi_unlock_cpujC
^[QbgˑŗpӂD̊֐ĂяoȊO̕@ŁCCPUb
NԂCPUbNԂ̊ԂJڂ邱Ƃ͂ȂD


RDfBXpb`ƃ^XNO[`N̕@

(1) fBXpb`Kvȃ^C~O

fBXpb`sKv̂́Cȉ̃^C~OłD

(a) T[rXR[ł̖Iȃ^XNfBXpb`v

^XNReLXgĂяoꂽT[rXR[ɂāCI
^XNfBXpb`vꂽꍇD̓Iɂ́CsԂ̃^XN
D揇ʂ̍słԂ̃^XNꍇƁCsԂ̃^XN
i^XNj҂ԂɂꍇD̏ꍇɂCT[rXR[
ŃfBXpb`𖾎IɌĂяoƂŁCfBXpb`sD

(b) ݃nh^CPUOnh̏o

݃nh^CPUOnhiȉCnhƑ̂jĂяo
ꂽT[rXR[Ń^XNfBXpb`vꂽꍇCnh̏o
Ń^XNfBXpb`Kv`FbNCKvł΃^XNfBXpb
`sDnhdɋNĂꍇCłÕnh̏o
ł̂ݍsijD

 vZbTɂẮCCPUOnh̓̐擪ł́C^XN
ReLXgłƔFȂꍇD̂悤ȏꍇC
̓rŃnhdɋNĂC̃nhłɊÕn
h邱ƂFłC̃nhŃ^XNfBXpb`s
ƂɂȂD̏ꍇłC̔^XNReLXgłƔF
Ȃ́Cnḧꕔł͂ȂƉ߂΁CĽ͎
邱ƂɂȂD̒ĹCȉ̋LqɂlɂĂ͂܂D

(2) ^XNO[`̋NKvȃ^C~O

^XNO[`N̂́CdlɂƁCu^XNO
ԁvuۗOv 0 łȂvu^XNsԂłvu^
XNReLXg܂CPUOnhsĂȂv̎l̏
ꍇłD̂ƂC^XNO[`̋NsK
v̂́Cȉ̃^C~OłD

(a) ^XNfBXpb`̒

^XNfBXpb`ɂCsԂ̃^XNiruntskjωDV
sԂɂȂ^XNN𖞂Ă΁C^XNO[`
ND

(b) ݃nh^CPUOnh̏o

݃nh^CPUOnhiȉCnhƑ̂j̏oł́C
^XNfBXpb`sꍇD̏ꍇɂ́C(a) ̗RŕKvȂC
^XNO[`ND

nh̏oŃ^XNfBXpb`sȂꍇłCnhŎs
Ԃ̃^XNɑ΂ă^XNOvꂽꍇɂ́Cnh̏o
ŋN`FbNCN𖞂Ă΃^XNO[`
NDnhdɋNĂꍇCłÕnh̏o
ł̂ݍsijD

(c) ^XNɑ΂^XNO̗v

^XNɑ΂ă^XNOvʁC^XNN𖞂
悤ɂȂ΁C^XNO[`ND

(d) ^XNŐ

^XNOԂɈڍsʁC^XNN𖞂悤
Ȃ΁C^XNO[`ND^XNOԂւ̈
śCena_tex ̌ďoɂċND

(3) T[rXR[ł̖IȃfBXpb`̌ďo

^XNReLXgĂяoꂽT[rXR[ɂăfBXpb
`KvɂȂꍇCT[rXR[̏𒆒fׂ^C~O 
dispatch ĂяoDdispatch ĂяoƁC̎_ōłD揇ʂ̍
^XNsDdispatch ́CĂяo^XNɎsԂɂ
ƃ^XNO[`̋N`FbNCN𖞂Ă
΃^XNO[`ND

̂߁Cdispatch ĂяoT[rXR[֏߂Ă̂́C
Ăяo^XNɎsԂƂȂCNׂ^XNO[`
ȂȂ_łD

ȂCdispatch ̏́C^[QbgˑŒ񋟂D

(4) ݃nh^CPUOnh̏oł̏

݃nh^CPUOnhiȉCnhƑ̂j̏o
ł́CfBXpb`KvC^XNO[`̋NKv`Fb
NCKvȏsDnhdɋNĂꍇCłO
nh̏oł݂̂̏sD

̓Iɂ́CfBXpb`ƃ^XNO[`̋N̂ꂩ̏
Kvȏꍇɂ reqflg  TRUE ɂ邱ƂƂCłÕnh̏o
 reqflg  TRUE ɂȂĂ΁C܂fBXpb`Kv`FbNC
KvȂfBXpb`sDfBXpb`ɂVɎsԂɂȂ^
XN^XNO[`̋N𖞂Ă΁C^XNO
[`NDfBXpb`KvȂꍇɂ́Cs̃^XN
^XNO[`̋N𖞂Ă邩`FbNC
΃^XNO[`ND̃^XNO[`
ŃCӖIɂ͈قȂ̂C[`Iɂ͋ʉł\
D

ȂCnh̏óC^[QbgˑŒ񋟂D

(5) ^XN̋NƏȈ

^XNÑWX^AƁC^XNĨWX^ۑ́C^[Qbg
ˑ̎ɂĂ͏ȗłD

^XN̋ŃCcreate_context  activate_context ɂāCɂ
^XNւ̃fBXpb`NɁC^XN̋NԒns悤
Ƀ^XNReLXgݒ肷邱ƂōsD

^XNIɂ́Cunlock_cpu ɑウāCexit_and_dispatch ĂяoD
exit_and_dispatch ́Cݎs̃ReLXgۑɁCfBXpb
`s֐łD

ȂCcreate_contextCactivate_contextCexit_and_dispatch ̏́C^[
QbgˑŒ񋟂D

(6) słԂ̃^XNȂꍇ̈

słԂ̃^XNȂꍇ̑΍ƂāCACh^XN𓱓
@DACh^XN𓱓ƁCfBXpb`̓rŊݑ
KvȂ̂ŁC\tgEFA̍\Iɂ̓GKgɂȂD܂C
fBXpb`ł̏DtɁCRAM ̎gpʂǂĂ
Ă܂Ƃ肪D̂ƂCACh^XN͎gȂj
D

(7) fBXpb`ۗԂ̕ێ@

fBXpb`ۗ̂́Ĉꂩ̏ꍇłD

 EfBXpb`֎~
 E^XNReLXgs

CPUOnh͔^XNReLXgŎsƂ߁CCPUOn
hśC^XNReLXgsɊ܂߂čl邱ƂłD
CT[rXR[ׂ͂Ċ݋֎~Ŏs邽߁CT[rXR[s
lKvȂD

̒ŁC^XNReLXgśCsense_context() ŔłD
ŁCfBXpb`֎~Ԃ\BOOL^̕ϐpӂ΁CfBXpb
`ۗԂێł邱ƂɂȂDۂɂ́CfBXpb`Ԃ\
BOOL^̕ϐ enatex 𓱓D

 T[rXR[sɊ݂ifBXpb`͋Ȃj
ꍇɂ́CT[rXR[̓rŋNꂽ݃nh̏oł́C
fBXpb`^XNO[`̋NsĂ͂ȂȂDQƂ
ꏊႤƂC҂̋֎~ʁX̕ϐɂ@l邪C
肷̌lƁC̕ϐŗ֎~łǂƎvD
Ȃ킿CfBXpb`֎~ԂƃT[rXR[sԂCϐ
rbgtB[hɕċL̂ÓƍlDɁCCPUO
nh^XNReLXgŎsł́CϐCPUOn
h̃lXg񐔂LȂDႦ΁Ĉ悤ȕϐ pndflg 𓱓
@lD

 Eŉʃrbg c T[rXR[s
                                 1 Ȃ痼ҕۗ
 E2rbg c fBXpb`֎~
                                 1 Ȃ^XNؑւۗ
 Ec̃rbg c CPUOnh̃lXg
                                 0 ȊOȂ^XNؑւۗ


SDT[rXR[̋Lq@

(1) sns_xxx

sns_ctxCsns_locCsns_dspCsns_tex ́CT[rXR[ŃNeBJ
ZNVȂĂłD

(2) ^XNReLXgp̃T[rXR[

 CPUbNԂŌĂ΂ƃG[ɂȂ邱ƂɒӁD

(2-1) ^XN؊NȂ́i: get_prij

        G[`FbN
        t_lock_cpu();
        /*
         *  NeBJZNVs
         */
        t_unlock_cpu();

(2-2) ^XN؊N\̂́i: act_tskj

        G[`FbN
        t_lock_cpu();
        /*
         *  NeBJZNVs
         */
        if (^XNfBXpb`Kv && enadsp) {
                /* ^XN҂ԂɂT[rXR[ł́C
                         enadsp `FbNKv͂ȂD*/
                dispatch();
        }
        t_unlock_cpu();

(2-3) ^XNÍiext_tskj

        G[`FbN
        t_lock_cpu();
        /*
         *  NeBJZNVs
         */
        exit_and_dispatch();

(2-4) ras_tex

        G[`FbN
        tcb = get_tcb_self(tskid);
        t_lock_cpu();

        E_OBJG[̃`FbN

        tcb->texptn |= rasptn;
        if (tcb == runtsk && runtsk->enatex) {
                texptn = runtsk->texptn;
                runtsk->enatex = FALSE;
                runtsk->texptn = 0;

                t_unlock_cpu();
                (*runtsk->tinib->texrtn)(texptn, runtsk->tinib->exinf);

                /* CPUbNԂ̂܂܃^[ꍇ΍ */
                if (!t_sense_lock()) {
                        t_lock_cpu();
                }

                ^XNO[`̋Nēx`FbNN
                iruntsk->texptn  0 ɂȂ܂ŏ̏JԂj

                runtsk->enatex = TRUE;
        }
        t_unlock_cpu();

(2-5) ena_tex

        G[`FbN
        t_lock_cpu();

        E_OBJG[̃`FbN

        runtsk->enatex = TRUE;
        if (runtsk->texptn != 0) {
                texptn = runtsk->texptn;
                runtsk->enatex = FALSE;
                runtsk->texptn = 0;

                t_unlock_cpu();
                (*runtsk->tinib->texrtn)(texptn, runtsk->tinib->exinf);

                /* CPUbNԂ̂܂܃^[ꍇ΍ */
                if (!t_sense_lock()) {
                        t_lock_cpu();
                }

                ^XNO[`̋Nēx`FbNN
                iruntsk->texptn  0 ɂȂ܂ŏ̏JԂj

                runtsk->enatex = TRUE;
        }
        t_unlock_cpu();

(3) ^XNReLXgp̃T[rXR[

 CPUbNԂŌĂ΂ƃG[ɂȂ邱ƂɒӁD

(3-1) ^XNؑւNȂ

        i_lock_cpu();
        /*
         *  NeBJZNVs
         */
        i_unlock_cpu();

(3-2) ^XNؑւN\̂́i: iact_tskj

        i_lock_cpu();
        /*
         *  NeBJZNVs
         *
         *  ^XNfBXpb`Kvȏꍇɂ́Creqflg  TRUE ɂD
         *  Cenadsp  FALSE ̎́Creqflg  TRUE ɂȂD
         */
        i_unlock_cpu();

(3-3) iras_tex

        G[`FbN
        tcb = get_tcb(tskid);
        i_lock_cpu();

        E_OBJG[̃`FbN

        tcb->texptn |= rasptn;
        if (tcb == runtsk && runtsk->enatex) {
                reqflg = TRUE;
        }
        i_unlock_cpu();

ȏ


