
		TOPPERS/ASPJ[l
		RtBM[^dl

		Ήo[W: Release 1.4.0
		ŏIXV: 2009N52

̃hLǵCTOPPERS/ASPJ[l̃RtBM[^WIɐ
ׂt@C̓eɂĉ̂łD^[Qbgˑɐ
eɂẮC̃hLg͈̔͊OłD

----------------------------------------------------------------------
 TOPPERS/ASP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Advanced Standard Profile Kernel

 Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
             Graduate School of Information Science, Nagoya Univ., JAPAN
 
 L쌠҂́Cȉ(1)`(4)̏𖞂ꍇɌC{\tgEF
 Ai{\tgEFAς̂܂ށDȉjgpEE
 ρEĔzziȉCpƌĂԁ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
     ܂C{\tgEFÃ[U܂̓Gh[ÛȂ闝
     RɊÂCL쌠҂TOPPERSvWFNg
     Ɛӂ邱ƁD
 
 {\tgEFÁCۏ؂Œ񋟂Ă̂łDL쌠҂
 TOPPERSvWFNǵC{\tgEFAɊւāC̎gpړI
 ɑ΂K܂߂āCȂۏ؂sȂD܂C{\tgEF
 A̗pɂ蒼ړI܂͊ԐړIɐȂ鑹QɊւĂC
 ̐ӔC𕉂ȂD
 
 @(#) $Id: configurator.txt 1540 2009-05-02 11:57:38Z ertl-hiro $
----------------------------------------------------------------------

ڎ

Et@C̎
EÓIAPIꗗ
EJ[l\Ewb_t@Cikernel_cfg.hj
EJ[l\Et@Cikernel_cfg.cj
	(1) Œ萶
	(2) CN[hfBNeBui#includej̏
	(3-1) g[XO}ÑftHg`
	(3-2) IuWFNgIDԍێϐ̒`
	(4) eJ[lIuWFNgɊւ`
	(5) ݂Ɋւ`
	(6) CPUOɊւ`
	(7) ^XNReLXgp̃X^bN̈Ɋւ`
	(8) ^CCxgǗɊւ`
	(9) eW[̏֐̒`
	(10) [`̎s֐̒`
	(11) I[`̎s֐̒`


t@C̎

ASPJ[l̃RtBM[^́CVXeRtBM[Vt@C
āCJ[l\Et@Cikernel_cfg.cjƍ\E
wb_t@Cikernel_cfg.hj𐶐D܂CRtBM[^
̓rɁCKvȒԃt@C𐶐D


ÓIAPIꗗ

ASPJ[l̃RtBM[^ÓIAPI͎̒ʂD

(1) ^XNǗ@\
	CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
								PRI itskpri, SIZE stksz, STK_T *stk })

(2) ^XNO@\
	DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn })

(3) EʐM@\
	CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
	CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
	CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
	CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })
	CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })

 dtqmbCpdqmbCmprihdNULLłȂꍇ̓T|[gȂD

(4) v[Ǘ@\
	CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
										MPF_T *mpf, void *mpfmb })

 mpfmbNULLłȂꍇ̓T|[gȂD

(5) ԊǗ@\
	CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr,
								RELTIM cyctim, RELTIM cycphs })
	CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr })

(6) ݊Ǘ@\
	CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
	ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri })
	DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })

(7) CPUOǗ@\
	DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })

(8) VXe\Ǘ@\
	DEF_ICS({ SIZE istksz, STK_T *istk })
	ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
	ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })

̐ÓIAPĨp[^̓CID^̃p[^̓IuWFNgʖC
|C^^ivoid *CTASKCTEXRTNCCYCHDRCALMHDRCISRCINTHDRCEXCHDRC
INIRTNCTERRTNCSTK_T *CMPF_T *jintptr_t^̃p[^͈ʒ
p[^ƂD̑̃p[^́C萔p[^ƂD


J[l\Ewb_t@Cikernel_cfg.hj

J[l\Ewb_t@Cikernel_cfg.hjɂ́C̒`𐶐
D

(1) Œ萶

kernel_cfg.hCN[ĥh߂̋Lq𐶐D
̓Iɂ́Ct@C̐擪Ɏ̍s𐶐D

#ifndef	TOPPERS_KERNEL_CFG_H
#define	TOPPERS_KERNEL_CFG_H

܂Ct@C̖Ɏ̍s𐶐D

#endif	/* TOPPERS_KERNEL_CFG_H */

(2) IuWFNg̒`

J[lT|[gIuWFNg̐}N`vvZbTfB
NeBui#definej𐶐D̓Iɂ́Ĉ悤ȋLq𐶐D

#define TNUM_TSKID	<^XN̐>
#define TNUM_SEMID	<Z}tH̐>
#define TNUM_FLGID	<CxgtO̐>
#define TNUM_DTQID	<f[^L[̐>
#define TNUM_PDQID	<Dxf[^L[̐>
#define TNUM_MBXID	<[{bNX̐>
#define TNUM_MPFID	<Œ蒷v[̐>
#define TNUM_CYCID	<nh̐>
#define TNUM_ALMID	<A[nh̐>

(3) IuWFNgIDԍ̒`

RtBM[^IDԍtIuWFNg̖OCt
IDԍɃ}N`vvZbTfBNeBui#definej𐶐D
Ⴆ΁Ĉ悤ȋLq𐶐D

#define TASK1	1
#define TASK2	2
#define SEM1	1

J[l\Et@Cikernel_cfg.cj

(1) Œ萶

kernel_cfg.cp̃wb_t@CIDtʃt@CCN[h
vvZbTfBNeBui#includej𐶐D̓Iɂ́C
̍s𐶐D

#include "kernel/kernel_int.h"
#include "kernel_cfg.h"

(2) CN[hfBNeBui#includej̏

VXeRtBM[Vt@CɊ܂܂CvvZbT̃C
N[hfBNeBui#includejƓ̃fBNeBui#includej
𐶐DႦ΁C

#include "sample1.h"

ƂCN[hfBNeBuɑ΂āC

#include "sample1.h"

ƂfBNeBu𐶐DfBNeBȕ́CVXe
RtBM[Vt@Cł̃CN[hfBNeBȕ
ɈvD

(3-1) g[XO}ÑftHg`

kernel_cfg.c̒Ŏgpg[XO}ÑftHg`𐶐D
̓Iɂ́C̍s𐶐D

#ifndef LOG_ISR_ENTER
#define LOG_ISR_ENTER(intno)
#endif /* LOG_ISR_ENTER */

#ifndef LOG_ISR_LEAVE
#define LOG_ISR_LEAVE(intno)
#endif /* LOG_ISR_LEAVE */

(3-2) IuWFNgIDԍێϐ̒`

RtBM[^ɑ΂IvVwi--external-idjɂCRtB
M[^ID ԍtIuWFNg̖O̖"_id"t
O̕ϐ𐶐Dϐ́CconsttID^̕ϐƂC
tIDԍlƂDႦ΁Ĉ悤ȋLq𐶐D

const ID TASK1_id = 1;
const ID TASK2_id = 2;
const ID SEM1_id = 1;

(4) eJ[lIuWFNgɊւ`

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

RtBM[^́Cނ̃IuWFNg𐶐ÓIAPIW߁Ce
IuWFNgIDԍtDIDԍ́C̃IuWFNgIDԍ
dȂCIDԍA悤ɊtD

RtBM[^ɑ΂IvVwi--id-input-filejɂCR
tBM[^IuWFNgɊtIDԍw肷邱ƂłD
ނ̈قȂIuWFNgɑ΂ēIDԍw肵CRtBM
[^IDԍłA悤ɊtƂĂIDԍA
Ȃꍇɂ́iASPJ[ĺCIuWFNgIDԍAĂ邱Ƃ
肵ĎĂjCRtBM[^̓G[񍐂D

܂CRtBM[^ɑ΂IvVwi--id-output-filejɂ
CRtBM[^IDԍtIuWFNg̖OƊt
IDԍ̑gCIvVŎw肵t@Cɏo͂D

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

(a) ő̃IuWFNgID̕ϐ̒`

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

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

(b) IuWFNgɕKvȃ̈̒`

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

(c) IuWFNg̏ubN̒`

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

const XXXINIB _kernel_xxxinib_table[TNUM_XXXID] = {
	<IuWFNgID1̃IuWFNg̏>,
	<IuWFNgID2̃IuWFNg̏>,
				cc
	<IuWFNgIDTNUM_XXXID̃IuWFNg̏>
};

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

(d) IuWFNg̃Rg[ubN̒`

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

XXXCB _kernel_xxxcb_table[TNUM_XXXID];

(4-1) ^XNɊւ`

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

^XN̏ȗĹuTSKvutskvłDC^XNubN
f[^^TINIBC̕ϐ_kernel_tinib_tableC^XNRg[u
bÑf[^^TCBC̕ϐ_kernel_tcb_table łi
uTSK^tskvɑウāuT^tvpĂjD

^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, stk });
DEF_TEX(tskid, { texatr, texrtn });

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

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

stkNULL̏ꍇ̂ݐ
static STK_T _kernel_stack_<^XN>[COUNT_STK_T(stksz)];

(4-1-2) ^XN̏

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

	{ (tskatr), (intptr_t)(exinf), (task), INT_PRIORITY(itskpri),
								(stksz), (stk), (texatr), (texrtn) }

ŁCstkNULL̏ꍇɂ́C(stksz)ɑウROUND_STK_T(stksz)C
(stk)ɑウ(_kernel_stack_<^XN>)𐶐DCRE_TSKɑΉ
DEF_TEXȂꍇɂ́CtexatrTA_NULLCtexrtnNULLƂD

(4-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 _kernel_torder_table[TNUM_TSKID] = {
	<ŏɐꂽ^XÑ^XNID>,
	<2Ԗڂɐꂽ^XÑ^XNID>,
				cc
	<Ōɐꂽ^XÑ^XNID>
};

(4-1-4) G[

^XNɊւG[͎̒ʂłD

RtBM[^{̂o
Etskidɑ΂CRE_TSKꍇiE_OBJj
EDEF_TEXɑΉCRE_TSKȂꍇiE_NOEXSj
Etskidɑ΂DEF_TEXꍇiE_OBJj

pX2Ōo
EtskatrimTA_ACTnjłȂꍇiE_RSATRj
	 ^[QbgˑŃ^XNǉiTARGET_TSKATRj
E(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)łȂꍇiE_PARj
EstkszX^bN̈̃TCYƂĐȂꍇiE_PARj
	- ^[Qbgˑ̒liCHECK_STKSZ_ALIGNj̔{łȂꍇ
	 ̃G[`FbŃCstkNULLłȂꍇɂ̂ݍs
EtexatriTA_NULLjłȂꍇiE_RSATRj

pX3Ōo
EtasktexrtnvO̊JnԒnƂĐȂꍇiE_PARj
	- ^[Qbgˑ̒liCHECK_FUNC_ALIGNj̔{łȂꍇ
	- NULL̏ꍇi^[QbgˑCCHECK_FUNC_NONNULLj
EstkX^bN̈̐擪ԒnƂĐȂꍇiE_PARj
	- ^[Qbgˑ̒liCHECK_STACK_ALIGNj̔{łȂꍇ
	- NULL̏ꍇi^[QbgˑCCHECK_STACK_NONNULLj

Kvɉă^[QbgˑŌo
EstkszꍇiE_PARj

(4-2) Z}tHɊւ`

Z}tH̏ȗĹuSEM^semvłDȉł́CVXeRtBM[
Vt@CɎ̐ÓIAPI܂܂Ă鎞ɐׂɂďq
DȂCZ}tHɕKvȃ̈͂ȂD

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

(4-2-1) Z}tH̏

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

	{ (sematr), (isemcnt), (maxsem) }

(4-2-2) G[

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

RtBM[^{̂o
Esemidɑ΂CRE_SEMꍇiE_OBJj

pX2Ōo
EsematrimTA_TPRInjłȂꍇiE_RSATRj
E(0 <= isemcnt && isemcnt <= maxsem)łȂꍇiE_PARj
E(1 <= maxsem && maxsem <= TMAX_MAXSEM)łȂꍇiE_PARj

(4-3) CxgtOɊւ`

CxgtȌȗĹuFLG^flgvłDȉł́CVXeRtB
M[Vt@CɎ̐ÓIAPI܂܂Ă鎞ɐׂɂ
ďqׂDȂCCxgtOɕKvȃ̈͂ȂD

CRE_FLG(flgid, { flgatr, iflgptn });

(4-3-1) CxgtȌ

CxgtOubNɐCxgtȌ́C
̌`ƂD

	{ (flgatr), (iflgptn) }

(4-3-2) G[

CxgtOɊւG[͎̒ʂłD

RtBM[^{̂o
Eflgidɑ΂CRE_FLGꍇiE_OBJj

pX2Ōo
EflgatrimTA_TPRInbmTA_WMULnbmTA_CLRnjłȂꍇiE_RSATRj

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

f[^L[̏ȗĹuDTQ^dtqvłDȉł́CVXeRtBM
[Vt@CɎ̐ÓIAPI܂܂Ă鎞ɐׂɂ
qׂD

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

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

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

dtqcnt0łȂꍇ̂ݐ
static intptr_t _kernel_dtqmb_<f[^L[>[dtqcnt];

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

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

	{ (dtqatr), (dtqcnt), (_kernel_dtqmb_<f[^L[>) }

ŁCdtqcnt0̏ꍇɂ́C_kernel_dtqmb_<f[^L[>ɑウāC
NULLpD

(4-4-3) G[

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

RtBM[^{̂o
Edtqidɑ΂CRE_DTQꍇiE_OBJj

pX2Ōo
EdtqatrimTA_TPRInjłȂꍇiE_RSATRj
EdtqmbNULLłȂꍇiE_NOSPTj

(4-5) Dxf[^L[Ɋւ`

Dxf[^L[̏ȗĹuPDQ^pdqvłDȉł́CVXeR
tBM[Vt@CɎ̐ÓIAPI܂܂Ă鎞ɐׂ
ɂďqׂD

CRE_PDQ(ID pdqid, { pdqatr, pdqcnt, maxdpri, pdqmb });

(4-5-1) Dxf[^L[ɕKvȃ̈̒`

Dxf[^L[ɕKvȃ̈ƂāCDxf[^L[Ǘ̈
DDxf[^L[ɁCKvȃTCY̗Dxf[^L[
Ǘ̈`D̓Iɂ́CL̐ÓIAPIɑ΂āC̒`𐶐
D

pdqcnt0łȂꍇ̂ݐ
static PDQMB _kernel_pdqmb_<Dxf[^L[>[pdqcnt];

(4-5-2) Dxf[^L[̏

Dxf[^L[ubNɐDxf[^L[̏
́Č`ƂD

	{ (pdqatr), (pdqcnt), (maxdpri), (_kernel_pdqmb_<Dxf[^L[>) }

ŁCpdqcnt0̏ꍇɂ́C_kernel_pdqmb_<Dxf[^L[>ɑウ
āCNULLpD

(4-5-3) G[

Dxf[^L[ɊւG[͎̒ʂłD

RtBM[^{̂o
Epdqidɑ΂CRE_PDQꍇiE_OBJj

pX2Ōo
EpdqatrimTA_TPRInjłȂꍇiE_RSATRj
E(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)łȂꍇiE_PARj
EpdqmbNULLłȂꍇiE_NOSPTj

(4-6) [{bNXɊւ`

[{bNX̏ȗĹuMBX^mbxvłDȉł́CVXeRtB
M[Vt@CɎ̐ÓIAPI܂܂Ă鎞ɐׂɂ
ďqׂDȂC[{bNXɕKvȃ̈͂ȂD

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

(4-6-1) [{bNX̏

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

	{ (mbxatr), (maxmpri) }

(4-6-2) G[

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

RtBM[^{̂o
Embxidɑ΂CRE_MBXꍇiE_OBJj

pX2Ōo
EmbxatrimTA_TPRInbmTA_MPRInjłȂꍇiE_RSATRj
E(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)łȂꍇiE_PARj
EmprihdNULLłȂꍇiE_NOSPTj

(4-7) Œ蒷v[Ɋւ`

Œ蒷v[̏ȗĹuMPF^mpfvłDȉł́CVXeR
tBM[Vt@CɎ̐ÓIAPI܂܂Ă鎞ɐׂ
ɂďqׂD

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

(4-7-1) Œ蒷v[ɕKvȃ̈̒`

Œ蒷v[ɕKvȃ̈ƂāCŒ蒷v[̈ƌ
蒷v[Ǘ̈悪DŒ蒷v[ɁCKv
TCY̌Œ蒷v[̈impfNULL̏ꍇ̂݁jƌŒ蒷v[
Ǘ̈mۂD̓Iɂ́CL̐ÓIAPIɑ΂āC̒`𐶐
D

mpfNULL̏ꍇ̂ݐ
static MPF_T _kernel_mpf_<Œ蒷v[>[(blkcnt) * COUNT_MPF_T(blksz)];
								
K
static MPFMB _kernel_mpfmb_<Œ蒷v[>[blkcnt];

(4-7-2) Œ蒷v[̏

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

	{ (mpfatr), (blkcnt), ROUND_MPF_T(blksz), mpf,
						(_kernel_mpfmb_<Œ蒷v[>) }

ŁCmpfNULL̏ꍇɂ́CmpfɑウāC_kernel_mpf_<Œ蒷v[
>pD

(4-7-3) G[

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

RtBM[^{̂o
Empfidɑ΂CRE_MPFꍇiE_OBJj

pX2Ōo
EmpfatrimTA_TPRInjłȂꍇiE_RSATRj
Eblkcnt0̏ꍇiE_PARj
Eblksz0̏ꍇiE_PARj
EmpfmbNULLłȂꍇiE_NOSPTj

pX3Ōo
EmpfŒ蒷v[̈̐擪ԒnƂĐȂꍇiE_PARj
	- ^[Qbgˑ̒liCHECK_MPF_ALIGNj̔{łȂꍇ
	- NULL̏ꍇi^[QbgˑCCHECK_MPF_NONNULLj

(4-8) nhɊւ`

nh̏ȗĹuCYC^cycvłDȉł́CVXeRtB
M[Vt@CɎ̐ÓIAPI܂܂Ă鎞ɐׂɂ
ďqׂDȂCnhɕKvȃ̈͂ȂD

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

(4-8-1) nh̏

nhubNɐnh̏́C
`ƂD

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

(4-8-2) G[

nhɊւG[͎̒ʂłD

RtBM[^{̂o
Ecycidɑ΂CRE_CYCꍇiE_OBJj

pX2Ōo
EcycatrimTA_STAnjłȂꍇiE_RSATRj
E(0 < cyctim && cyctim <= TMAX_RELTIM)łȂꍇiE_PARj
E(0 <= cycphs && cycphs <= TMAX_RELTIM)łȂꍇiE_PARj
ExFcycatrTA_STAݒ肳ĂāC(cycphs == 0)̏ꍇ

pX3Ōo
EcychdrvO̊JnԒnƂĐȂꍇiE_PARj
	- ^[Qbgˑ̒liCHECK_FUNC_ALIGNj̔{łȂꍇ
	- NULL̏ꍇi^[QbgˑCCHECK_FUNC_NONNULLj

(4-9) A[nhɊւ`

A[nh̏ȗĹuALM^almvłDȉł́CVXeR
tBM[Vt@CɎ̐ÓIAPI܂܂Ă鎞ɐׂ
ɂďqׂDȂCA[nhɕKvȃ̈͂ȂD

CRE_ALM(ID almid, { almatr, (intptr_t)(exinf), almhdr });

(4-9-1) A[nh̏

A[nhubNɐA[nh̏
́Č`ƂD

	{ (almatr), (exinf), (almhdr) }

(4-9-2) G[

A[nhɊւG[͎̒ʂłD

RtBM[^{̂o
Ealmidɑ΂CRE_ALMꍇiE_OBJj

pX2Ōo
EalmatriTA_NULLjłȂꍇiE_RSATRj

pX3Ōo
EalmhdrvO̊JnԒnƂĐȂꍇiE_PARj
	- ^[Qbgˑ̒liCHECK_FUNC_ALIGNj̔{łȂꍇ
	- NULL̏ꍇi^[QbgˑCCHECK_FUNC_NONNULLj

(5) ݂Ɋւ`

݂ɊւĐ́C^[Qbgɒ߂邱ƂłD^[Qb
gɒ߂Ȃꍇɂ́Cȉŏqׂ^[QbgɈˑȂWIȏ
𐶐D^[Qbgɒ߂ꍇɂ́C(5-1)(5-3)ɏqׂ͐
Ȃi(5-2)ɏqׂ͐jD

(5-1) ݗvCɊւ`

ݗvC̑ݒ肷ÓIAPIuCFG_INTvŐݒ肵ݗv
CɊւ`𐶐D̓Iɂ͎̒ʂD

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

CFG_INT(INTNO intno, { intatr, intpri });

(5-1-1) ݒ肷銄ݗvC̐

ݒ肷銄ݗvC̐}N`vvZbTfBNeB
ui#definej𐶐D܂C̒lϐ̒`𐶐D̓I
ɂ́Ĉ悤ȍs𐶐D

#define TNUM_INTNO <ݒ肷銄ݗvC̐>
const uint_t	_kernel_tnum_intno = TNUM_INTNO;

(5-1-2) ݗvCubN̒`

ݗvCubN𐶐D̓Iɂ́Ĉ悤ȍs
D

const INTINIB _kernel_intinib_table[TNUM_INTNO] = {
	<ݗvC1̏>,
	<ݗvC2̏>,
				cc
	<ݗvCTNUM_INTNȌ>
};

̒̊ݗvC̏́Č`ƂD

	{ (intno), (intatr), (intpri) }

(5-1-3) G[

ݗvCɊւG[͎̒ʂłD

pX2Ōo
EintnoCFG_INTɑ΂銄ݔԍƂĐȂꍇiE_PARj
EintnoCFG_INTɂĐݒς݂̏ꍇiE_OBJj
EintatrimTA_ENAINTnbmTA_EDGEnjłȂꍇiE_RSATRj
	 ^[QbgˑŊݑǉiTARGET_INTATRj
EintpriCFG_INTɑ΂銄ݗDxƂĐȂꍇiE_PARj

Kvɉă^[QbgˑŌo
EintatrݑƂĐݒłȂl̏ꍇiE_RSATRj
EintpriݗDxƂĐݒłȂl̏ꍇiE_PARj
EJ[lǗɌŒ肳Ăinhnoɑ΂āCintpriTMIN_INTPRI
@lw肳ꂽꍇiE_OBJj
EJ[lǗOɌŒ肳Ăinhnoɑ΂āCintpriTMIN_INTPRI
@lw肳ȂꍇiE_OBJj
E̊ݗDxݒłȂݗvCɑ΂āCقȂ銄
@ݗDxݒ肵ꍇiE_PARj

(5-2) ݃T[rX[`Ɋւ`

(5-2-1) ݃nh̐

VXeRtBM[Vt@CɊ܂܂銄݃T[rX[`
ǉÓIAPIuATT_ISRvɑ΂āC̊ݔԍɑ΂Ēǉ
ꂽ݃T[rX[`ɌĂяo֐𐶐D

̓Iɂ́C̊ݔԍɑ΂Ċ݃T[rX[`ǉ

ATT_ISR({ isratr_1, exinf_1, intno, isr_1, isrpri_1 });
ATT_ISR({ isratr_2, exinf_2, intno, isr_2, isrpri_2 });
	cc
ATT_ISR({ isratr_n, exinf_n, intno, isr_n, isrpri_n });

ƂÓIAPIɑ΂āĈ悤Ȋ֐𐶐DŁCisrpri_1C
isrpri_2CccCisrpri_ńCl̏ɕבւĂ̂ƂD
l̂̊Ԃł́CVXeRtBM[Vt@Cł̐ÓI
APȈ̒ʂɕł̂ƂD

static void
_kernel_inthdr_<intno>(void)
{
	PRI		saved_ipm;

	i_begin_int(intno);
	saved_ipm = i_get_ipm();

	LOG_ISR_ENTER(<intno>);		/* ISR1̌ďo */
	isr_1((intptr_t)(exinf_1));
	LOG_ISR_LEAVE(intno);

	if (i_sense_loc()) {		/* ISŘďoȌԂɖ߂ */
		i_unlock_cpu();
	}
	i_set_ipm(saved_ipm);

	LOG_ISR_ENTER(<intno>);		/* ISR2̌ďo */
	isr_2((intptr_t)(exinf_2));
	LOG_ISR_LEAVE(intno);

	if (i_sense_loc()) {		/* ISŘďoȌԂɖ߂ */
		i_unlock_cpu();
	}
	i_set_ipm(saved_ipm);

	cc

	LOG_ISR_ENTER(<intno>);		/* ISRňďo */
	isr_n((intptr_t)(exinf_n));
	LOG_ISR_LEAVE(intno);

	i_end_int(intno);
}

ŁCISRňďǒɌďoȌԂɖ߂Ȃ̂́C݃nh
̃^[ɂCJ[l̏Ԃɖ߂߂łD

̊ݔԍɑ΂Ēǉꂽ݃T[rX[`1݂̂̏ꍇ
ɂ́Ĉ悤Ȋ֐𐶐D

static void
_kernel_inthdr_<intno>(void)
{
	i_begin_int(intno);
	LOG_ISR_ENTER(intno);
	isr_1((intptr_t)(exinf_1));
	LOG_ISR_LEAVE(intno);
	i_end_int(intno);
}

yۑzŁCLOG_ISR_ENTERCLOG_ISR_LEAVËǂ邩ۑ
ĎcĂDATT_ISRœo^ꂽISRɑ΂ĂISR IDt^Ȃ
߁CIDISRʂ邱ƂłȂDނȂݔԍnĂ邪C
giexinfjnׂȂD

(5-2-2) ݃nh̒`ɑ鏈

̂悤Ɋ݃nh𐶐ꍇɂ́Cɐ銄݃nh
Ɋւ`ɂāCVXeRtBM[Vt@CɎ̐
IAPI܂܂Ă̂ƓlɏD

DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> });

inhnóCintnoɑΉ銄݃nhԍłD

(5-2-3) G[

݃T[rX[`ɊւG[͎̒ʂłD

pX2Ōo
EisratriTA_NULLjłȂꍇiE_RSATRj
	 ^[QbgˑŊ݃T[rX[`ǉiTARGET_ISRATRj
EintnoATT_ISRɑ΂銄ݔԍƂĐȂꍇiE_PARj
	 intnoɑΉinhnoȂꍇ܂
E(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)łȂꍇiE_PARj
EintnoɑΉinhnoɑ΂DEF_INHꍇiE_OBJj
Eintnoɑ΂CFG_INTȂꍇiE_OBJj
Eintnoɑ΂CFG_INTŐݒ肳ꂽݗDxTMIN_INTPRI
@ꍇiE_OBJj
	 J[lǗOISR̓T|[gȂ

Kvɉă^[QbgˑŌo
EisrvO̊JnԒnƂĐȂꍇiE_PARj

(5-3) ݃nhɊւ`

݃nh`ÓIAPIuDEF_INHvŒ`݃nhi
q̊݃T[rX[`̒ǉɂRtBM[^
݃nh܂ށjɊւ`𐶐D̓Iɂ͎̒ʂD

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

DEF_INH(inhno, { inhatr, inthdr });

(5-3-1) `銄݃nh̐

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

#define TNUM_INHNO <`銄݃nh̐>
const uint_t	_kernel_tnum_inhno = TNUM_INHNO;

(5-3-2) ݃nh̏o

`銄݃nhɁC݃nh̏o[`𐶐
D̓Iɂ́Ĉ悤ȍs𐶐D

INTHDR_ENTRY(inhno, inhno_num, inthdr)

inhno_nuḿCinhnoi݃nhԍj𐔒lŕ\̂ŁC
AZuLqɎgp邽߂̂̂łD

(5-3-3) ݃nhubN̒`

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

const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {
	<݃nh1̏>,
	<݃nh2̏>,
				cc
	<݃nhTNUM_INHNȌ>
};

̒̊݃nh̏́Č`ƂD

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

(5-3-4) G[

݃nhɊւG[͎̒ʂłD

pX2Ōo
EinhnoDEF_INHɑ΂銄݃nhԍƂĐȂꍇiE_PARj
EinhnoDEF_INHɂĐݒς݂̏ꍇiE_OBJj
#EinhnoɑΉintnoɑ΂ATT_ISRꍇiE_OBJj
#	 inhnoɑΉintnoȂꍇɂ́C̃`FbNsȂ
#	 ̃`FbŃC݃T[rX[`ōs
EinhatrimTA_NONKERNELnjłȂꍇiE_RSATRj
	 ^[QbgˑŊ݃nhǉiTARGET_INHATRj
EinhnoɑΉintnoɑ΂CFG_INTȂꍇiE_OBJj
	 inhnoɑΉintnoȂCinhnoɑΉintnoCFG_INTɑ
	@ 銄ݔԍƂĐȂꍇɂ́C̃`FbNsȂ
EinhatrTA_NONKERNELw肳Ă炸CinhnoɑΉintnoɑ΂
@CFG_INTŐݒ肳ꂽݗDxTMIN_INTPRIꍇiE_OBJj
	 inhnoɑΉintnoȂCinhnoɑΉintnoCFG_INTɑ
	@ 銄ݔԍƂĐȂꍇɂ́C̃`FbNsȂ
EinhatrTA_NONKERNELw肳ĂCinhnoɑΉintnoɑ΂
@CFG_INTŐݒ肳ꂽݗDxTMIN_INTPRIȏłꍇiE_OBJj
	 inhnoɑΉintnoȂCinhnoɑΉintnoCFG_INTɑ
	@ 銄ݔԍƂĐȂꍇɂ́C̃`FbNsȂ

Kvɉă^[QbgˑŌo
EJ[lǗɌŒ肳Ăinhnoɑ΂āCinhatrTA_NONKERNELw
@ĂꍇiE_RSATRj
EJ[lǗOɌŒ肳Ăinhnoɑ΂āCinhatrTA_NONKERNELw
@肳ĂȂꍇiE_RSATRj
EinthdrvO̊JnԒnƂĐȂꍇiE_PARj

(6) CPUOɊւ`

CPUOɊւĐ́C^[Qbgɒ߂邱ƂłD^[Qb
gɒ߂Ȃꍇɂ́Cȉŏqׂ^[QbgɈˑȂWIȏ
𐶐D^[Qbgɒ߂ꍇɂ́C̏͐ȂD

VXeRtBM[Vt@CɁCCPUOnh`
ÓIAPIuDEF_EXCv܂܂ĂꍇɁCCPUOnhɊւ`
D

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

DEF_EXC(excno, { excatr, exchdr });

(6-1) `CPUOnh̐

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

#define TNUM_EXCNO <`CPUOnh̐>
const uint_t	_kernel_tnum_excno = TNUM_EXCNO;

(6-2) CPUOnh̏o

`CPUOnhɁCCPUOnh̏o[`𐶐
D̓Iɂ́Ĉ悤ȍs𐶐D

EXCHDR_ENTRY(excno, excno_num, exchdr)

excno_nuḿCexcnoiCPUOnhԍj𐔒lŕ\̂ŁC
AZuLqɎgp邽߂̂̂łD

(6-3) CPUOnhubN̒`

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

const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {
	<CPUOnh1̏>,
	<CPUOnh2̏>,
				cc
	<CPUOnhTNUM_EXCNȌ>
};

̒CPUOnh̏́Č`ƂD

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

(6-4) G[

CPUOnhɊւG[͎̒ʂłD

pX2Ōo
EexcnoDEF_EXCɑ΂CPUOnhԍƂĐȂꍇiE_PARj
EexcnoDEF_EXCɂĐݒς݂̏ꍇiE_OBJj
EexcatriTA_NULLjłȂꍇiE_RSATRj
	 ^[QbgˑCPUOnhǉiTARGET_EXCATRj

Kvɉă^[QbgˑŌo
EexchdrvO̊JnԒnƂĐȂꍇiE_PARj

(7) ^XNReLXgp̃X^bN̈Ɋւ`

^XNReLXgp̃X^bN̈Ɋւ`́CKȂ
ȂȂD

(7-1) DEF_ICSȂꍇ

VXeRtBM[Vt@CɁCÓIAPIuDEF_ICSv܂܂
Ȃꍇɂ́C̍s𐶐D

#ifdef DEFAULT_ISTK

#define TOPPERS_ISTKSZ		DEFAULT_ISTKSZ
#define TOPPERS_ISTK		DEFAULT_ISTK

#else /* DEFAULT_ISTK */

static STK_T				_kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];
#define TOPPERS_ISTKSZ		ROUND_STK_T(DEFAULT_ISTKSZ)
#define TOPPERS_ISTK		_kernel_istack

#endif /* DEFAULT_ISTK */

(7-2) DEF_ICSꍇ

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

DEF_ICS({ istksz, istk });

istkNULL̏ꍇɂ́Cw肳ꂽTCY̔^XNReLXgp̃X^b
N̈mۂC^XNReLXgp̃X^bN̈̏𐶐
D̓Iɂ́CL̐ÓIAPIɑ΂āC̍s𐶐D

static STK_T				_kernel_istack[COUNT_STK_T(istksz)];
#define TOPPERS_ISTKSZ		ROUND_STK_T(istksz)
#define TOPPERS_ISTK		_kernel_istack

istkNULLłȂꍇɂ́C^XNReLXgp̃X^bN̈̏
Č`ŐD

#define TOPPERS_ISTKSZ		(istksz)
#define TOPPERS_ISTK		(istk)

(7-3) ϐ̐

DEF_ICS̗Lɂ炸C̒`𐶐D

const SIZE		_kernel_istksz = TOPPERS_ISTKSZ;
STK_T *const	_kernel_istk = TOPPERS_ISTK;

#ifdef TOPPERS_ISTKPT
STK_T *const	_kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);
#endif /* TOPPERS_ISTKPT */

(7-4) G[

^XNReLXgp̃X^bN̈ɊւG[͎̒ʂłD

pX2Ōo
EÓIAPIuDEF_ICSviE_OBJj
EistkszX^bN̈̃TCYƂĐȂꍇiE_PARj
	- ^[Qbgˑ̒liCHECK_STKSZ_ALIGNj̔{łȂꍇ
	 ̃G[`FbŃCistkNULLłȂꍇɂ̂ݍs

pX3Ōo
EistkX^bN̈̐擪ԒnƂĐȂꍇiE_PARj
	- ^[Qbgˑ̒liCHECK_STACK_ALIGNj̔{łȂꍇ
	- NULL̏ꍇi^[QbgˑCCHECK_STACK_NONNULLj

Kvɉă^[QbgˑŌo
EistkszꍇiE_PARj

(8) ^CCxgǗɊւ`

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

TMEVTN	_kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];

(9) eW[̏֐̒`

eJ[lIuWFNg̊ǗC݊ǗCCPUOnhǗ̊e@\
֐ɌĂяo֐i_kernel_initialize_objectj𐶐D
2̏֐ẮCgpȂ@\̏֐͌ĂяoȂD

	_kernel_initialize_interrupt
	_kernel_initialize_exception

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

void
_kernel_initialize_object(void)
{
	_kernel_initialize_task();
	_kernel_initialize_semaphore();
	_kernel_initialize_eventflag();
	_kernel_initialize_dataqueue();
	_kernel_initialize_pridataq();
	_kernel_initialize_mailbox();
	_kernel_initialize_mempfix();
	_kernel_initialize_cyclic();
	_kernel_initialize_alarm();
	_kernel_initialize_interrupt();
	_kernel_initialize_exception();
}


(10) [`̎s֐̒`

VXeRtBM[Vt@CɊ܂܂鏉[`ǉ
ÓIAPIuATT_INIvɑ΂āCǉ[`ɌĂяo
𐶐D̓Iɂ́C

ATT_INI({ iniatr, exinf, inirtn });

ƂÓIAPIɑ΂āC

	(inirtn)((intptr_t)(exinf));

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

Ⴆ΁C

ATT_INI({ TA_NULL, 0, timer_initialize });
ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });

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

void
_kernel_call_inirtn(void)
{
	(timer_initialize)((intptr_t)(0));
	(serial_initialize)((intptr_t)(CONSOLE_PORTID));
}

(10-1) G[

[`ɊւG[͎̒ʂłD

pX2Ōo
EiniatriTA_NULLjłȂꍇiE_RSATRj

Kvɉă^[QbgˑŌo
EinirtnvO̊JnԒnƂĐȂꍇiE_PARj

(11) I[`̎s֐̒`

VXeRtBM[Vt@CɊ܂܂I[`
ÓIAPIuATT_TERvɑ΂āCǉI[`ɌĂяo
֐𐶐D̓Iɂ́C

ATT_TER({ teratr, exinf, terrtn });

ƂÓIAPIɑ΂āC

	(terrtn)((intptr_t)(exinf));

Ăяo֐C_kernel_call_terrtnƂOŐDI[
`ĂяóCVXeRtBM[Vt@Cł̐ÓI
API̋tɈvD

Ⴆ΁C

ATT_TER({ TA_NULL, 0, timer_terminate });
ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });

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

void
_kernel_call_terrtn(void)
{
	(serial_terminate)((intptr_t)(CONSOLE_PORTID));
	(timer_terminate)((intptr_t)(0));
}

(11-1) G[

I[`ɊւG[͎̒ʂłD

pX2Ōo
EteratriTA_NULLjłȂꍇiE_RSATRj

Kvɉă^[QbgˑŌo
EterrtnvO̊JnԒnƂĐȂꍇiE_PARj

ȏ
