
		TOPPERS/ASPJ[l
		݌v

		Ήo[W: Release 1.4.0
		ŏIXV: 2009N36i쐬j

̃hLǵCTOPPERS/ASPJ[l̐݌vłD쐬̂̂
CԗIł͂ȂD

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

 Copyright (C) 2005-2009 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: design.txt 1546 2009-05-08 10:05:22Z ertl-hiro $
----------------------------------------------------------------------

ڎ

ETOPPERS/ASPJ[l̎݌vj
ECHECK}Ngoto̎gp
Eext_tskCext_ker̕Ԃl
EJ[l̃f[^\ɑ΂volatile錾ɂ
E^LXgɔxbZ[W
EDxf[^L[@\
E\]pVXeQƋ@\
Ecall_texrtndispatchĂяoɂ
E^XNO֎~tOenatexŎĂ闝R


TOPPERS/ASPJ[l̎݌vj

TOPPERS/ASPJ[liȉCASPJ[lj́CTOPPERSVJ[l̊
ƂȂ郊A^CJ[lłDTOPPERSVJ[ldl̐݌vjƁC
ASPJ[l̓KpΏۗ̈Ɛ݌vjɂẮCTOPPERSVJ[l
dlɏqׂĂD

ȉł́CASPJ[l̎݌vjɂďqׂ邪Cdl݌vjƂ
AĂCmɕłȂD

TOPPERS/ASPJ[l̎݌vsɂC̕jݒ肷D

(1) \[XR[h̓ǂ݂₷E₷d

\[XR[hǂ݂₷Ƃ́CI[v\[X\tgEFA̕i
ōłdvȓłD\[XR[h𗝉ĂZp҂
邱ƂŁC𑁊ɔ邱ƂłCT|[g̐[邱
łD܂C\[XR[hǂ݂₷Ƃ́CVvȐ݌v
邱ƂӖĂCMɂȂDɁCZpҋ̂
߂̋ނƂϓ_C\[XR[hǂ݂₷Ƃ͏dvƂȂD

₷Ƃ́CVXe̗vɂ킹`[jOs₷
ƂӖĂCC荇킹^̊Jx鐫łD܂CASPJ[
lՂƂTOPPERSVJ[lV[YJĂłC
₷Ƃ͕K{̏łD

(2) V^[QbgVXeւ̃|[eBOeՂȍ\Ƃ

g݃VXeɂ͑lȃn[hEFAp邽߁CɗeՂɃ|[
eBOł邱Ƃ͏dvȐłD̂߂ɁCs\ɔz
n[hEFA𒊏ۉC^[QbgVXeɈˑ镔ƈˑȂ
𖾊mɕD܂CJiRpCȂǁjɈˑ镔
mɕD

(3) ؂eՂȍ\Ƃ

Mmۂ邽߂ɁC؂eՂȍ\ƂD

̓Iɂ́CT[rXR[̂قƂǑŜ݋֎~Ŏs邱ƂƂC
T[rXR[̏rŊ݂ȂD̍\́Cǂ݂₷
₷\[XR[hɂ邽߂ɂLłDɂ芄݉
]ɂȂ邪CɂĖ𐶂AvP[V͏łC
ނȂ̂ƍlD

܂CRpCɂRtBM[Vłӏ𑝂₷ƁC
ׂȍœKłŁC؂ׂg邱ƂCRtB
M[Vłӏ͕KvŒƂD

(4) s\ƃgpʂɔz

L̕j𖞂ŁCs\ƏgpʂBł
悤ȎsDs\コۂɂ́Cϐ\̌C
\̌dD

\[XR[h̓ǂ݂₷dƌĂCs\̈ASY
Ղɍ̗p邱Ƃ͂Cs\BłASYp
DCV^[QbgVXeւ̃|[eBOeՂɂ邽
ɑ啔CŎĂCׂĂAZuŋLqꍇɔ
ׂĎs\̂͂ނȂD

gpʂɂẮCRAM̎gpʂ팸邱Ƃɏd_u݌vs
CL̕jюs\Ƃ̃g[hItlC肬܂ł
팸͍sȂD

(5) XP[reBɔz

lXȋK͂̃VXeɓKpłXP[reB\ƂD
ɁCK͂ȃVXeɓKpۂɁCgpȂ@\J[lĂ
邱Ƃɂ郁gpʂ̑ŏɂȂ悤ɔzD

̓Iɂ́CAvP[VƃJ[l1̃[hW[ɃN
@i1Nfjz肵CJ[l֐PʂŃCuāC
gp֐݂̂N\ƂD͈̃RtBM[
Vł邪C̕@́CRpCɂRtBM[V
Ƃ͈ႢC؍Hɗ^eD

܂CŒIɎgpRAM̈炵CX^bNɒu͂ł
X^bNɒuD


CHECK}Ngoto̎gp

ASPJ[l̎ɂẮCT[rXR[̐ÓIȃG[`FbN
߂ɁĈ"CHECK_"Ŏn܂Ã}NiCCHECK}NƑ
jpĂD

CHECK}N̒`ɂgoto܂ł邪CMISRA-CȂǂ̃R[fBO
[łgoto̎gp֎~ĂCgotogׂł͂ȂƂ
D܂C}N̒`gotogp邱ƂłƂ
ӌD

ł́C`goto܂CHECK}Np݌vӐ}Ƃgp
Ă悢CCHECK}N̎gpɂ\tgEFA̐Mɖ肪邱
ƂȂƂ_؂D

ȂCASPJ[l̃J[l{̂̎ł́CCHECK}NȊOgotop
Ăӏ͂Ȃiꕔ̃VXeT[rXł́CȊO̕@goto
pĂjD

CHECK}N̒`Ƃ̎gp@

kernel/check.hɂ́C25CHECK}N`Ă邪C̃p
^[Œ`ĂDXXXXXɂ́C`FbNG[̎ނ\
񂪓D

----------------------------------------
#define CHECK_XXXXX(<cc>) {				\
	if (<G[>) {						\
		ercd = <G[R[h>;				\
		goto error_exit;					\
	}										\
}
----------------------------------------

CHECK}ŃC̃T[rXR[̏֐ŁĈ悤Ɏg
pĂD

----------------------------------------
ER
<T[rXR[>(cc)
{
	<[Jϐ̐錾>
	ER		ercd;

	LOG_XXX_YYY_ENTER(cc);
	CHECK_XXXXX(cc);
	CHECK_YYYYY(cc);

	<T[rXR[{>

  error_exit:
	LOG_XXX_YYY_LEAVE(cc);
	return(ercd);
}
----------------------------------------

̗ł́CCHECK}N2gpĂ邪C1̂ݎgpĂꍇ
΁C3ȏgpĂꍇD܂CCHECK}N̊ԂɁC[
Jϐւ̑ꍇiႦ΁Cter_tsk̏֐jD

݌vӐ}

CHECK}NgpӐ}́CقƂǂ̃T[rXR[ŕKvȐÓIG[
̃`FbNR[hp^[C\[XR[h̊ȌۂƂœǂ݂
コƂƂɁCLq~X̉\炷ƂłD

Ȃ݂ɁCCHECK}NgpȂꍇCɎT[rXR[̏
́Ĉ悤ɋLq邱ƂɂȂD

----------------------------------------
ER
<T[rXR[>(cc)
{
	<[Jϐ̐錾>
	ER		ercd;

	LOG_XXX_YYY_ENTER(cc);
	if (<XXXXX̃G[>) {
		ercd = <XXXXX̃G[R[h>;
	}
	else {
		if (<YYYYỸG[>) {
			ercd = <YYYYỸG[R[h>;
		}
		else {

			<T[rXR[{>

		}
	}
	LOG_XXX_YYY_LEAVE(cc);
	return(ercd);
}
----------------------------------------

CHECK}N̓emĂƂỎł́C̃\[XR[h̕
ǂ݂₷͖̂炩łD

ȂĈ悤CHECK}N̒`ɂ́Cgoto̎gpsłD

CHECK}NgpĂ悢

CHECK}ŃC̏𖞂悤ɎgpȂ΂ȂȂD

(1) CHECK}ŃCT[rXR[֐̐擪ŁCT[rXR[
@@̃OoCNeBJZNVɓO܂łɁC֐
@@̃gbvxŗpD

(2) T[rXR[֐̖ŁCNeBJZNV𔲂
@@CT[rXR[õOoOɁC֐̃gbvxɁC
@@error_exitxuD

𐶂邱ƂȂ

̂悤ȕ@gotogpĂC\tgEFA̐Mɖ肪
ƂȂƂ咣ɂ́CCMISRA-CȂǂ̃R[fBO[
goto̎gp֎~Ă鍪CƁCgoto̎gpɂ\t
gEFA̐Mɖ肪\̂闝R𖾂炩ɂKvD

MISRA-C̃hLgł́Cgoto̎gp֎~鍪ɂĂ܂薾m
ɂȂĂ炸Cł͂̍̂悤ɐD

E̗ꂪGɂȂCvÖӐ}ǂ݂ɂȂiC
@XpQbeBvOɂȂjD

CHECK}N̏ꍇɂ́CgotoG[̋EoɗpĂCx
error_exitƂȂǁCvÖӐ}͖炩łDĈ
gotoG[̋Eoɗpꍇɂ́C̓_goto̎gp
֎~鍪ɂȂ肤D

EgotoŋEo邱ƂɂCEoɍsȂ΂ȂȂ㏈
@΂邨ꂪD

̓_ɂĂCCHECK}NL̎gp𖞂ĎǵC
EoɍsȂ΂ȂȂ㏈͂ȂCCHECK}N̎gpɂ\tg
EFA̐Mɖ肪邱Ƃ͂ȂD

𐶂邱ƂȂƂ_؂1@́CR[fBO[
vȂvOCR[fBO[ɍvvOƓ
邱Ƃ@łD

łɁu݌vӐ}v̐߂ŏqׂ悤ɁCCHECK}NgpvÓC
gotogpȂȃvOɏ邱Ƃł邪C
Iɂ́ĈƂD

elseȂifthen̍ŌɁCif艺iOjɂCif
ubN̓Kw̃x֕򂷂gotoꍇɂ́Cif
x̊Ԃ̕elseɂ邱ƂɂCgotogȂȃvO
ɏ邱ƂłD

ƂāCgotog̃vOlD

----------------------------------------
	{
		/* if̑O̕ */
		if (....) {
			/* then̕ */
			goto <x>;
		}
		/* ifƃx̊Ԃ̕ */
	  <x>:
		/* x̕ */
	}
----------------------------------------

̃vÓCgotogȂ̃vOƓłD

----------------------------------------
	{
		/* if̑O̕ */
		if (....) {
			/* then̕ */
		}
		else {
			/* ifƃx̊Ԃ̕ */
		}
		/* x̕ */
	}
----------------------------------------

̏ɍvgotoꍇɂ́Cɂgoto珇ɏL
̕@ɂď邱ƂŁCgotogȂȃvOɏ
邱ƂłD

CHECK}N̎gp@́CLgoto̎gp@ɍv邽߁Cgoto
gpȂȃvOɏ邱ƂłDāCCHECK}
Nɂ𐶂邱Ƃ͂ȂD


ext_tskCext_ker̕Ԃl

ITRON4.0dlł́Cext_tsk̓^[邱Ƃ̂ȂT[rXR[ƂȂ
Ă邪CTOPPERSVJ[lɂẮC̃T[rXR[̕Ԃl
ER^ɕύXC^XNReLXgĂ΂ꂽꍇɂ́CE_CTXG[
lƂă^[邱ƂƂD

̎dlɑ΂邢̑ΈĂCȉ̗Rō̗pȂD

EJSPJ[l̂悤ɁC댯̉\oȂsp@́C
@MESdVXeł͖]܂ȂDMESd
@VXeł́C댯̉\oCɃJoׂ
@łD

EASPJ[l̓ẴJ[l_E@́CAvP[V
@ŉ񕜂]nȂƂӖŖ]܂ȂD

Eߋ̌݊ۂ߂ɁC^voidƂ܂܁C^XNReLXg
@Ă΂ꂽꍇɂ̓^[Ƃ@́CJ[l̎dlύXɋC
@ɂȂƂӖŖ]܂ȂD܂C̃G[R[hiႦ
@E_NOSPTjԂ]nȂĂD

ECPUOĂяoƂɂ@́CJ[ldlŜ̐l
@č̗pȂDňCPUO𓱓CT[rXR[
@G[ԂꍇɌĂ΂OSEK/VDX OSdl̃G[tbNɑ
@@\𓱓LpƎv邽߂łD

̕ύXɂCɁCCPUbNԂfBXpb`֎~Ԃext_tsk
Ă΂ꂽꍇɂG[^[@l邪C^XÑC[
`̃^[ext_tskɂȂȂ߁C̗pȂD܂C
Pʂ̃^[@ƐӖiႦ΁C݃nh
CPUbNԂ̂܂܃^[ꍇ̈jD

ɂ킹āCext_kerɂĂCԂlER^ɕύXDASPJ[l
ł́Cext_kerG[ԂƂ͂ȂCHRPJ[lł́CE_OACVG[
ԂꍇD

ȂCITRON4.0dlł́Cexd_tsk^[邱Ƃ̂ȂT[rXR[
ƂȂĂ邪CTOPPERSVJ[lł́Cexd_tsk̓T|[gĂȂD


J[l̃f[^\ɑ΂volatile錾ɂāiNeBJZNV
̏o̎Ɋւ鐧j

J[l̃f[^\́Css鑼̏Pʁi݃nh
^XNjANZX\邽߁Cvolatile錾Kvł͂
ƍlDہCNeBJZNVŃJ[lϐǂރR[
hCRpC̍œKɂNeBJZNVOɈړC
ƂȂ莖񍐂ĂD

J[lׂ̂Ẵf[^\volatile錾@́CSł͂
邪CœK}~邽߂ɁCJ[l̃TCY␫\ɂ͈e^
DASPJ[lł́C̕@volatile錾̕KvȂƂ
D

ASPJ[lɂẮCss鑼̏Pʂ珑\
̂f[^\́CׂāCCPUbNԂ܂͑S݃bNԂɂ
NeBJZNVŃANZXĂDNeBJZNV
ł̃f[^\̃ANZXCRpC̍œKɂNeBJZNV
OɈړȂ悤ɂɂ́CRpCɑ΂āCNeBJZN
V̏oɂC̃f[^\ς\邱
Ƃm点΂悢D

̓Iɂ́CNeBJZNV̏o֐ɂĎ΁C
̂悤ȍœK}~邱ƂłDCASPJ[l̑̃^[
QbgˑɂāCNeBJZNV̏o̓}NC
C֐ɂĂĈ悤ȍœK}~łȂD

ŁCNeBJZNV̏oꍇɂ́C
f[^\ς\邱ƂC炩̕@ŃRpCɒm
点Ȃ΂ȂȂƂ݂DGNUJł́Ĉꂩ
@ł̐𖞂ƂłD

(a) NeBJZNV̏ȏŜ܂͏o̖{Iȕ
	i̓Iɂ́C݋֎~^鏈jiCCłȂjʏ
	̊֐ɂD

(b) NeBJZNV̏o̖{IȕCCAZu
	ɂĎĂꍇɂ́C̃CCAZuclobber
	Xg"memory"ǉD

(c) NeBJZNV̏o̖{IȕC}NCC
	֐ďoŎĂꍇɂ́CNeBJZNVɓ鏈
	̍ŌƏo鏈̐擪ɁCAsm("":::"memory")ƂLqD

ȂC̐񂪓KpNeBJZNV̏óCȉ̂
̂łD

	SIL_LOC_INT
	SIL_UNL_INT
	t_lock_cpu, i_lock_cpu, x_lock_cpu
	t_unlock_cpu, i_unlock_cpu, x_unlock_cpu


^LXgɔxbZ[W

GCC-O2IvVăRpCꍇɁCJ[l̃\[XR[h
̐ӏŁČxbZ[WoiGCC̃o[WɂjD

warning: dereferencing type-punned pointer will break strict-aliasing rules

́CGCC-O2IvVƁCRpCCstrict
aliasing ruleOƂ邽߂łDRpCstrict aliasing rule
KpȂ߂ɂ́CGCC̃IvV-fno-strict-aliasingw肷
悢DɂCxbZ[W͗}~邪Cstrict aliasing rule
OƂœK͍sȂȂD

ASPJ[lɎɂẮCstrict aliasing ruleOƂœKs
Ă悭ČxbZ[W𖳎ĂxȂDȉł́Čx
bZ[W𖳎ĂxȂRqׂD

xbZ[WoƂāCsemaphore.c̎̍sɂČD

	wobj_make_wait((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem);

̌xbZ[W̌́CړIɂ́C&winfo_sem(WINFO_WOBJ *)ɃL
XgĂ邱Ƃł邪C{IȌ́C̃R[hCstrict
aliasing ruleɏ]Ȃ̌ɂȂ\C̃[Ɉˑ
œKʂN\邱ƂłD

Cstrict aliasing ruléC݊̂ȂقȂ^ʂāCI[ob
v郁̈ANZXgpĂ͂ȂȂƂ̂ł
igpꍇ̐U͖`ɂȂjD̃P[Xł́C(WINFO_SEM
*)^̃|C^oR(WINFO_WOBJ *)^̃|C^oRŁCI[obv
̈ANZXgpĂ͂ȂȂƂɂȂD܂Cx
bZ[W̌ɂȂĂ͂ȂC(SEMCB *)^̃|C^oR
(WOBJCB *)^̃|C^oRŁCI[obv郁̈ANZX
gpĂ͂ȂȂD

ASPJ[l̎ɂẮCsemaphore.c̊֐ɂẮC(SEMCB *)^
(WINFO_SEM *)^̃|C^gpĂC(WOBJCB *)^
(WINFO_WOBJ *)^̃|C^oRŃ̈ANZX邱Ƃ͂ȂD
CĂяowait.c̊֐ɂẮC(WOBJCB *)^
(WINFO_WOBJ *)^̃|C^gpĂC(SEMCB *)^(WINFO_SEM
*)^̃|C^oRŃ̈ANZX邱Ƃ͂ȂD

strict aliasing ruleɏ]Ȃ̖_́C̃[Ɉˑ
KʂN\邱Ƃł邪CقȂRpC
Pʂ܂ōœKs邱Ƃ͂Ȃ߁Cɂ肪N邱
Ƃ͂ȂƌƂłD

c_́C̃\[Xt@Cieventflag.cCdataqueue.cCpridataq.cC
mailbox.cCmempfix.cǰxbZ[WɂĂĈ܂ܓĂ͂܂D


Dxf[^L[@\

̌o

APIdl

CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb });
ER snd_pdq(ID pdqid, intptr_t data, PRI datapri);
ER psnd_pdq(ID pdqid, intptr_t data, PRI datapri);
ER ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri);
ER tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout);
ER rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri);
ER prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri);
ER trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout);
ER ini_pdq(ID pdqid);
ER ref_pdq(ID pdqid, T_RPDQ *pk_rpdq);






\]pVXeQƋ@\

KvƎgr

ASPJ[lɂ́CASPJ[lœ삷^XNASPJ[lg̐\
v邽߂ɁCVXe萸x̍\]pVXeǂ
o@\T|[gD\]pVXéC}CNbPʂŕ\
邪Cۂ̐x̓^[QbgˑłD

̋@\pĂvO̎sԂvɂ́C̎sO
sɐ\]pVXeǂݏoC̍߂D̂߁C
\]pVXe͏ɑΒlgpC\]pVXe̐
Βlgp邱Ƃ͑z肵ĂȂD

APIdl

\]pVXeQƋ@\ł́C̃f[^^pD

	SYSUTM		\]pVXeiCPʂ̓}CNbC
				32rbgȏj

SYSUTM^́C^[Qbgˑɂulong_t^iȂ킿Cunsigned
long^jɒ`ĂC̃TCÝC32rbgȏŁC^[Qbg`
łD

\]pVXeSYSUTM^ŕ\ł͈͂𒴂i܂CI[
ot[jꍇC\]pVXe0ɖ߂D]ΏۃvO
̎sO̐\]pVXe̍߂ꍇɂ́Cv鎞Ԃ
SYSUTM^ŕ\ł͈͂łC0ɖ߂邱ƂʂɍlKv͂
D

SYSUTM^32rbg̏ꍇC\]pVXe͖71ŃI[ot[
D̂߁C̋@\71z鎞Ԃ̑Ɏgꍇ͕̓
؂ȂD

\]pVXeQƋ@\̂߂̃T[rXR[̎dlɂẮC
uTOPPERSVJ[ldlv́u4.6.1 VXeǗv̐߂Q
Ƃ邱ƁD



}CNbPʂŎ擾邽߂ɁCIȃ^CeBbN
^C}̌ݒli^C}̓JEgAbv̂Ɖ肷jǂݏoC
}CNbPʂɊZlɁC݂̃VXei~bPʂŕ\
j1000{l̂𐫔\]pVXeƂD
݂̃VXe1000{ۂɁCI[ot[\邪C
Ă܂ȂD

CVXěݒlƃ^C}̌ݒlтԂœǂݏo
͗eՂł͂ȂD̒lɓǂݏoƁCǏo̊ԂɃ^C}I[ot
[ĊݗvꍇɁCЕ̓I[ot[O̒lCЕ
̓I[ot[̒lǂł܂C\]pVXe擾
Ă܂D

̖@͂l邪Cǂ̕@̗p̌
ɂC̗vݒ肵D

(1) ̃^[QbgVXeŎł邱ƁD

(2) T[rXR[̎sԂ\ȌƂȂ邱ƁDƁC
    ɂăT[rXR[̎sԂ傫ϓȂƁD

(3) T[rXR[̉\Ȍ蓯^C~O̎ԂƁD
    ƁCɂĎǂݎ^C~OϓȂƁD

(4) Kv̂p[^ŏƂ邱ƁD

̗v𖞂@ƂāC̕@p邱ƂɂD

܂CNMIׂĂ݂̊֎~ԂŁCVXěݒlC^
C}̌ݒli1ځjC^C}ݗv̗LC^C}̌ݒli2ځj
C̏œǂݏoD݂֎~Ă邽߁C̊ԂɃVXe
ݒlω邱Ƃ͂ȂCVXěݒlǂݏoԂ͂ǂ
悢D܂C^C}̌ݒl2ڂ̓ǏóC^C}ݗv
ꍇɂ̂ݕKvƂȂ邪C(2)̗vC^C}ݗv̗Lɂ炸
ݏoƂƂD

̒lǂݏoC݋֎~C̏sD܂C^
C}ݗvȂꍇɂ́CVXěݒlƁC1ڂɓǂ
^C}̌ݒl͈тlł邱Ƃۏ؂ł邽߁C̒l琫
\]pVXěݒl߂D

Ƀ^C}ݗvꍇɂ́C1ڂɓǂ񂾃^C}̌ݒlC^
C}ݗvO̒liI[ot[O̒ljłꍇƁC̒l
iI[ot[̒ljłꍇ̗̉\lD̂ǂ
̏ꍇłC2ڂɓǂ񂾃^C}̌ݒlgāĈ悤Ɍ
D2ڂ̒ĺC^C}ݗv̒liI[ot[̒ljł
邱Ƃۏ؂ł邽߁C1ڂ̒l2ڂ̒l傫ꍇɂ́C
ԂɃI[ot[̂ƐłD܂C1ڂ̒l̓I[ot[
O̒lƂƂɂȂCVXěݒlƈтlłƂĐ
\]pVXěݒl߂DtɁC1ڂ̒l2ڂ̒lƓ
菬ꍇɂ́C1ڂ̒l̓I[ot[̒lłƐł
D̏ꍇɂ́C̃^CeBbÑVXe߁C̒l1
̒lтlłƂĐ\]pVXěݒl߂D

ŁC^C}ݗvꍇɂ́C2ڂɓǂ񂾃^C}̌ݒl
p@l邪C(3)̗v𖞂ȂȂ邽߂ɍ̗pȂD
܂CJSPJ[lƓl̕@́C(4)̗v𖞂Ȃ߂ɍ̗pȂ
D

ŁułvƂ̂́C̐藧ȂȂP[X邽
߂łD̐藧ȂȂP[X́C2̏ꍇɕĕ
邱ƂłD

(a) 1ڂ̒lI[ot[̒lłɂ炸C1ڂ̒l2
    ̒l傫Ȃꍇ

̂悤ȃP[X́C^C}݂vĂɂ炸T[rX
ȂԂԑC^C}̌ݒl1ڂɓǂł2ڂɓ
ނ܂ł̊ԂɒԂʁC̊ԂɁiēxjI[ot[
ꍇɋND܂C^C}݂T[rXȂԂC^C
eBbN̎ȂꍇłD̂悤ȏꍇɂ́CVXe
̍XVsȂȂD

(b) 1ڂ̒lI[ot[O̒lłɂ炸C1ڂ̒l2
    ̒lƓȂꍇ

̂悤ȃP[X́C^C}̌ݒl1ڂɓǂł2ڂɓǂނ܂ł
ԂɁC^C}ق1JEgAbvꍇɋND̏ꍇC^C
}݂֎~Ă鎞ԂC^CeBbN̎
ɂȂCVXe̍XVsȂȂD

̃P[XC^C}݂ԋ֎~ĂC^C}݂
Dx̍ݏԑĎsꂽCV~[V
ɂăV~[^̃vZXԃXPW[ȂȂǂ̗
RŁCVXe̍XVsȂ󋵂ɑDł̏
CT[rXR[gp̒ӎɐ荞ށD

ۂ̃R[hɂẮCVXěݒl͕ϐɕێĂȂ
߁iʌcurrent_timeɕێĂ邪Cʌێϐ
jC̃^CeBbÑVXepČvZĂD̂߁C
^C}̌ݒlI[ot[̒lłƔfꍇẮC^C
eBbN̎ԂC߂\]pVXe猸ZD
ɂCT[rXR[̎sԂϓ邱ƂɂȂ邪Cif̓e
iRpC̍œK肷Ɓj萔ľZ1Ȃ̂ŁCϓ͂킸
łD

̃T[rXR[́CCӂ̏ԂĂяoƂł邽߁CSIL̑S
݃bN@\pāCT[rXR[̃NeBJZNV
D


call_texrtndispatchĂяoɂ

dispatch_ri^[QbgɂĂcalltexoRājcall_texrtn
яoCcall_texrtndispatchĂяo߁C2̊֐͑ݍċA
ďoĂDł́C̎Ŏx̂ȂRD

call_texrtndispatchĂяốCfBXpb`ۗĂȂ
ԂŌĂяoꂽ^XNO[`C̎sɃfBXpb`ۗ
ԂɑJڂCɃ^XNfBXpb`KvƂ鏈sCfBXpb
`ۗԂȂ܂܃^[ꍇłD̏ꍇCcall_texrtn
̒ŃfBXpb`ۗԂɁCdispatchĂяoă^XNfB
Xpb`sD܂Ccall_texrtndispatchĂяóC^XN
O[`̒ŃfBXpb`ۗԂׂł̂C
Ƀ^[ꍇ~ς邽߂̂̂łDȉC̐U
u~σP[XvƌĂԁD

ŁCr̂߂ɁC^XNO[`̒ŁCfBXpb`
ۗԂĂ烊^[ꍇ̐UlD̏ꍇɂ́C
fBXpb`ۗԂT[rXR[iena_dspCchg_ipmj̒ŁC
dispatchĂяoă^XNfBXpb`NDȉC̐U
uP[XvƌĂԁD

P[XƋ~σP[XrƁCcall_texrtn^XNO[`
T[rXR[dispatch̏dispatchĂяo邩Ccall_texrtn
璼dispatchĂяo邩̈ႢƂƂɂȂC~σP[X̕
X^bN̎gpʂ͏ȂD܂CP[X̓z肵ăX^bN
悪pӂĂ΁C~σP[XłȂ삷邱ƂɂȂD

ŁCP[XƋ~σP[XŁCLȊOɈႢȂƂdvłD
̓Iɂ́Ccall_texrtn̒ŁC^XNOԂɂip_runtsk
->enatextrueɂjOɁCdispatchĂяoƂdvłD^XN
OԂɂdispatchĂяoƁCodispatch_rŁC
у^XNO[`sĂ܂\C~σP[X̕
X^bN̎gpʂĂ܂D


^XNO֎~tOenatexŎĂ闝R

^XNO֎~tÓCTCBenatextB[hi^XNO
Ԃł邱Ƃǰ`ŕێĂD̃tB[hdistexƂ
enatexƂ̂́CJSPJ[lɂă^XNfBXpb`֎~tO
enadsp̌`ŕێ̂Ɛ߂łD

ASPJ[lł́CenadspdisdspɕύXɂȂƂCenatexdistex
ύXǂƎvD

ȏ
