
               JSPJ[l RtBM[^dl 

             iRelease 1.4ΉCŏIXV: 20-Dec-2003j

------------------------------------------------------------------------ 
 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: configurator.txt,v 1.1 2008/06/17 00:04:40 suikan Exp $
------------------------------------------------------------------------


̃hLgł́CJSPJ[l̃RtBM[^ׂt@
C̓eɂĉD

JSPJ[l̃RtBM[^́CVXeRtBM[Vt@
CāCJ[l\t@Cikernel_cfg.cjIDt
t@Cikernel_id.hj𐶐D܂CÓIAPĨp[^`FbN
pt@Cikernel_chk.cj𐶐D

IDtʃt@ĆCRtBM[^IDԍtIu
WFNg̖OCtIDԍɒ`t@CłD

ȉł́CJ[l\t@C̓eɂĉD

(1) Œ萶

(1-1) WCN[ht@C

kernel_cfg.c p̃CN[ht@CCN[hvvZbT
fBNeBui#includej𐶐D̓Iɂ́C̍s𐶐D

#include "kernel_cfg.h"

܂CKvł΁CIDtʃt@CCN[hvv
ZbTfBNeBui#includej𐶐D̓Iɂ́C̍s𐶐
D

#include "kernel_id.h"

(1-2) }N̒u̐

}N̒uς邽߂ɁCȉ̃}N`s𐶐D

#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr)
#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr)
#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr)
#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr)

ȂC̃}ŃCX͉ߋ̃o[WƂ̌݊ۂ߂ɓ
ꂽ̂łDCߋ̃o[WƂ̌݊KvȂĂC}N
̒uς邽߂ɕKvłD

(2)uINCLUDEvÓIAPȈ

VXeRtBM[Vt@CɊ܂܂uINCLUDEvÓIAPIɑ
vvZbTfBNeBui#includej𐶐DႦ΁C

INCLUDE("\"sample1.h\"");

ƂÓIAPIɑ΂āC

#include "sample1.h"

ƂfBNeBu𐶐DfBNeBȕ́CVXe
RtBM[Vt@Cł̐ÓIAPȈɈvD

(3) eJ[lIuWFNgɊւ`

VXeRtBM[Vt@CɁCIuWFNg𐶐ÓI
APIuCRE_XXXv܂܂eJ[lIuWFNgɊւāCIuWFNg
̂߂̒`𐶐D

RtBM[^́Cނ̃IuWFNg𐶐ÓIAPIW߁C
IDԍ̏ɕבւDIDԍ̃IuWFNg𐶐ÓI
API܂܂Ăꍇɂ́CRtBM[^G[񍐂D 
JSPJ[ĺCIuWFNgIDԍAĂ邱Ƃ肵Ď
ĂDIDԍAĂȂꍇɂ́CRtBM[^G[
D

܂CRtBM[^́CIuWFNgIDԍ̑ɎʎqLq
ĂꍇɁC̃IuWFNgIDԍtDIDԍ́C
IuWFNgIDԍƏdȂCIDԍłA悤Ɋ
tDłIDԍAɂȂȂꍇɂ́CRtBM[^G
[񍐂D

eJ[lIuWFNgɊւ`̕WIȍ\́C̒ʂłDI
uWFNgɂėOꍇɂ́CIuWFNg̍ŐD

(a) IuWFNg̐

IuWFNg̐}N`vvZbTfBNeBui#definej
𐶐D̓Iɂ́CIuWFNg̏ȗLuXXXvƂƁC
悤ȍs𐶐D

#define TNUM_XXXID <IuWFNg̐>

(b) ő̃IuWFNgID̕ϐ̒`

ő̃IuWFNgIDϐ̒`𐶐D̓Iɂ́CIuWFN
g̏ȗLuXXX^xxxvƂƁĈ悤ȍs𐶐D

const ID tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);

(c) IuWFNgɕKvȃ̈̒`

IuWFNgɂẮCIuWFNgɕKvȃ̈̒`𐶐D
̓Iɂ́CIuWFNg̍ŐD

(d) IuWFNg̏ubN̒`

IuWFNg̏ubN̒`𐶐D̓Iɂ́CIuWFNg
̏ȗLuXXX^xxxvƂƁĈ悤ȍs𐶐D

const XXXINIB xxxinib_table[TNUM_XXXID] = {
        <IuWFNgID 1 ̃IuWFNg̏>,
        <IuWFNgID 2 ̃IuWFNg̏>,
                cc
        <IuWFNgID tmax_xxxid ̃IuWFNg̏>
};

IuWFNg̏̌`́CIuWFNgɈقȂD̓Iɂ́C
IuWFNg̍ŐD

(e) IuWFNg̃Rg[ubN̒`

IuWFNg̃Rg[ubN̒`𐶐D̓Iɂ́CIuWF
Ng̏ȗLuXXX^xxxvƂƁĈ悤ȍs𐶐D

XXXCB xxxcb_table[TNUM_XXXID];

(3-1) ^XNɊւ`

JSPJ[ĺC^XNȂP[XɑΉĂȂ߁C^XN
ւ`͕KȂ΂ȂȂD

^XNɊւ`̃CN[ht@CƃIuWFNg̏ȗL͎
̒ʂłDC^XNubÑf[^^ TINIBCϐ 
tinib_tableC^XNRg[ubÑf[^^ TCBCϐ 
tcb_table łiuTSK^tskvɑウāuT^tvpĂjD

        CN[ht@C: task.h
        IuWFNg̏ȗL: TSK

^XNubNɂ́CuCRE_TSKvÓIAPIŎw肳ɉāC
uDEF_TEXvÓIAPIŎw肳܂߂D

ȉł́CVXeRtBM[Vt@CɎ̐ÓIAPI܂܂
Ă鎞ɐׂɂďqׂD

CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stack });
DEF_TEX(tskid, { texatr, texrtn });

(3-1-1) ^XNɕKvȃ̈̒`

^XNɕKvȃ̈ƂāC^XÑX^bN̈悪De
^XNɁCw肳ꂽTCỸX^bN̈`D̓Iɂ́CL
̐ÓIAPIɑ΂āC̒`𐶐D

static __STK_UNIT <X^bN̈̕ϐ>[__TCOUNT_STK_UNIT(stksz)];

ŁC<X^bN̈̕ϐ> ́C^XNɈقȂ鎯ʎq𐶐ėp
D

(3-1-2) ^XN̏

^XNubNɐ^XN̏́Č`ƂD

        { tskatr, (VP_INT)(exinf), (FP)(task), INT_PRIORITY(itskpri),
            __TROUND_UNIT_STK(stksz), <X^bN̈̕ϐ>,
            texatr, (FP)(texrtn) }

ŁCCRE_TSK ɑΉ DEF_TEX Ȃꍇɂ́Ctexatr  TA_NULLC
texrtn  NULL ƂD

(3-1-3) ^XNe[u̒`

^XNɑ΂ẮCꂽi^XN𐶐ÓIAPILqꂽ
je[uɏo͂KvD́C^XN̐ꂽŁC
^XN̏i̓Iɂ́C^XN̋NjsKv邽߂ł
D

̓Iɂ́Ĉ悤ȍs𐶐D

const ID torder_table[TNUM_TSKID] = {
        <ŏɐꂽ^XÑ^XNID>,
        <2Ԗڂɐꂽ^XÑ^XNID>,
                cc
        <Ōɐꂽ^XÑ^XNID>
};

(3-1-4) G[

^XN̏ɊւG[͎̒ʂłD

EDEF_TEX ɑΉ CRE_TSK ȂꍇiE_NOEXSj
E(tskatr & ~(TA_ACT))  0 łȂꍇiE_RSATRj
E(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI) łȂꍇiE_PARj
Estack  NULL łȂꍇiE_NOSPTj
Etexatr  0 łȂꍇiE_RSATRj

 ̑ɁCtask  texrtn vO̊JnԒnƂĐȂꍇ
Cstksz ꍇɂG[ƂׂCG[^[Qb
gɈˑĂ܂߁C̉ۑƂD

(3-2) Z}tHɊւ`

Z}tHɊւ`̃CN[ht@CƃIuWFNg̏ȗL
̒ʂłD

        CN[ht@C: semaphore.h
        IuWFNg̏ȗL: SEM

ȉł́CVXeRtBM[Vt@CɎ̐ÓIAPI܂܂
Ă鎞ɐׂɂďqׂDȂCZ}tHɕKvȃ
͂ȂD

CRE_SEM(semid, { sematr, isemcnt, maxsem });

(3-2-1) Z}tH̏

Z}tHubNɐZ}tH̏́Č`Ƃ
D

        { sematr, isemcnt, maxsem }

(3-2-2) G[

Z}tH̏ɊւG[͎̒ʂłD

E(sematr & ~(TA_TPRI))  0 łȂꍇiE_RSATRj
E(isemcnt > maxsem) ̏ꍇiE_PARj
E(1 <= maxsem && maxsem <= TMAX_MAXSEM) łȂꍇiE_PARj

(3-3) CxgtOɊւ`

CxgtOɊւ`̃CN[ht@CƃIuWFNg̏ȗ
L͎̒ʂłD

        CN[ht@C: eventflag.h
        IuWFNg̏ȗL: FLG

ȉł́CVXeRtBM[Vt@CɎ̐ÓIAPI܂܂
Ă鎞ɐׂɂďqׂDȂCCxgtOɕKvȃ
̈͂ȂD

CRE_FLG(flgid, { flgatr, iflgptn });

(3-3-1) CxgtȌ

CxgtOubNɐCxgtȌ́C
̌`ƂD

        { flgatr, iflgptn }

(3-3-2) G[

CxgtȌɊւG[͎̒ʂłD

E(flgatr & ~(TA_TPRI|TA_CLR))  0 łȂꍇiE_RSATRj

(3-4) f[^L[Ɋւ`

f[^L[Ɋւ`̃CN[ht@CƃIuWFNg̏ȗL
͎̒ʂłD

        CN[ht@C: dataqueue.h
        IuWFNg̏ȗL: DTQ

ȉł́CVXeRtBM[Vt@CɎ̐ÓIAPI܂܂
Ă鎞ɐׂɂďqׂD

CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtq });

(3-4-1) f[^L[ɕKvȃ̈̒`

f[^L[ɕKvȃ̈ƂāCf[^L[̈悪D
ef[^L[ɁCKvȃTCỸf[^L[̈`D̓I
́CL̐ÓIAPIɑ΂āC̒`𐶐D

#if (dtqcnt) > 0
static VP_INT <f[^L[̈̕ϐ>[dtqcnt];
#else
#define <f[^L[̈̕ϐ> NULL
#endif

ŁC<f[^L[̈̕ϐ> ́Cf[^L[ɈقȂ鎯ʎq
ėpD

(3-4-2) f[^L[̏

f[^L[ubNɐf[^L[̏́C
`ƂD

        { dtqatr, dtqcnt, <f[^L[̈̕ϐ> }

(3-4-3) G[

f[^L[̏ɊւG[͎̒ʂłD

E(dtqatr & ~(TA_TPRI))  0 łȂꍇiE_RSATRj
Edtq  NULL łȂꍇiE_NOSPTj

(3-5) [{bNXɊւ`

[{bNXɊւ`̃CN[ht@CƃIuWFNg̏ȗ
L͎̒ʂłD

        CN[ht@C: mailbox.h
        IuWFNg̏ȗL: MBX

ȉł́CVXeRtBM[Vt@CɎ̐ÓIAPI܂܂
Ă鎞ɐׂɂďqׂDȂC[{bNXɕKvȃ
̈͂ȂD

CRE_MBX(mbxid, { mbxatr, maxmpri, mprihd });

(3-5-1) [{bNX̏

[{bNXubNɐ郁[{bNX̏́C
̌`ƂD

        { mbxatr, maxmpri }

(3-5-2) G[

[{bNX̏ɊւG[͎̒ʂłD

E(mbxatr & ~(TA_TPRI|TA_MPRI))  0 łȂꍇiE_RSATRj
E(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI) łȂꍇiE_PARj
Emprihd  NULL łȂꍇiE_NOSPTj

(3-6) Œ蒷v[Ɋւ`

Œ蒷v[Ɋւ`̃CN[ht@CƃIuWFNg
ȗL͎̒ʂłD

        CN[ht@C: mempfix.h
        IuWFNg̏ȗL: MPF

ȉł́CVXeRtBM[Vt@CɎ̐ÓIAPI܂܂
Ă鎞ɐׂɂďqׂD

CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf });

(3-6-1) Œ蒷v[ɕKvȃ̈̒`

Œ蒷v[ɕKvȃ̈ƂāCŒ蒷v[̈悪
DeŒ蒷v[ɁCKvȃTCY̌Œ蒷v[
̈`D̓Iɂ́CL̐ÓIAPIɑ΂āC̒`𐶐D

static __MPF_UNIT <Œ蒷v[̈̕ϐ>
                                [__TCOUNT_MPF_UNIT(blksz) * (blkcnt)];

ŁC<Œ蒷v[̈̕ϐ> ́CŒ蒷v[Ɉ
Ȃ鎯ʎq𐶐ėpD

(3-6-2) Œ蒷v[̏

Œ蒷v[ubNɐŒ蒷v[̏
́Č`ƂD

        { mpfatr, __TROUND_MPF_UNIT(blksz), <Œ蒷v[̈̕ϐ>,
                (VP)(((VB *) <Œ蒷v[̈̕ϐ>)
                        + sizeof(<Œ蒷v[̈̕ϐ>)) }

(3-6-3) G[

Œ蒷v[̏ɊւG[͎̒ʂłD

E(mpfatr & ~(TA_TPRI))  0 łȂꍇiE_RSATRj
Eblkcnt  0 ̏ꍇiE_PARj
Eblksz  0 ̏ꍇiE_PARj
Empf  NULL łȂꍇiE_NOSPTj

(3-7) nhɊւ`

nhɊւ`̃CN[ht@CƃIuWFNg̏ȗL
͎̒ʂłD

        CN[ht@C: cyclic.h
        IuWFNg̏ȗL: CYC

ȉł́CVXeRtBM[Vt@CɎ̐ÓIAPI܂܂
Ă鎞ɐׂɂďqׂDȂCnhɕKvȃ
̈͂ȂD

CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs });

(3-7-1) nh̏

nhubNɐnh̏́C
`ƂD

        { cycatr, exinf, (FP)(cychdr), cyctim, cycphs }

(3-7-2) G[

nh̏ɊւG[͎̒ʂłD

E(cycatr & ~(TA_STA))  0 łȂꍇiE_RSATRj
E(cyctim > TMAX_RELTIM) ̏ꍇiE_PARj
E(cycphs > TMAX_RELTIM) ̏ꍇiE_PARj

 ̑ɁCcychdr vO̊JnԒnƂĐȂꍇɂG[
ƂׂCG[^[QbgɈˑĂ܂߁C̉ۑ
D

(4) ݃nhɊւ`

VXeRtBM[Vt@CɁC݃nh`
IAPIuDEF_INHv܂܂ĂꍇɁC݃nhɊւ`𐶐
D̓Iɂ͎̒ʂD

(4-1) `銄݃nh̐

`銄݃nh̐}N`vvZbTfBNeBu
i#definej𐶐D܂C̒lϐ̒`𐶐D̓I
ɂ́Ĉ悤ȍs𐶐D

#define TNUM_INHNO <`銄݃nh̐>
const UINT      tnum_inhno = TNUM_INHNO;

(4-2) ݃nh̏o

`e݃nhɁC݃nh̏o[`𐶐
D̓Iɂ́C

DEF_INH(inhno, { inhatr, inthdr });

ƂÓIAPIɑ΂āC

CFG_INTHDR_ENTRY(inthdr);

Ƃs𐶐D

(4-3) ݃nhubN̒`

݃nhubN𐶐D̓Iɂ́Ĉ悤ȍs𐶐
D

const INHINIB inhinib_table[TNUM_INHNO] = {
        <݃nh 1 ̏>,
        <݃nh 2 ̏>,
                cc
        <݃nh TNUM_INHNO ̏>
};

̒̊݃nh̏́Č`ƂD

        { inhno, inhatr, (FP)CFG_INT_ENTRY(inthdr) }

(4-4) G[

݃nhɊւG[͎̒ʂłD

Einhatr  0 łȂꍇiE_RSATRj

 ̑ɁCinthdr vO̊JnԒnƂĐȂꍇC
inhno ݃nhԍƂĐȂꍇɂG[ƂׂC
G[^[QbgɈˑĂ܂߁C̉ۑƂD

(5) CPUOnhɊւ`

VXeRtBM[Vt@CɁCCPUOnh`
ÓIAPIuDEF_EXCv܂܂ĂꍇɁCCPUOnhɊւ`
D̓Iɂ͎̒ʂD

(5-1) `CPUOnh̐

`CPUOnh̐}N`vvZbTfBNeB
ui#definej𐶐D܂C̒lϐ̒`𐶐D
Iɂ́Ĉ悤ȍs𐶐D

#define TNUM_EXCNO <`CPUOnh̐>
const UINT      tnum_excno = TNUM_EXCNO;

(5-2) CPUOnh̏o

`eCPUOnhɁCCPUOnh̏o[`
D̓Iɂ́C

DEF_EXC(excno, { excatr, exchdr });

ƂÓIAPIɑ΂āC

CFG_EXCHDR_ENTRY(exchdr);

Ƃs𐶐D

(5-3) CPUOnhubN̒`

CPUOnhubN𐶐D̓Iɂ́Ĉ悤ȍs
D

const EXCINIB excinib_table[TNUM_EXCNO] = {
        <CPUOnh 1 ̏>,
        <CPUOnh 2 ̏>,
                cc
        <CPUOnh TNUM_EXCNO ̏>
};

̒CPUOnh̏́Č`ƂD

        { excno, excatr, (FP)CFG_EXC_ENTRY(exchdr) }

(5-4) G[

CPUOnhɊւG[͎̒ʂłD

Eexcatr  0 łȂꍇiE_RSATRj

 ̑ɁCexcthdr vO̊JnԒnƂĐȂꍇC
excno CPUOnhԍƂĐȂꍇɂG[ƂׂC
G[^[QbgɈˑĂ܂߁C̉ۑƂD

(6) ^CCxgǗɊւ`

^CCxgǗɊ֘AāC̒`𐶐D

TMEVTN  tmevt_heap[TNUM_TSKID + TNUM_CYCID];

(7) eW[̏֐̒`

eJ[lIuWFNg̊ǗC݊ǗCCPUOnhǗ̊e@\
֐ɌĂяo֐iobject_initializej𐶐Dgp
Ȃ@\̏֐́CĂяoȂD

ׂĂ̋@\gꍇɐ֐͎̒ʂłD

void
object_initialize()
{
        task_initialize();
        semaphore_initialize();
        eventflag_initialize();
        dataqueue_initialize();
        mailbox_initialize();
        mempfix_initialize();
        cyclic_initialize();
        interrupt_initialize();
        exception_initialize();
}

(8) [`̎s֐̒`

uATT_INIvÓIAPIŒǉ[`ɌĂяo֐𐶐D
̓Iɂ́C

ATT_INI({ iniatr, exinf, inirtn });

ƂÓIAPIɑ΂āC

inirtn((VP_INT)(exinf));

Ăяo֐Ccall_inirtn ƂOŐD[`
яóCVXeRtBM[Vt@Cł̐ÓIAPȈ
ɈvD

Ⴆ΁C

ATT_INI({ TA_HLNG, 0, timer_initialize });
ATT_INI({ TA_HLNG, (INT) CONSOLE_PORTID, serial_initialize });

Ƃ̐ÓIAPȈŋLqꂽɐ֐͎̒ʂ
D

void
call_inirtn()
{
        timer_initialize((VP_INT)(0));
        serial_initialize((VP_INT)((INT) CONSOLE_PORTID));
}

(8-1) G[

[`ɊւG[͎̒ʂłD

Einiatr  0 łȂꍇiE_RSATRj

 ̑ɁCinirtn vO̊JnԒnƂĐȂꍇɂG[
ƂׂCG[^[QbgɈˑĂ܂߁C̉ۑ
D

ȏ


