
		TOPPERS/ASPJ[l
		݌v

		Ήo[W: Release 1.6.0
		ŏIXV: 2010N81i쐬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-2010 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 1903 2010-08-24 00:35:56Z ertl-hiro $
----------------------------------------------------------------------

ڎ

ETOPPERS/ASPJ[l̎݌vj
EVXeԂƃReLXg̎
	- J[lԂƔ񓮍
	- ^XNReLXgƔ^XNReLXg
	- S݃bNԂƑS݃bN
	- CPUbNԂCPUbN
	- ݗDx}XN
	- fBXpb`֎~ԂƃfBXpb`
	- fBXpb`ۗ
E^XNԂ̊ǗƃXPW[O
	- ^XNԂ̊Ǘ
	- ^XNXPW[
E^XNfBXpb`̎ij
	- ^XNfBXpb`̕Kvȃ^C~O
	- ^XNfBXpb`̍\
E^XNO@\̎
	- ^XNO[`̎sJnƃVXeԁidl̊mFj
	- ^XNO[`̌ďo
	- ^XNO[`̎sJnKvȃ^C~O
	- ^XNO[`̎sJn
	- call_texrtndispatchĂяoɂ
ECHECK}Ngoto̎gp
	- CHECK}N̒`Ƃ̎gp@
	- ݌vӐ}
	- CHECK}NgpĂ悢
	- 𐶂邱ƂȂ
Eext_tskCext_ker̕Ԃl
EJ[l̃f[^\ɑ΂volatile錾ɂ
E^LXgɔxbZ[W
EDxf[^L[@\ij
E\]pVXeQƋ@\
	- KvƎgr
	- APIdl
	- 
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Ɉˑ镔i^[Qbg
jƈˑȂi^[Qbgˑj𖾊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


VXeԂƃReLXg̎

̏͂ł́CuTOPPERSVJ[ldlv́u2.5 VXeԂƃR
eLXgv̐߂ɋK肳ĂVXeԂƃReLXg̎@
ċLqD

J[lԂƔ񓮍

J[l̓ԂǗ邽߂ɁCJ[lԃtOikerflgj
pӂDkerflǵCX^[gAbvW[falsei0jɏD
܂CJ[l̊JntrueɂCJ[l̏IfalseɂD

----------------------------------------
bool_t	kerflg = false;
----------------------------------------

kerflǵCsns_kerŎQƂDJ[l񓮍Ԃsns_kerȊÕT[rX
R[Ăяoꍇ͕̓ۏ؂KvȂ߁C̃T[rXR[
łkerflgQƂȂD

^XNReLXgƔ^XNReLXg

^XNReLXgƔ^XNReLXg̐؊́C^[Qbgn[hEF
Aу^[QbgˑɈς˂D܂Cǂ̃ReLXgŎs
邩𔻕ʂ֐isense_contextjC^[Qbgˑŗpӂ邱
ƂD

S݃bNԂƑS݃bN

S݃bNtO̊Ǘ̓^[QbgˑɈςˁCS݃bN
ɑJڂ}NiSIL_LOC_INTjƁC̏Ԃɖ߂}NiSIL_UNL_INTj
́CSIL̃^[Qbgˑŗpӂ邱ƂƂDS݃bNԂł
ۂ𔻕ʂ@\́CKvȂ߂ɗpӂĂȂD

S݃bNԂsns_kerext_kerȊÕT[rXR[Ăяo
͕̓ۏ؂KvȂ߁CT[rXR[őS݃bN
ł邱Ƃ𔻕ʂKv͂ȂD

CPUbNԂCPUbN

CPUbNtO̊Ǘ̓^[QbgˑɈςˁCCPUbNԂɑJڂ
֐it_lock_cpu^i_lock_cpu^x_lock_cpujƁCCPUbNԂɑJ
֐it_unlock_cpu^i_unlock_cpu^x_unlock_cpuj́C^[Qbg
ŗpӂ邱ƂƂD܂CCPUbNԂł邩ۂ𔻕ʂ֐
it_sense_lock^i_sense_lock^x_sense_lockjC^[Qbgˑŗp
邱ƂƂD

ݗDx}XN

ݗDx}XN̊Ǘ̓^[QbgˑɈςˁCݗDx}XN
ݒ肷֐it_set_ipm^i_set_ipm^x_set_ipmjƁCQƂ֐
it_get_ipm^i_get_ipm^x_get_ipmj́C^[Qbgˑŗpӂ邱Ƃ
D

fBXpb`֎~ԂƃfBXpb`

fBXpb`֎~tOǗ邽߂ɁCtOidisdspjpӂD
disdsṕCJ[l̏falseɏD

----------------------------------------
bool_t	disdsp;
----------------------------------------

fBXpb`ۗ

fBXpb`ۗԂ́C^XNReLXg̎sCS݃bN
ԁCCPUbNԁCݗDx}XNSłȂԁCfBXpb`
~Ԃ̂ꂩi܂́C炪dȂԁjłD

fBXpb`ۗԂłȂƂIɔʂ邽߂ɁCݗDx}
XNSԂłCfBXpb`ԂłifBXpb`֎~
łȂjƂtOidspflgjpӂDdspflǵCJ[l̏
trueɏD܂CݗDx}XN̒lύX邩C
݋֎~tOύXxɍXVD

----------------------------------------
bool_t	dspflg;
----------------------------------------


^XNԂ̊ǗƃXPW[O
	
^XNԂ̊Ǘ

^XNǗubNiTCBj̃^XNԂǗtB[hitstatj
́C^XNԂ̂ł邩ǗD

@Esł
@Ex~
@Ei`́j҂
@E҂
@Ed҂

^XNsłԂ̎ɁCsԂł邩s\Ԃł邩́C
̃tB[hł͊ǗCsԂ̃^XNTCBw|C^ϐ
ip_runtskjɂĔʂDsԂ̃^XNȂꍇ́Cp_runtsk
NULLɂD

----------------------------------------
TCB	*p_runtsk;
----------------------------------------

p_runtsḱCJ[l̏NULLɏCfBXpb`ɂ
XVDT[rXR[̏̒Ŏ^XNɊւQƂꍇ
́Cp_runtskpD

^XNXPW[

^XNXPW[́CsłԂ̃^XN̒CłD揇ʂ
^XNiCōD揇ʂ̃^XNƌĂԁj肵C̃^XN
TCBw|C^ϐip_schedtskjݒ肷D

----------------------------------------
TCB	*p_schedtsk;
----------------------------------------

^XNXPW[ɑ΂ẮCǂ̃^XNsłԂł邩m
KvD̂߁C^XNXPW[́C2̊֐pӂD

@E^XNsłԂɑJڂƂm点֐imake_runnablej
@E^XNsłԂ瑼̏Ԃ֑JڂƂm点֐
	imake_non_runnablej

܂Č̂߂ɁC2̊֐pɃfBL[𒼐ڑ
삵ă^XNXPW[s֐ƂāC2̊֐pӂD

@E^XN̗Dx̕ύXichange_priorityj
@EfBL[̉]irotate_ready_queuej


^XNfBXpb`̎

^XNfBXpb`̕Kvȃ^C~O

^XNfBXpb`́CsԂ̃^XNip_runtskjƍōD揇ʂ̃^X
Nip_schedtskjvĂ炸CfBXpb`ۗԂłȂꍇɍsD
̂ƂC^XNfBXpb`sKv̂́C3̏ꍇ
łD

(1) sԂ̃^XNsłԂłȂȂ

^XNL`̑҂ԂɑJڂT[rXR[C^XNI
T[rXR[ɂāC^XNfBXpb`sKvD

(2) ōD揇ʂ̃^XNω

^XN̋NC^XN̑҂C^XN̋҂̍ĊJC^XN̗D
x̕ύXC^XN̗D揇ʂ̉]sT[rXR[ɂāCōD
揇ʂ̃^XNωCfBXpb`ۗԂłȂꍇɂ́C^XNfB
Xpb`sKvD

(3) fBXpb`ۗԂ

fBXpb`ۗԂƂ́C^XNReLXg̎sCCPUbNԁC
ݗDx}XNSłȂԁCfBXpb`֎~Ԃ̑̂ł
߁C̏Ԃ̂ꂩJڂ^C~OŁC^XNfBXpb`
sKvD̓Iɂ́C̃^C~OYD

(3-1) ^XNReLXg^XNReLXgɑJڂ

݃nh܂CPUOnh^XNɃ^[ۂɁC^XN
fBXpb`sKvD

(3-2) CPUbNԂ

CPUbNԂɂẮCL(1)(2)̏󋵂oT[rXR[
ĂяoƂłȂ߁CCPUbNԂ̉ɂ́C^XNfBXpb
`sKvȂD

(3-3) ݗDx}XNS

ݗDx}XN̕ύXichg_ipmjɂ芄ݗDx}XNS
ꍇɁC^XNfBXpb`sKvD

܂C^XN̏IC^XNO[`̃^[C݃nh
̃^[C݃T[rX[`̃^[C^CCxg
nh̃^[CCPUOnh̃^[ɂāCݗD
x}XNSꍇC̏ꍇɂ́C^XNfBXpb`
sKvDC݃T[rX[`у^CCxg
nh̃^[ɂẮC^[^XNReLXgł
C^XNfBXpb`ۗԂp邱ƂC^XNfBXpb`
sKvȂD

(3-4) fBXpb`ԂɂȂ

fBXpb`̋iena_dspjɂāC^XNfBXpb`sKv
D

܂C^XN̏Iƃ^XNO[`̃^[ɂāCfB
Xpb`ԂɂȂꍇC̏ꍇɂ́C^XNfBXpb`
sKvD

ɉāCJ[l̓JnɂC^XNfBXpb`Ăяo
D

^XNfBXpb`̍\

^XNfBXpb`̎ȋ@\́C؊Õ^XÑReLXgiv
ZbT̔ėpWX^jɕۑC؊̃^XÑReL
Xgォ畜A邱ƂłDŁCۑ^AȂ΂Ȃ
ȂWX^́C^XNfBXpb`s󋵂ɂāĈ悤
ȈႢD

E^XN݁i܂́CCPUOjɂvGvgꍇɂ́C
@ׂẴWX^ۑȂ΂ȂȂD܂C̏ԂsĊJ
@ꍇɂ́CׂẴWX^𕜋AȂ΂ȂȂD

E^XNIɃ^XNfBXpb`Ăяoꍇɂ́CXNb`
@WX^icaller saved registerjȊÕWX^ۑ΂悢D܂C
@̏ԂsĊJꍇɂ́CXNb`WX^ȊÕWX^
@A΂悢D

E^XNIꍇɂ́Cǂ̃WX^ۑKvȂD

E^XNsJnꍇɂ́Cǂ̃WX^AKvȂD

ŁCꂼ̏󋵂ŕKvŒ̃WX^݂̂ۑ^A邽߂ɁC
^XNfBXpb`C(a) ReLXg̕ۑC(b) s^X
N̑IC(c) ReLXg̕A3̃Xebvō\C(a)
(c)̃XebvɂẮC^XNfBXpb`s󋵖ɗpӂ
D̓Iɂ́C̊es[`pӂD

(a) ReLXg̕ۑ
	(a-1) ^XNIɌĂяoꍇ̕ۑidispatchj
	(a-2) ݃nh̏oŌĂяoꂽꍇ̕ۑiret_intj
	(a-3) CPUOnh̏oŌĂяoꂽꍇ̕ۑiret_excj
	(a-4) ^XN̏Ȉiexit_and_dispatchj
	(a-5) J[l̓Jn̏istart_dispatchj
(b) s^XN̑IifBXpb`{́Cdispatcherj
(c) ReLXg̕A
	(c-1) ^XNIɌĂяoꍇ̕Aidispatch_rj
	(c-2) ݃nh̏oŌĂяoꂽꍇ̕Airet_int_rj
	(c-3) CPUOnh̏oŌĂяoꂽꍇ̕Airet_exc_rj
	(c-4) ^XN̎sJn̏istart_rj


^XNO@\̎

^XNO[`̎sJnƃVXeԁidl̊mFj

^XNO[`́C5̏ꍇɎsJnD

@E^XNOԂł
@EۗOv0łȂ
@E^XNsԂł
@E^XNReLXgsĂ
@ECPUbNԂłȂ

܂C^XNO[`̋N^^[̃VXeԂɊւd
l͎̒ʂłD

				CPUbN		ݗDx	fBXpb`
				tO			}XN			֎~tO
------------------------------------------------------------
y^XNO[`z
sJn				C			C
sJn	̂܂		̂܂		̂܂
^[O		(*1)	ɖ߂		ɖ߂
^[			ɖ߂(*4)	ɖ߂(*4)
------------------------------------------------------------

^XNO[`̌ďo

^XNO[`ĂяóC̗ƂȂD̊֐́C
CPUbNԂŌĂяoƂz肵ĂD

----------------------------------------
void
call_texrtn(void)
{
	TEXPTN	texptn;

	texptn = p_runtsk->texptn;
	p_runtsk->texptn = 0U;

	^XNO֎~Ԃɂ
	fBXpb`֎~tOۑ
	ݗDx}XNۑ

	CPUbNԂɂ
	^XNO[`Ăяo
	CPUbNԂɂ

	ݗDx}XNɖ߂
	fBXpb`֎~tOɖ߂
	^XNO֎~Ԃɂ c (*2)

	Kvȏꍇɂ̓fBXpb`s c (*1)

	^XNOԂɂ
}
----------------------------------------

(*1)ɂāCKvȏꍇɃ^XN؊ŝ́CݗDx}XN
fBXpb`֎~tOɖ߂ʁCfBXpb`ۗԂC
fBXpb`KvɂȂꍇ邽߂łD

܂CfBXpb`sOɃ^XNO֎~Ԃɂ(*2)Rɂ
ẮCucall_texrtndispatchĂяoɂāv̐߂QƂ邱
ƁD

^XNO[`̎sJnKvȃ^C~O

^XNO[`́COq5̏ꍇɎsJnׂ
邽߁C5̏̂ꂩVɖ悤ɂȂ\̂^C~
OŁC^XNO[`̎sJnKvɂȂD

ȉł́C5̏̂ꂩVɖ悤ɂȂ^C~Oɂ
D

(1) ^XNOԂł

^XNŐiena_texjɂāC^XNOԂɂȂD
܂C^XNO[`̃^[ɂĂC^XNO
ԂɂȂD

(2) ۗOv0łȂ

^XNO̗viras_texCiras_texjɂāC^XNۗ̕Ov
0łȂȂDC^XNReLXg̃^XNO̗v
iiras_texjł́C(4)̏Ȃ߁C^XNO[`
sJn͕KvȂD

(3) ^XNsԂł

^XNfBXpb`ɂC؊̃^XNsԂɂȂD

(4) ^XNReLXgsĂ

݃nhCPUOnh̃^[ɂāC^XNRe
LXgɖ߂ꍇD

(5) CPUbNԂłȂ

CPUbNԂ̉iunl_cpuCiunl_cpujɂāCCPUbNԂłȂ
DC^XNReLXgłCPUbNԂ̉iiunl_cpujł́C
(4)̏Ȃ߁C^XNO[`̎sJn͕KvȂD

܂C^XN̏IC^XNO[`̃^[C݃nh
̃^[C݃T[rX[`̃^[C^CCxg
nh̃^[CCPUOnh̃^[ɂāCCPUb
NԂłȂȂꍇD

C݃T[rX[`у^CCxgnh̃^[
ɂẮC^[^XNReLXg̎sC(4)̏
Ȃ߁C^XNO[`̎sJn͕KvȂD

^XN̏IɂẮC^XN̏I͕ʂ̃^XN֐؂芷邽߁C
؂芷̃^XNɑ΂^XNO[`̎sJnC^X
NfBXpb`̏ōs΂悢D

ȏCdP[XlƁC^XNO[`̎sJn
KvɂȂ\̂́Cȉ̏łD

(a) ^XNŐiena_texjc (1)
(b) ^XNO[`̏o c (1)(5)
(c) ^XNO̗viras_texjc (2)
(d) ^XNfBXpb`̏ c (3)(5)
	(d-1) dispatch_r
	(d-2) ret_int_r
	(d-3) ret_exc_r
	(d-4) start_r
(e) ݃nh̏o c (4)(5)
(f) CPUOnh̏o c (4)(5)
(g) CPUbNԂ̉iunl_cpujc (5)

̒(d-4)ɊւẮC^XN̎sJn̓^XNO֎~Ԃ
i^XNena_tex܂ł́C^XNOȂjC(1)̏
Ȃ߁C^XNO[`̎sJn͕KvȂD

܂(g)ɊւẮCɏqׂ闝RɂCCPUbNԂpĂ
ɑ4̏Vɖ邱Ƃ͂Ȃ߁C^XNO[`
̎sJn͕KvȂD

CPUbNԂł́C܂C^XNŐiena_texjƃ^XNO
̗viras_texCiras_texjsƂ͂łC^XNfBXpb`N
ȂDCPUbNԂŃ^XNO[`烊^[邱Ƃ͂
邪C̏ꍇCPUbNԂCCPUbNԂpȂD
CPUbNԂŊ݃nh烊^[ꍇCƓlłD

ŌɁCCPUbNԂCPUOnh烊^[ꍇɂȂD
ɂẮCCPUOɁCCPUbNԂłꍇƁC
CPUbNԂłꍇɕčlDCPUbNԂł
ꍇɂ́CCPUOnh̃^[ɂCCPUbNԂ
邽߁C݃nh烊^[ꍇƓlłDCPUbNԂ
ꍇɂ́CNCPUOnh̓J[lǗOCPUOn
hł邽߁C̒(1)`(3)̏Vɖ邱Ƃ͂ȂD
CPUOnh̎sO(4)͕̏ۑ邱ƂCCPUOnh
̃^[ɂāC(1)`(4)̏CPUO̔Oɖ߂CV
邱Ƃ͂ȂD

^XNO[`̎sJn

ł́CO̐߂Ō^XNO[`̎sJnKvȃ^C
~ÔꂼɂāCsJn̎@ɂďqׂD

(a) ^XNŐiena_texj

ena_tex^XNĂяoꂽꍇɂ́C^XNɑ΂āu^XNs
Ԃłvu^XNReLXgsĂv2͖Ă
Cu^XNOԂłv̏ena_tex̏ɂ薞
D܂CuCPUbNԂłȂv̏ena_tex̓Ń`FbNĂ
D̂߁CuۗOv0łȂvĂꍇɂ́C^XN
O[`ĂяoD

ena_tex̖{̂̏iG[j͎̒ʂD

----------------------------------------
		p_runtsk->enatex = true;
		if (p_runtsk->texptn != 0U) {
			call_texrtn();
		}
----------------------------------------

(b) ^XNO[`̏o

^XNO[`̏oicall_texrtň㔼jł́C^XNɑ
āu^XNsԂłvu^XNReLXgsĂv
2͖ĂCu^XNOԂłvuCPUbN
łȂv2oŖD̂߁CuۗOv0ł
vĂꍇɂ́C^XNO[`ĂяoKv
D

C^XNO[`̏oŒPcall_texrtnĂяoƁC
call_texrtn̒call_texrtnĂяoƂɂȂC^XNOJ
ԂvꂽꍇɁCX^bN̎gpʂɏȂȂDŁC^X
NO[`̏oŁuۗOv0łȂvꍇɂ́C
call_texrtn̒Ń[vD

Ccall_texrtn̗͎̒ʂD

----------------------------------------
void
call_texrtn(void)
{
	TEXPTN	texptn;

	fBXpb`֎~tOۑ c (*3)
	ݗDx}XNۑ c (*3)
	^XNO֎~Ԃɂ c (*6)

	do {
		texptn = p_runtsk->texptn;
		p_runtsk->texptn = 0U;

		CPUbNԂɂ
		^XNO[`Ăяo
		CPUbNԂɂ

		ݗDx}XNɖ߂ c (*4)
		fBXpb`֎~tOɖ߂ c (*4)
		^XNO֎~Ԃɂ c (*2)

		Kvȏꍇɂ̓fBXpb`s c (*1)
	}  while (p_runtsk->texptn != 0U);

	^XNOԂɂ c (*5)
}
----------------------------------------

^XNO[`̌ďoOɃfBXpb`֎~tOƊݗDx
}XNۑ鏈́C(*4)ɂĂ̏Ԃɖ߂ƂC[
v̊O(*3)ōŝ悢D܂C^XNO[`̌ďoO
Ƀ^XNO֎~Ԃɂ鏈́C(*2)ɂă^XNO֎~
Ԃɂ邱ƂC[vO(*6)ōŝ悢D

܂C^XNO[`̌ďoɃ^XNOԂɂ鏈
C[v̊O(*5)ōs悢D

(c) ^XNO̗viras_texj

ras_tex^XNĂяoꂽꍇŁCΏۃ^XN^XN̏ꍇɂ́C
^XNɑ΂āu^XNsԂłvu^XNReLXgs
Ăv2͖ĂCuۗOv0łȂv̏
ras_tex̏ɂ薞iras_tex̃p[^rasptn0̏ꍇ̓G[
ƂȂ邽߁jD܂CuCPUbNԂłȂv̏ras_tex̓Ń`Fb
NĂD̂߁CΏۃ^XN^XNłCu^XNO
ԂłvĂꍇɂ́C^XNO[`ĂяoD

ras_tex̖{̂̏iG[j͎̒ʂD

----------------------------------------
		p_tcb->texptn |= rasptn;
		if (p_tcb == p_runtsk && p_runtsk->enatex) {
			call_texrtn();
		}
----------------------------------------

(d-1) dispatch_r

dispatch_rɂẮCdispatch_r̃^[̃^XNɑ΂āCu^
XNsԂłvu^XNReLXgsĂv2͖
ĂD܂C CPUbNԂdispatch_rɗ邱Ƃ͂Ȃ߁C
uCPUbNԂłȂv̏ĂD̂߁Cu^XNO
ԂłvuۗOv0łȂv2Ăꍇ
́C^XNO[`ĂяoKvD

邽߂ɁC^XNReLXg̃fBXpb`̂
ɏCD

----------------------------------------
void
dispatch(void)
{
	ccc

  dispatch_r:
	XNb`WX^ׂẴWX^X^bN畜A
	calltex();
}
----------------------------------------

calltex́Cu^XNOԂłvuۗOv0ł
v2Ăꍇcall_texrtnĂяo֐łD

----------------------------------------
void
calltex(void)
{
	if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
		call_texrtn();
	}
}
----------------------------------------

(d-2) ret_int_r

ret_int_ŕC݃nh̏oŃfBXpb`s^XNC
sĊJۂ̏łD̂߁Cret_int_r̃^[̃^XN
ɑ΂āCu^XNsԂłvu^XNReLXgsĂ
v2͖ĂD܂C CPUbNԂret_int_rɗ邱
͂Ȃ߁CuCPUbNԂłȂv̏ĂD̂߁Cu^
XNOԂłvuۗOv0łȂv2
Ăꍇɂ́C^XNO[`ĂяoKvD

邽߂ɁC݃nh̏ô悤ɏCD

----------------------------------------
void
<݂̏o>(void)
{
		ccc

			  ret_int_r:
				XNb`WX^ׂẴWX^X^bN畜A
				calltex();
			}
		ccc
}
----------------------------------------

(d-3) ret_exc_r

ret_exc_ŕCCPUOnh̏oŃfBXpb`s^XNC
sĊJۂ̏łD

J[lǗCPUOnh̏oiret_excj́C݃nh
oiret_intjƓlłD́CCPUbNԂCPUO
ꍇɂ́CJ[lǗOCPUOnhƂȂCCPUOnh̏o
ŃfBXpb`sƂ͂ȂCret_excɂȂ߂łD
߁Cret_exc_r̃^[̃^XNɑ΂āCuCPUbNԂłȂv
̏ĂD

̂ƂCCPUOnh̏oɂĂC݃nh̏o
ƓlɁĈ悤ɏC΂悢D

----------------------------------------
void
<CPUȌo>(void)
{
			ccc

				  ret_exc_r:
					XNb`WX^ׂẴWX^
												X^bN畜A
					calltex();
				}
			ccc
}
----------------------------------------

(e) ݃nh̏o

݃nh^XNփ^[ꍇɂ́C^[̃^XNɑ
āCu^XNsԂłvu^XNReLXgsĂv
2͖ĂD܂CCPUbNԂŊ݃nhs
邱Ƃ͂Ȃ߁CuCPUbNԂłȂv̏ĂD̂߁C
u^XNOԂłvuۗOv0łȂv2
Ăꍇɂ́C^XNO[`ĂяoKvD

݃nȟďoOƌďoł̏ω̂́Cs
Ԃ̃^XNωƁC݃nhiras_texĂяoꂽꍇ
łD݃nhena_texĂяoȂ߁Cu^XNO
Ԃłv̏ω邱Ƃ͂ȂD

2̒ŁCsԂ̃^XNωP[X́Cret_int_rōlς
łD݃nhiras_texĂяoꂽꍇɂ́Creqflgtrue
ɂȂ邽߁C^XNO[`̎sJńCreqflgtrue̎
̂ݍs΂悢D

邽߂ɁCŏC݃nh̏oC
̂悤ɏCD

----------------------------------------
void
<݂̏o>(void)
{
	ccc

	if (^XNReLXgŊݔ) {
		ccc
		if (reqflg) {
			ccc

			  ret_int_r:
				XNb`WX^ׂẴWX^X^bN畜A
			}
			calltex();
		}
	}
	ccc
}
----------------------------------------

(f) CPUOnh̏o

J[lǗCPUOnh̏óC݃nh̏oƓ
lłD

J[lǗOCPUOnh̒ł́CsԂ̃^XNω邱
͂ȂCiras_texena_texĂяoƂłȂ߁C^XNO[
`̎sJnVɖ邱Ƃ͂ȂC^XNO[`
̎sJn͕KvȂD

̂ƂCCPUOnh̏oɂĂC݃nh̏o
ƓlɁĈ悤ɏC΂悢D

----------------------------------------
void
<CPUȌo>(void)
{
		ccc
		if (^XNReLXgCPUO) {
		ccc
			if (reqflg) {

				  ret_exc_r:
					XNb`WX^ׂẴWX^
												X^bN畜A
				}
				calltex();
			}
		}
		ccc
}
----------------------------------------

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[`̒ŁC^XNOԂɂ܂܃^[
ꍇɂ́Ccall_texrtnĂяodispatch̏odispatch_rōĂ
^XNO[`sĂ܂\D̏ꍇC^XN
O[`̍ŌŁCfBXpb`ۗԂĂ烊^[
ꍇ̓X^bN̎gpʂȂC^XNO֎~Ԃɂ
ɃfBXpb`ۗԂă^[ꍇ́CX^bN̎gp
ʂꍇDŁĈ悤ȏ󋵂NȂ悤ɁC
dispatchĂԑOp_runtsk->enatexfalseɂD


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[@\ij

̌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


^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

ȏ
