
		TOPPERS/ASPͥ
		߷ץ

		бС: Release 1.9.2
		ǽ: 2014ǯ415ʺ

ΥɥȤϡTOPPERS/ASPͥ߷ץǤ롥Τ
ǤꡤŪǤϤʤ

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

 Copyright (C) 2005-2014 by Embedded and Real-Time Systems Laboratory
             Graduate School of Information Science, Nagoya Univ., JAPAN
 
 嵭Ԥϡʲ(1)(4)ξ˸¤ꡤܥեȥ
 ܥեȥѤΤޤࡥʲƱˤѡʣ
 ѡۡʰʲѤȸƤ֡ˤ뤳Ȥ̵ǵ롥
 (1) ܥեȥ򥽡ɤηѤˤϡ嵭
     ɽѾ浪Ӳ̵ݾڵ꤬Τޤޤηǥ
     ˴ޤޤƤ뤳ȡ
 (2) ܥեȥ򡤥饤֥ʤɡ¾Υեȥȯ˻
     ѤǤǺۤˤϡۤȼɥȡ
     ԥޥ˥奢ʤɡˤˡ嵭ɽѾ浪Ӳ
     ̵ݾڵǺܤ뤳ȡ
 (3) ܥեȥ򡤵Ȥ߹ʤɡ¾Υեȥȯ˻
     ѤǤʤǺۤˤϡΤ줫ξ
     ȡ
   (a) ۤȼɥȡѼԥޥ˥奢ʤɡˤˡ嵭
       ɽѾ浪Ӳ̵ݾڵǺܤ뤳ȡ
   (b) ۤη֤̤ˡˤäơTOPPERSץȤ
       𤹤뤳ȡ
 (4) ܥեȥѤˤľŪޤϴŪ뤤ʤ»
     ⡤嵭ԤTOPPERSץȤդ뤳ȡ
     ޤܥեȥΥ桼ޤϥɥ桼Τʤ
     ͳ˴Ťᤫ⡤嵭ԤTOPPERSץȤ
     դ뤳ȡ
 
 ܥեȥϡ̵ݾڤ󶡤ƤΤǤ롥嵭Ԥ
 TOPPERSץȤϡܥեȥ˴ؤơλŪ
 ФŬޤơʤݾڤԤʤޤܥեȥ
 ѤˤľŪޤϴŪʤ»˴ؤƤ⡤
 Ǥʤ
 
 $Id$
----------------------------------------------------------------------

ܼ

TOPPERS/ASPͥμ߷
ƥ֤ȥƥȤμ
	- ͥư֤ư
	- ƥȤ󥿥ƥ
	- ߥå֤ߥå
	- CPUå֤CPUå
	- ͥ٥ޥ
	- ǥѥåػ߾֤ȥǥѥåľ
	- ǥѥåα
֤δȥ塼
	- ֤δ
	- 塼
ǥѥåμ
	- ǥѥåɬפʥߥ
	- ǥѥåι¤
	- νλΥǥѥå
	- reqflgƳͳ
㳰ǽμ
	- 㳰롼μ¹ԳϾȥƥ֡ʻͤγǧ
	- 㳰롼θƽФ
	- 㳰롼μ¹ԳϤɬפʥߥ
	- 㳰롼μ¹ԳϽ
	- call_texrtndispatchƤӽФˤĤ
顼Υå
	- 顼3ʬ
	- Ū顼Υå
	- Ū顼Υå
CHECKޥgotoʸλ
	- CHECKޥȤλˡ
	- ߷װտ
	- CHECKޥѤƤ褤
	- 뤳Ȥʤ
ext_tskext_ker֤
ͥΥǡ¤ФvolatileˤĤ
㥹Ȥȼٹå
ǽɾѥƥﻲȵǽ
	- ɬȻ
	- API
	- 
㳰ػߥե饰enatexǼƤͳ


TOPPERS/ASPͥμ߷

TOPPERS/ASPͥʰʲASPͥˤϡTOPPERS奫ͥνȯ
Ȥʤꥢ륿५ͥǤ롥TOPPERS奫ͥͤ߷
ȡASPͥŬоΰ߷ˤˤĤƤϡTOPPERS奫
ͽ˽Ҥ٤Ƥ롥

ʲǤϡASPͥμ߷ˤˤĤƽҤ٤뤬߷ˤȤ
ϢƤꡤΤʬΥǤʤʬ⤢롥

TOPPERS/ASPͥμ߷פԤˤꡤˤꤹ롥

(1) ɤɤߤ䤹¤䤹Ż뤹

ɤɤߤ䤹Ȥϡץ󥽡եȥʼ
ǺǤפǤ롥ɤ򤷤Ƥ뵻ѼԤ
뤳Ȥǡȯ뤳ȤǤݡ⽼¤뤳
Ǥ롥ޤɤɤߤ䤹Ȥϡץ߷פ
뤳Ȥ̣ƤꡤˤĤʤ롥ˡѼԶΤ
ζȤ⡤ɤɤߤ䤹ȤϽפȤʤ롥

¤䤹Ȥϡƥ׵ˤ碌塼˥󥰤Ԥ䤹
Ȥ̣Ƥꡤ碌γȯٱ礹Ǥ롥ޤASP
ͥפȤTOPPERS奫ͥ륷꡼ȯƤǤ⡤¤
䤹ȤɬܤξǤ롥

(2) åȥƥؤΥݡƥ󥰤ưפʹ¤Ȥ

ȹߥƥˤ¿ͤʥϡɥѤ뤿ᡤưפ˥ݡ
ƥ󥰤Ǥ뤳ȤϽפǤ롥Τˡ¹ǽθĤ
ϡɥݲåȥƥ˰¸ʬʥåȰ
¸ˤȰ¸ʤʬʥå¸ˤΤʬΥ롥ޤ
ȯĶʥѥʤɡˤ˰¸ʬΤʬΥ롥

(3) ڤưפʹ¤Ȥ

ݤ뤿ˡڤưפʹ¤Ȥ롥

ŪˤϡӥΤۤȤΤ߶ػߤǼ¹Ԥ뤳ȤȤ
ӥνǳߤĤʤι¤ϡɤߤ䤹
¤䤹ɤˤ뤿ˤͭǤ롥ˤ߱
ˤʤ뤬ˤä륢ץꥱϾǤꡤ
򤨤ʤΤȹͤ롥

ޤ拾ѥˤꥳե졼Ǥս䤹ȡ
٤ʺŬǤǡڤ٤ȹ礻뤳Ȥ顤ե
졼Ǥսɬ׺¤Ȥ롥

(4) ¹ǽȥ̤θ

嵭ˤǡ⤤¹ǽȾ̤ãǤ
褦ʼԤ¹ǽ夵ݤˤϡʿǽθ⡤
ǽθŻ뤹롥

ɤɤߤ䤹Ż뤹ȸäƤ⡤¹ǽΰ르ꥺ
°פ˺Ѥ뤳ȤϤ⤤¹ǽãǤ륢르ꥺ
롥åȥƥؤΥݡƥ󥰤ưפˤ뤿
ʬCǼƤꡤ٤Ƥ򥢥֥ǵҤ
٤Ƽ¹ǽΤϤ򤨤ʤ

̤ˤĤƤϡRAMλ̤︺뤳Ȥ˽֤߷פ
嵭ˤӼ¹ǽȤΥȥ졼ɥդθ꤮ޤǤ
︺ϹԤʤ

(5) ӥƥθ

͡ʵϤΥƥŬѤǤ륹ӥƥä¤Ȥ롥
ˡϤʥƥŬѤݤˡѤʤǽ򥫡ͥ뤬äƤ
뤳Ȥˤ̤äǾ¤ˤʤ褦θ롥

Ūˤϡץꥱȥͥ1ĤΥɥ⥸塼˥󥯤
ˡ1󥯥ǥˤꤷͥؿñ̤ǥ饤֥경ơ
ѤؿΤߤ󥯤Ǥ빽¤Ȥ롥ϰΥե졼
Ǥ뤬ˡϡ拾ѥˤ륳ե졼
Ȥϰ㤤ڹͿƶ

ޤŪ˻ѤRAMΰ򸺤餷å֤ϤǤ¤
å֤


ƥ֤ȥƥȤμ

ξϤǤϡTOPPERS奫ͥͽפΡ2.5 ƥ֤ȥ
ƥȡפ˵ꤵƤ륷ƥ֤ȥƥȤμˡ
ĤƵҤ롥

ͥư֤ư

ͥư֤뤿ˡͥư֥ե饰kerflgˤ
Ѱդ롥kerflgϡȥåץ⥸塼falseʡ0ˤ˽롥
ޤͥưγϻtrueˤͥưνλfalseˤ롥

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

kerflgϡsns_kerǻȤ롥ͥư֤sns_kerʳΥӥ
ƤӽФưݾڤɬפʤᡤ¾Υӥ
Ǥkerflg򻲾Ȥʤ

ƥȤ󥿥ƥ

ƥȤ󥿥ƥȤڴϡåȥϡɥ
ӥåȰ¸˰Ѥͤ롥ޤɤΥƥȤǼ¹
뤫Ƚ̤ؿsense_contextˤ⡤åȰ¸Ѱդ뤳
Ȥ롥

ߥå֤ߥå

ߥåե饰δϥåȰ¸˰Ѥ͡ߥå
ܤޥSIL_LOC_INTˤȡξ֤᤹ޥSIL_UNL_INT
ϡSILΥåȰ¸Ѱդ뤳ȤȤ롥ߥå֤Ǥ
ݤȽ̤뵡ǽϡɬפʤѰդƤʤ

ߥå֤sns_kerext_kerʳΥӥƤӽФ
ưݾڤɬפʤᡤӥߥå
Ǥ뤳ȤȽ̤ɬפϤʤ

CPUå֤CPUå

CPUåե饰δϥåȰ¸˰Ѥ͡CPUå֤ܤ
ؿt_lock_cpui_lock_cpux_lock_cpuˤȡCPUå֤
ؿt_unlock_cpui_unlock_cpux_unlock_cpuˤϡåȰ
¸Ѱդ뤳ȤȤ롥ޤCPUå֤Ǥ뤫ݤȽ̤ؿ
t_sense_locki_sense_lockx_sense_lockˤ⡤åȰ¸Ѱ
뤳ȤȤ롥

ͥ٥ޥ

ͥ٥ޥδϥåȰ¸˰Ѥͥ͡٥ޥ
ꤹؿt_set_ipmi_set_ipmx_set_ipmˤȡ򻲾Ȥؿ
t_get_ipmi_get_ipmx_get_ipmˤϡåȰ¸Ѱդ뤳Ȥ
롥

ƥȤμ¹ˡͥ٥ޥ֤Ǥ
뤳ȤΨŪȽǤ뤿ˡͥ٥ޥ֤Ǥ뤳
򼨤ե饰ipmflgˤѰդ롥

ipmflgϡͥνfalse˽롥󥿥ƥȤ
ϡͥ٥ޥ֤ˤʤ뤳ȤϤʤᡤΥե饰Ѥ
ɬפϤʤե饰ιԤʤ

----------------------------------------
bool_t	ipmflg;
----------------------------------------

ǥѥåػ߾֤ȥǥѥåľ

ǥѥåػߥե饰뤿ˡե饰disdspˤѰդ롥
disdspϡͥνfalse˽롥

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

 disdspǤϤʤȿženadspѰդipmflg
dspflgȤδɤä

ǥѥåα

ǥѥåα֤ϡ󥿥ƥȤμ¹桤CPUå֡
ͥ٥ޥǤʤ֡ǥѥåػ߾֤Τ줫ʤ
ϡ餬Ťʤä֡ˤǤ롥

ƥȤμ¹ˡǥѥåα֤ǤʤȡʤĤޤꡤ
ǥѥåǤ֤Ǥ뤳ȡˤΨŪȽ̤뤿ˡͥ
٥ޥ֤Ǥꡤǥѥåľ֤Ǥʥǥѥåػ
֤ǤʤˤȤ򼨤ե饰dspflgˤѰդ롥ʤ
dspflg == (ipmflg && !disdsp)פꤹ롥

dspflgϡͥνtrue˽롥ޤƥ
ȤˤƳͥ٥ޥͤѹ뤫߶ػߥե饰ѹ
٤˹롥󥿥ƥȤǤϡ˥ǥѥåα
Ǥ뤿ᡤΥե饰ѤɬפϤʤե饰ιԤʤ

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


֤δȥ塼
	
֤δ

֥åTCBΥ֤եɡtstatˤ
ϡ֤ΤǤ뤫롥

¹ԤǤ
ٻ߾
ʶΡԤ
Ԥ
Ԥ

¹ԤǤ֤λˡ¹Ծ֤Ǥ뤫¹Բǽ֤Ǥ뤫ϡ
ΥեɤǤϴ¹Ծ֤ΥTCBؤݥѿ
p_runtskˤˤäȽ̤롥¹Ծ֤Υʤϡp_runtsk
NULLˤ롥

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

p_runtskϡͥνNULL˽ǥѥåˤ
롥ӥνǼ˴ؤ򻲾Ȥ
ϡp_runtskѤ롥

塼

塼ϡ¹ԤǤ֤Υ椫顤Ǥ̤ͥ
ʤ򡤺ǹ̤ͥΥȸƤ֡ˤꤷΥ
TCBؤݥѿp_schedtskˤꤹ롥

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

塼ФƤϡɤΥ¹ԤǤ֤Ǥ뤫Τ
ɬפ롥Τᡤ塼ϡ2ĤδؿѰդ롥

¹ԤǤ֤ܤȤΤ餻ؿmake_runnable
¹ԤǤ֤¾ξ֤ܤȤΤ餻ؿ
	make_non_runnable

ޤθΨΤˡ2ĤδؿѤ˥ǥ塼ľ
ƥ塼ԤؿȤơ2ĤδؿѰդ롥

ͥ٤ѹchange_priority
ǥ塼βžrotate_ready_queue


ǥѥåμ

ǥѥåɬפʥߥ

ǥѥåϡ¹Ծ֤Υp_runtskˤȺǹ̤ͥΥ
p_schedtskˤפƤ餺ǥѥåα֤Ǥʤ˹Ԥ
ΤȤ顤ǥѥåԤɬפΤϡ3Ĥξ
Ǥ롥

(1) ¹Ծ֤Υ¹ԤǤ֤Ǥʤʤ

򹭵Ԥ֤ܤ륵ӥ䡤λ
륵ӥˤơǥѥåԤɬפ롥

(2) ǹ̤ͥΥѲ

εưԤζԤκƳͥ
٤ѹ̤ͥβžԤӥˤơǹͥ
̤ΥѲǥѥåα֤Ǥʤˤϡǥ
ѥåԤɬפ롥

(3) ǥѥåα֤

ǥѥåα֤Ȥϡ󥿥ƥȤμ¹桤CPUå֡
ͥ٥ޥǤʤ֡ǥѥåػ߾֤ΤǤ
ᡤξ֤Τ줫ܤ륿ߥ󥰤ǡǥѥå
Ԥɬפ롥ŪˤϡΥߥ󥰤롥

(3-1) 󥿥ƥȤ饿ƥȤܤ

ߥϥɥޤCPU㳰ϥɥ餫饿˥꥿󤹤ݤˡ
ǥѥåԤɬפ롥

(3-2) CPUå֤

CPUå֤ˤƤϡ嵭(1)(2)ξФӥ
ƤӽФȤǤʤΤᡤCPUå֤βˤϡǥ
ѥåԤɬפʤ

(3-3) ͥ٥ޥ

ͥ٥ޥѹchg_ipmˤˤͥ٥ޥ
ˡǥѥåԤɬפ롥

ޤνλ㳰롼󤫤Υ꥿󡤳ߥϥ
餫Υ꥿󡤳ߥӥ롼󤫤Υ꥿󡤥।٥
ϥɥ餫Υ꥿CPU㳰ϥɥ餫Υ꥿ˤäơͥ
٥ޥ礬ꡤξˤϡǥѥå
Ԥɬפ롥ߥӥ롼󤪤ӥ।٥
ϥɥ餫Υ꥿ˤĤƤϡ꥿󥿥ƥȤǤ
ꡤǥѥåα֤³뤳Ȥ顤ǥѥå
Ԥɬפʤ

(3-4) ǥѥåľ֤ˤʤ

ǥѥåεġena_dspˤˤơǥѥåԤɬ
롥

ޤνλȥ㳰롼󤫤Υ꥿ˤäơǥ
ѥåľ֤ˤʤ礬ꡤξˤϡǥѥå
Ԥɬפ롥

ʾ˲äơͥưϻˤ⡤ǥѥåƤӽ


ǥѥåι¤

ǥѥåμʵǽϡڴΥΥƥȡʥץ
åѥ쥸ˤ¸ڴΥΥƥ
Ȥ夫뤳ȤǤ롥ǡ¸ʤФʤ
ʤ쥸ϡǥѥå㤬¹ԤˤäơΤ褦
ʰ㤤롥

ߡʤޤϡCPU㳰ˤˤץꥨץȤˤϡ
٤ƤΥ쥸¸ʤФʤʤޤξ֤¹ԺƳ
ˤϡ٤ƤΥ쥸ʤФʤʤ

ȯŪ˥ǥѥåƤӽФˤϡå
caller saved register˰ʳΥ쥸¸Ф褤ޤ
ξ֤¹ԺƳˤϡå쥸ʳΥ쥸
Ф褤

λˤϡɤΥ쥸¸ɬפʤ

¹ԳϤˤϡɤΥ쥸ɬפʤ

ǡ줾ξɬ׺¤Υ쥸Τߤ¸뤿ˡ
ǥѥå(a) ƥȤ¸(b) ¹Ԥ륿
(c) ƥȤ3ĤΥƥåפǹ(a)
(c)ΥƥåפˤĤƤϡǥѥå㤬¹ԤѰդ
롥ŪˤϡγƽԤ롼Ѱդ롥

(a) ƥȤ¸
	(a-1) ȯŪ˸ƤӽФ¸dispatch
	(a-2) ߥϥɥνиǸƤӽФ줿¸ret_int
	(a-3) CPU㳰ϥɥνиǸƤӽФ줿¸ret_exc
	(a-4) νλνexit_and_dispatch
	(a-5) ͥưϻνstart_dispatch
(b) ¹Ԥ륿ʥǥѥåΡdispatcher
(c) ƥȤ
	(c-1) ȯŪ˸ƤӽФdispatch_r
	(c-2) ߥϥɥνиǸƤӽФ줿ret_int_r
	(c-3) CPU㳰ϥɥνиǸƤӽФ줿ret_exc_r
	(c-4) μ¹Գϻνstart_r

νλΥǥѥå

ext_tskˤ륿νλˡư׵᤬塼󥰤ƤȡƱ
˵ư롥ξ硤ǥѥåˤȤäƤϡƱ
ؤڴ˸ǥѥå򥹥åײǽ˻פ
ºݤˤϡƱΰۤʤ륤󥹥󥹤ؤڴǤ뤿ᡤ
ǥѥå򥹥åפƤϤʤʤ

ҤΥǥѥåι¤ˤꡤνλˤϡѤ
exit_and_dispatchˤƤӽФνǤϡ¹Ծ֤Υ
ȤƥȤ¸Ԥ鷺ˡ˻ह륿
ᡤǥѥååפ뤳ȤϤʤ

ʤter_tskˤäƼ¹Ծ֤Υλ뤳ȤϤǤʤᡤ
ter_tskǤϤΤ褦ʾϵʤ

reqflgƳͳ

ߥϥɥ顿CPU㳰ϥɥνиˡǥѥåޤϥ
㳰롼μ¹ԳϤ׵᤹뤳Ȥ򼨤ե饰Ȥơreqflg
ѰդƤ롥󥿥ƥȤˤơǥѥåɬ
ˤʤä䡤㳰롼μ¹ԳϤɬפˤʤäˤϡ
Υե饰򥻥åȤ롥

reqflgƳͳϡߥϥɥ顿CPU㳰ϥɥνиŵ
Ūʥʥǥѥå⥿㳰롼μ¹ԳϤɬ
ʤˤ®뤿Ǥ롥ޤǥѥåΡdispatcher
Υɥ®Ǥ롥

ߥϥɥ顿CPU㳰ϥɥνиΤΥХإåɤ
ȡreqflgˤ®θ̤Ϥۤ礭ʤΤȻפ롥


㳰ǽμ

㳰롼μ¹ԳϾȥƥ֡ʻͤγǧ

㳰롼ϡ6Ĥξ郎·ä˼¹ԤϤ롥

㳰ľ֤Ǥ
α㳰װ0Ǥʤ
¹Ծ֤Ǥ
ƥȤ¹ԤƤ
ͥ٥ޥ֤Ǥ
CPUå֤Ǥʤ

ޤ㳰롼μ¹Գϡ꥿Υƥ֤˴ؤ
ͤϼ̤Ǥ롥

				CPUå		ͥ	ǥѥå
				ե饰			ޥ			ػߥե饰
------------------------------------------------------------
ڥ㳰롼
¹ԳϾ							Ǥ
¹Գϻ	Τޤ		Τޤ		Τޤ
꥿		§(*1)	§(*1)	᤹
꥿					᤹(*4)
------------------------------------------------------------

㳰롼θƽФ

㳰롼ƤӽФϡήȤʤ롥δؿϡ
CPUå֤ǸƤӽФȤꤷƤ롥

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

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

	㳰ػ߾֤ˤ
	ǥѥåػߥե饰¸

	CPUå֤ˤ
	㳰롼ƤӽФ
	CPUå֤ˤ

	ͥ٥ޥ֤ˤ
	ǥѥåػߥե饰򸵤᤹
	㳰ػ߾֤ˤ  (*2)

	ɬפʾˤϥǥѥåԤ  (*1)

	㳰ľ֤ˤ
}
----------------------------------------

(*1)ˤơɬפʾ˥ڴԤΤϡͥ٥ޥ
ˤǥѥåػߥե饰򸵤ᤷ̡ǥѥåα
֤졤ǥѥåɬפˤʤ礬뤿Ǥ롥

ޤǥѥåԤ˥㳰ػ߾֤ˤ(*2)ͳˤĤ
Ƥϡcall_texrtndispatchƤӽФˤĤơפ򻲾Ȥ뤳
ȡ

㳰롼μ¹ԳϤɬפʥߥ

㳰롼ϡҤ6Ĥξ郎·ä˼¹ԳϤ٤
뤿ᡤ6ĤξΤ줫򿷤褦ˤʤǽΤ륿
󥰤ǡ㳰롼μ¹ԳϤɬפˤʤ롥

ʲǤϡ6ĤξΤ줫򿷤褦ˤʤ륿ߥ󥰤ˤĤ
Ƥ롥

(1) 㳰ľ֤Ǥ

㳰εġena_texˤˤäơ㳰ľ֤ˤʤ롥
ޤ㳰롼󤫤Υ꥿ˤäƤ⡤㳰
ľ֤ˤʤ롥

(2) α㳰װ0Ǥʤ

㳰׵ras_texiras_texˤˤäơα㳰װ
0Ǥʤʤ롥󥿥ƥȤΥ㳰׵
iras_texˤǤϡ(4)ξ郎ʤᡤ㳰롼
¹ԳϤɬפʤ

(3) ¹Ծ֤Ǥ

ǥѥåˤꡤڴΥ¹Ծ֤ˤʤ롥

(4) ƥȤ¹ԤƤ

ߥϥɥ餪CPU㳰ϥɥ餫Υ꥿ˤäơ
Ȥ礬롥

(5) ͥ٥ޥ֤Ǥ

ͥ٥ޥѹchg_ipmˤˤäơͥ٥ޥ
ˤʤ롥

ޤνλ㳰롼󤫤Υ꥿󡤳ߥϥ
餫Υ꥿CPU㳰ϥɥ餫Υ꥿ˤäƤ⡤ͥ
ޥ⤢롥

νλˤĤƤϡνλ̤Υڤ괹
뤿ᡤڤ괹äΥФ륿㳰롼μ¹Գ
򡤥ǥѥåνǹԤФ褤

(6) CPUå֤Ǥʤ

CPUå֤βunl_cpuiunl_cpuˤˤäơCPUå֤Ǥʤ
롥󥿥ƥȤǤCPUå֤βiunl_cpuˤǤϡ
(4)ξ郎ʤᡤ㳰롼μ¹ԳϤɬפʤ

ޤνλ㳰롼󤫤Υ꥿󡤳ߥϥ
餫Υ꥿󡤳ߥӥ롼󤫤Υ꥿󡤥।٥
ϥɥ餫Υ꥿CPU㳰ϥɥ餫Υ꥿ˤäơCPU
֤Ǥʤʤ⤢롥

ߥӥ롼󤪤ӥ।٥ȥϥɥ餫Υ꥿
ˤĤƤϡ꥿󥿥ƥȤμ¹Ԥ³(4)ξ郎
ʤᡤ㳰롼μ¹ԳϤɬפʤ

νλˤĤƤϡνλ̤Υڤ괹뤿ᡤ
ڤ괹äΥФ륿㳰롼μ¹ԳϤ򡤥
ǥѥåνǹԤФ褤

ʾꡤʣ륱θȡ㳰롼μ¹Գ
ɬפˤʤǽΤϡʲνǤ롥

(a) 㳰εġena_texˡ (1)
(b) 㳰롼νи  (1)(5)(6)
(c) 㳰׵ras_texˡ (2)
(d) ǥѥåν  (3)(5)(6)
	(d-1) dispatch_r
	(d-2) ret_int_r
	(d-3) ret_exc_r
	(d-4) start_r
(e) ߥϥɥνи  (4)(5)(6)
(f) CPU㳰ϥɥνи  (4)(5)(6)
(g) ͥ٥ޥѹchg_ipmˡ (5)
(h) CPUå֤βunl_cpuˡ (6)

(d-4)˴ؤƤϡμ¹Գľϥ㳰ػ߾֤
ʼena_texޤǤϡ㳰Ĥʤˡ(1)ξ
郎ʤᡤ㳰롼μ¹ԳϤɬפʤ

ޤ(h)˴ؤƤϡ˽Ҥ٤ͳˤꡤCPUå֤³Ƥ
¾5Ĥξ郎뤳ȤϤʤᡤ㳰롼
μ¹ԳϤɬפʤ

CPUå֤Ǥϡޤ㳰εġena_texˡ㳰
׵ras_texiras_texˡͥ٥ޥѹchg_ipmˤ
ȤϤǤǥѥåⵯʤCPUå֤ǥ
롼󤫤꥿󤹤뤳ȤϤǤ뤬ξCPUå֤
졤CPUå֤³ʤCPUå֤ǳߥϥɥ餫
꥿󤷤⡤ƱͤǤ롥

ǸˡCPUå֤CPU㳰ϥɥ餫꥿󤷤礬ˤʤ롥
ˤĤƤϡCPU㳰ȯˡCPUå֤Ǥäȡ
CPUå֤Ǥäʬƹͤ롥CPUå֤Ǥä
ˤϡCPU㳰ϥɥ餫Υ꥿ˤꡤCPUå֤
뤿ᡤߥϥɥ餫꥿󤷤ƱͤǤ롥CPUå֤
äˤϡưCPU㳰ϥɥϥͥCPU㳰ϥ
ɥǤ뤿ᡤ(1)(3)(5)ξ郎뤳ȤϤʤ
CPU㳰ϥɥμ¹(4)ξ¸뤳Ȥ顤CPU㳰ϥ
餫Υ꥿ˤäơ(1)(5)ξCPU㳰ȯꡤ
뤳ȤϤʤ

㳰롼μ¹ԳϽ

ǤϡǸƤ㳰롼μ¹ԳϤɬפʥ
ߥ󥰤Τ줾ˤĤơ¹ԳϽμˡˤĤƽҤ٤롥

(a) 㳰εġena_tex

ena_texƤӽФ줿ˤϡФơ֥¹
֤Ǥס֥ƥȤ¹ԤƤפ2Ƥ
ꡤ֥㳰ľ֤Ǥפξena_texνˤ
롥ޤCPUå֤Ǥʤפξena_texǥåƤ
롥Τᡤα㳰װ0Ǥʤפȡֳͥ٥ޥ
Ǥפ2郎Ƥˤϡ㳰롼Ƥӽ


ena_texΤνʥ顼ˤϼ̤ꡥ

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

(b) 㳰롼νи

㳰롼νиcall_texrtnθȾˤǤϡ
ơ֥¹Ծ֤Ǥס֥ƥȤ¹ԤƤפ
2Ƥꡤ֥㳰ľ֤Ǥסֳͥ٥
֤ǤסCPUå֤Ǥʤפ3郎и
롥Τᡤα㳰װ0ǤʤפƤˤϡ
㳰롼ƤӽФɬפ롥

㳰롼νиñcall_texrtnƤӽФȡ
call_texrtn椫call_texrtnƤӽФȤˤʤꡤ㳰
֤׵ᤵ줿ˡåλ̤˾¤ʤʤ롥ǡ
㳰롼νиǡα㳰װ0Ǥʤ׾ˤϡ
call_texrtnǥ롼פ롥

call_texrtnήϼ̤ꡥ

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

	ǥѥåػߥե饰¸  (*3)
	㳰ػ߾֤ˤ  (*6)

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

		CPUå֤ˤ
		㳰롼ƤӽФ
		CPUå֤ˤ

		ͥ٥ޥ֤ˤ
		ǥѥåػߥե饰򸵤᤹  (*4)
		㳰ػ߾֤ˤ  (*2)

		ɬפʾˤϥǥѥåԤ  (*1)
	}  while (p_runtsk->texptn != 0U);

	㳰ľ֤ˤ  (*5)
}
----------------------------------------

㳰롼θƽФ˥ǥѥåػߥե饰¸
ϡ(*4)ˤƸξ֤᤹Ȥ顤롼פγ(*3)ǹԤΤΨ
褤

㳰롼θƽФ˥㳰ػ߾֤ˤϡ
(*2)ˤƥ㳰ػ߾֤ˤ뤳Ȥ顤롼׳(*6)ǹԤ
Ψ褤ޤ㳰롼θƽФ˥㳰
ľ֤ˤ⡤롼פγ(*5)ǹԤΨ褤

(c) 㳰׵ras_tex

ras_texƤӽФ줿ǡоݥξˤϡ
Фơ֥¹Ծ֤Ǥס֥ƥȤ¹Ԥ
Ƥפ2Ƥꡤα㳰װ0Ǥʤפξ
ras_texνˤras_texΥѥ᡼rasptn0ξϥ顼
Ȥʤ뤿ˡޤCPUå֤Ǥʤפξras_texǥ
Ƥ롥ΤᡤоݥǤꡤ֥㳰
֤Ǥפȡֳͥ٥ޥ֤Ǥפ2郎
ˤϡ㳰롼ƤӽФ

ras_texΤνʥ顼ˤϼ̤ꡥ

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

(d-1) dispatch_r

dispatch_rˤƤϡdispatch_rΥ꥿ΥФơ֥
¹Ծ֤Ǥס֥ƥȤ¹ԤƤפ2
Ƥ롥ޤCPUå֤dispatch_r뤳ȤϤʤᡤ
CPUå֤ǤʤפξΩƤ롥Τᡤ֥㳰
ľ֤Ǥסα㳰װ0Ǥʤסֳͥ٥ޥ
Ǥפ3郎Ƥˤϡ㳰롼Ƥӽ
ɬפ롥

¸뤿ˡƥȤΥǥѥå򼡤Τ
˽롥

----------------------------------------
void
dispatch(void)
{
	ġġ

  dispatch_r:
	å쥸٤ƤΥ쥸򥹥å
	calltex();
}
----------------------------------------

calltexϡ֥㳰ľ֤Ǥסα㳰װ0Ǥ
סֳͥ٥ޥ֤Ǥפ3郎Ƥ
call_texrtnƤӽФؿǤ롥

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

(d-2) ret_int_r

ret_int_rϡߥϥɥνиǥǥѥåԤä
ԤƳݤνǤ롥Τᡤret_int_rΥ꥿Υ
Фơ֥¹Ծ֤Ǥס֥ƥȤ¹ԤƤ
פ2Ƥ롥ޤCPUå֤ret_int_r뤳Ȥ
ʤᡤCPUå֤ǤʤפξΩƤ롥Τᡤ֥
㳰ľ֤Ǥסα㳰װ0Ǥʤס֡ʳߥϥɥ餫
Υ꥿ˡ˳ͥ٥ޥ֤Ǥפ3郎
Ƥˤϡ㳰롼ƤӽФɬפ롥

¸뤿ˡߥϥɥν򼡤Τ褦˽롥

----------------------------------------
void
<ߤν>(void)
{
		ġġ

			  ret_int_r:
				å쥸٤ƤΥ쥸򥹥å
				calltex();
			}
		ġġ
}
----------------------------------------

(d-3) ret_exc_r

ret_exc_rϡCPU㳰ϥɥνиǥǥѥåԤä
¹ԤƳݤνǤ롥

ͥCPU㳰ϥɥνиret_excˤϡߥϥɥ
иret_intˤƱͤǤ롥ϡCPUå֤CPU㳰ȯ
ˤϡͥCPU㳰ϥɥȤʤꡤCPU㳰ϥɥν
ǥǥѥåԤȤϤʤret_excˤʤǤ롥
ᡤret_exc_rΥ꥿ΥФơCPUå֤Ǥʤ
ξ郎ΩƤ롥

ΤȤ顤CPU㳰ϥɥνˤĤƤ⡤ߥϥɥν
ƱͤˡΤ褦˽Ф褤

----------------------------------------
void
<CPU㳰ν>(void)
{
			ġġ

				  ret_exc_r:
					å쥸٤ƤΥ쥸
												å
					calltex();
				}
			ġġ
}
----------------------------------------

(e) ߥϥɥνи

ߥϥɥ餫饿إ꥿󤹤ˤϡ꥿Υ
ơ֥¹Ծ֤Ǥס֥ƥȤ¹ԤƤ
2Ƥ롥ޤCPUå֤ǳߥϥɥ餬¹Ԥ
뤳ȤϤʤᡤCPUå֤ǤʤפξΩƤ롥Τᡤ
֥㳰ľ֤Ǥסα㳰װ0Ǥʤס֡ʳߥϥ
ɥ餫Υ꥿ˡ˳ͥ٥ޥ֤Ǥפ3郎
Ƥˤϡ㳰롼ƤӽФɬפ롥

ߥϥɥθƽФȸƽФǤξ郎ѲΤϡ¹Ծ
֤ΥѲȡߥϥɥiras_texƤӽФ줿
Ǥ롥ߥϥɥ餫ena_texchg_ipmϸƤӽФʤᡤ֥
㳰ľ֤Ǥפȡ֡ʳߥϥɥ餫Υ꥿ˡ˳
ͥ٥ޥ֤Ǥפ2郎Ѳ뤳ȤϤʤ

2Ĥξ⡤¹Ծ֤ΥѲ륱ϡret_int_rǹθ
ѤߤǤ롥ߥϥɥiras_texƤӽФ줿ˤϡreqflg
trueˤʤ뤿ᡤ㳰롼μ¹ԳϽϡreqflgtrue
ˤΤ߹ԤФ褤

¸뤿ˡǽߥϥɥν򡤤
Τ褦˽롥

----------------------------------------
void
<ߤν>(void)
{
	ġġ

	if (ƥȤǳȯ) {
		ġġ
		if (reqflg) {
			ġġ

			  ret_int_r:
				å쥸٤ƤΥ쥸򥹥å
			}
			calltex();
		}
	}
	ġġ
}
----------------------------------------

(f) CPU㳰ϥɥνи

ͥCPU㳰ϥɥνиϡߥϥɥνиƱ
ͤǤ롥

ͥCPU㳰ϥɥǤϡ¹Ծ֤ΥѲ뤳
Ϥʤiras_texena_texƤӽФȤǤʤᡤ㳰롼
μ¹ԳϾ郎뤳ȤϤʤ㳰롼
μ¹ԳϤɬפʤ

ΤȤ顤CPU㳰ϥɥνˤĤƤ⡤ߥϥɥν
ƱͤˡΤ褦˽Ф褤

----------------------------------------
void
<CPU㳰ν>(void)
{
		ġġ
		if (ƥȤCPU㳰ȯ) {
		ġġ
			if (reqflg) {

				  ret_exc_r:
					å쥸٤ƤΥ쥸
												å
				}
				calltex();
			}
		}
		ġġ
}
----------------------------------------

(g) ͥ٥ޥѹ

chg_ipmƤӽФ줿ˤϡФơ֥¹
֤Ǥס֥ƥȤ¹ԤƤפ2Ƥ
롥ޤCPUå֤Ǥʤפξchg_ipmǥåƤ
롥Τᡤѥ᡼intpriTIPM_ENAALLǤꡤ֥㳰
֤Ǥסα㳰װ0Ǥʤפ2郎Ƥˤϡ
㳰롼ƤӽФ

chg_ipmδϢʬνϼ̤ꡥ

----------------------------------------
	t_set_ipm(intpri);
	if (intpri == TIPM_ENAALL) {
		ipmflg = true;
		˥ڴ
		if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
			call_texrtn();
		}
	}
----------------------------------------

dispatchƤӽФƥڴԤˤϡdispatchνиǥ
㳰롼ƤӽФᤳǸƽФԤɬפϤʤ
ɤʣˤʤ뤿ᡤdispatchƤӽФ⤳ǥ㳰롼
θƽФԤäƤ롥

call_texrtndispatchƤӽФˤĤ

dispatch_rʥåȤˤäƤcalltexͳơcall_texrtn
ӽФcall_texrtndispatchƤӽФᡤ2ĤδؿߺƵ
ƽФ򤷤Ƥ롥ǤϡμǻپΤʤͳ롥

call_texrtndispatchƤӽФΤϡǥѥåαƤʤ
֤ǸƤӽФ줿㳰롼󤬡μ¹˥ǥѥåα
֤ܤ˥ǥѥåɬפȤԤǥѥ
α֤ʤޤޥ꥿󤷤Ǥ롥ξ硤call_texrtn
ǥǥѥåα֤ˡdispatchƤӽФƥǥ
ѥåԤĤޤꡤcall_texrtndispatchƤӽФϡ
㳰롼ǥǥѥåα֤٤ǤäΤ򡤲
˥꥿󤷤ߺѤ뤿ΤΤǤ롥ʲο񤤤
ֵߺѥפȸƤ֡

ǡӤΤˡ㳰롼κǸǡǥѥ
α֤Ƥ꥿󤷤ο񤤤ͤ롥ξˤϡ
ǥѥåα֤륵ӥena_dspchg_ipmˤǡ
dispatchƤӽФƥǥѥå롥ʲο񤤤
辰פȸƤ֡

辰ȵߺѥӤȡcall_texrtn㳰롼
ӥ뢪dispatchνdispatchƤӽФ뤫call_texrtn
ľdispatchƤӽФ뤫ΰ㤤ȤȤˤʤꡤߺѥ
åλ̤ϾʤĤޤꡤ辰ưꤷƥå
褬ѰդƤСߺѥǤʤư뤳Ȥˤʤ롥

ǡ辰ȵߺѥǡ嵭ʳ˰㤤ʤȤפǤ롥
Ūˤϡcall_texrtnǡ㳰ľ֤ˤp_runtsk
->enatextrueˤˡdispatchƤӽФȤפǤ롥
㳰ľ֤ˤdispatchƤӽФȡиdispatch_rǡ
ӥ㳰롼¹ԤƤޤǽꡤߺѥ
åλ̤Ƥޤ

㳰롼ǡ㳰ľ֤ˤޤޥ꥿
ˤϡcall_texrtnƤӽФdispatchνиdispatch_rǺƤ
㳰롼¹ԤƤޤǽ롥ξ⡤
㳰롼κǸǡǥѥåα֤Ƥ꥿
ϥåλ̤ʤ㳰ػ߾֤ˤ
˥ǥѥåα֤ƥ꥿󤷤ϡåλ
̤礬롥ǡΤ褦ʾʤ褦ˡ
dispatchƤp_runtsk->enatexfalseˤ롥


顼Υå

ӥˤ륨顼åϡʲνǹԤȤ§
롥ʤˤϡݸǽбͥ˴ؤ뵭ҤޤޤƤ
εҤϾŪˤϤŬڤʥɥȤ˰ưͽǤ롥

顼3ʬ

ӥΥ顼ϡ礭ʲ3Ĥʬह뤳ȤǤ롥

(a) Ū顼

оݤΥͥ륪֥ȤϿƤ뤫ݤ䡤ξ֤˰¸
ˡå뤳ȤǤ륨顼

(b) Ū顼

оݤΥͥ륪֥ȤϿƤСξ֤˰¸˥
뤳ȤǤ륨顼

(c) ưŪ顼

оݤΥͥ륪֥Ȥξ֤˰¸륨顼

ASPͥˤƤϡ(a)(b)Υ顼ϥƥ륻γ¦ǡ
νǥå(c)Υ顼ϥƥ륻¦ǥ
롥ưŪǽĥѥåǤϡ(b)Υ顼ʤΰˤ
ƥ륻¦Ǽ»ܤɬפ롥

Ū顼Υå

Ū顼ˤϡ¹ԥƥȤΥ顼ʥǥѥåα֤θ
Ф顼ޤˡѥ᡼ϰΥ顼оݤΥͥ륪֥
Ȥ˰¸˥åǤΡˤޤޤ롥

ӥǤϡǽ˼¹ԥƥȤΥ顼å
塤ѥ᡼¤ӽˡϰΥ顼å롥

ݸǽбͥǤϡѥ᡼ݥ󥿤Ǥˡݥ󥿤
ؤΰ褬ǽǤ뤫åɬפ뤬
ΰ꤬ŪǤˤϡΥ顼å⤳Ǽ»ܤ롥
ΰ꤬ŪǤʤˤϡΥ顼åϥƥ
륻¦ǹԤɬפ롥

Ū顼Υå

Ū顼ΥåˡоݤΥͥ륪֥Ȥδ֥å
ƬϤ򡤥ѿ롥

ݸǽбͥǤϡμˡоݤΥͥ륪֥Ȥ
ǽǤ뤫åԤӥθƽФ
ƥ֤Ф륢ĥ٥ݸƤˤ⡤
ǥå»ܤ롥

θǡѥ᡼ϰΥ顼ǡоݤΥͥ륪֥
Ͽʽ֥å˴ޤޤƤˤ˰¸ƥå٤
ΤΥå򡤥ѥ᡼¤ӽǼ»ܤ롥


CHECKޥgotoʸλ

ASPͥμˤƤϡӥŪʥ顼å
ˡ̾Τ"CHECK_"ǻϤޤϢΥޥʤCHECKޥ
ˤѤƤ롥

CHECKޥˤgotoʸޤǤ뤬MISRA-CʤɤΥǥ
롼ǤgotoʸλѤػߤƤꡤgotoʸȤ٤ǤϤʤȤ
¿ޤޥgotoʸѤ뤳ȤǤȤ
ո⤢롥

ǤϡgotoʸޤCHECKޥѤ߷װտޤȤѤ
Ƥ褤CHECKޥλѤˤ꥽եȥο꤬뤳
ȤʤȤڤ롥

ʤASPͥΥͥΤμǤϡCHECKޥʳgotoʸ
ƤսϤʤʰΥƥॵӥǤϡʳˡgotoʸ
ѤƤˡ

CHECKޥȤλˡ

kernel/check.hˤϡ25ĤCHECKޥƤ뤬⼡Υ
Ƥ롥XXXXXˤϡå顼μɽ
ʸ롥

----------------------------------------
#define CHECK_XXXXX(<ġ>) {				\
	if (<顼>) {						\
		ercd = <顼>;				\
		goto error_exit;					\
	}										\
}
----------------------------------------

CHECKޥϡ¿ΥӥνؿǡΤ褦˻
ѤƤ롥

----------------------------------------
ER
<ӥ̾>(ġ)
{
	<ѿ>
	ER		ercd;

	LOG_XXX_YYY_ENTER(ġ);
	CHECK_XXXXX(ġ);
	CHECK_YYYYY(ġ);

	<ӥ>

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

ǤϡCHECKޥ2ĻѤƤ뤬1ĤΤ߻ѤƤ⤢
С3İʾѤƤ⤢롥ޤʣCHECKޥδ֤ˡ
ѿؤʸ⤢㤨Сter_tskνؿˡ

߷װտ

CHECKޥѤտޤϡۤȤɤΥӥɬפŪ顼
Υåɤѥ󲽤ɤδʷ餵ݤĤȤɤߤ
夵ȤȤˡҥߥβǽ򸺤餹ȤǤ롥

ʤߤˡCHECKޥѤʤ硤˼ӥν
ϡΤ褦˵Ҥ뤳Ȥˤʤ롥

----------------------------------------
ER
<ӥ̾>(ġ)
{
	<ѿ>
	ER		ercd;

	LOG_XXX_YYY_ENTER(ġ);
	if (<XXXXXΥ顼>) {
		ercd = <XXXXXΥ顼>;
	}
	else {
		if (<YYYYYΥ顼>) {
			ercd = <YYYYYΥ顼>;
		}
		else {

			<ӥ>

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

CHECKޥƤΤäƤȤβǤϡΥɤ
ɤߤ䤹Τ餫Ǥ롥

ʤΤ褦CHECKޥˤϡgotoʸλѤԲǤ롥

CHECKޥѤƤ褤

CHECKޥϡξ褦˻ѤʤФʤʤ

(1) CHECKޥϡӥؿƬʬǡӥ
ΥФ塤ƥ륻ޤǤˡؿ
Υȥåץ٥Ѥ롥

(2) ӥؿʬǡƥ륻ȴ
塤ӥиΥФˡؿΥȥåץ٥ˡ
error_exit٥֤

뤳Ȥʤ

Τ褦ˡgotoʸѤƤ⡤եȥο꤬
ȤʤȤĥˤϡ⤽⡤MISRA-CʤɤΥǥ󥰥롼
gotoʸλѤػߤƤ뺬򡤸ȡgotoʸλѤˤ꥽
ȥο꤬ǽΤͳ餫ˤɬפ롥

MISRA-CΥɥȤǤϡgotoʸλѤػߤ뺬ˤĤƤޤ
ˤʤäƤ餺ǤϤκ򼡤Τ褦˿¬롥

ή줬ʣˤʤꡤץΰտޤɤߤˤʤʤ롤
ѥåƥץˤʤˡ

CHECKޥξˤϡgotoʸ򥨥顼ȯζæФѤƤꡤ
error_exitȤʤɡץΰտޤ餫Ǥ롥Τ
gotoʸ򥨥顼ζæФѤˤϡgotoʸλѤ
ػߤ뺬ˤʤꤦ롥

gotoʸǶæФ뤳Ȥˤꡤæл˹ԤʤФʤʤ
Ф뤪줬롥

ˤĤƤ⡤CHECKޥ嵭λѾƻȤ¤ϡ
æл˹ԤʤФʤʤϤʤCHECKޥλѤˤ꥽ե
ο꤬뤳ȤϤʤ

뤳ȤʤȤڤ⤦1ˡϡǥ󥰥롼
פʤץबǥ󥰥롼˹פץ
뤳Ȥ򼨤ˡǤ롥

Ǥˡ߷װտޡפǽҤ٤褦ˡCHECKޥѤץϡ
gotoʸѤʤʥץ˽񤭴뤳ȤǤ뤬
ŪˤϡΤȤ롥

elseʤifʸthenκǸˡifʸ겼ˤˤꡤifʸ
Ʊ֥åƱؤΥ٥ʬgotoʸˤϡifʸ
٥δ֤ʸelseˤ뤳ȤˤꡤgotoʸȤʤʥץ
˽񤭴뤳ȤǤ롥

ȤơgotoʸȤäΥץͤ롥

----------------------------------------
	{
		/* ifʸʸ */
		if (....) {
			/* thenʸ */
			goto <٥>;
		}
		/* ifʸȥ٥δ֤ʸ */
	  <٥>:
		/* ٥ʸ */
	}
----------------------------------------

ΥץϡgotoʸȤʤΥץǤ롥

----------------------------------------
	{
		/* ifʸʸ */
		if (....) {
			/* thenʸ */
		}
		else {
			/* ifʸȥ٥δ֤ʸ */
		}
		/* ٥ʸ */
	}
----------------------------------------

ξ˹פgotoʸʣˤϡˤgotoʸ˾嵭
ˡˤäƽ񤭴뤳ȤǡgotoʸȤʤʥץ˽
뤳ȤǤ롥

CHECKޥλˡϡ嵭gotoʸλˡ˹פ뤿ᡤgotoʸ
Ѥʤʥץ˽񤭴뤳ȤǤ롥äơCHECK
ˤ뤳ȤϤʤ


ext_tskext_ker֤

ITRON4.0ͤǤϡext_tskϥ꥿󤹤뤳ȤΤʤӥȤʤ
Ƥ뤬TOPPERS奫ͥˤƤϡΥӥ֤ͤ
ERѹ󥿥ƥȤƤФ줿ˤϡE_CTX顼
ͤȤƥ꥿󤹤뤳ȤȤ롥

λͤФ뤤ĤаƤƤʲͳǺѤʤ

JSPͥΤ褦ˡβǽ򸡽Фʤ¹Ԥ³ˡϡ
Ż뤹륷ƥǤ˾ޤʤ
뤹륷ƥǤϡβǽ򸡽Ф顤˥ꥫХ򤹤٤
Ǥ롥

ASPͥƤΥͥ󤵤ˡϡץꥱ¦
ǲ;ϤʤȤ̣˾ޤʤ

θߴݤĤˡvoidȤޤޡ󥿥ƥȤ
ƤФ줿ˤϥ꥿󤹤Ȥˡϡͥλѹ˵
ˤʤȤ̣˾ޤʤޤ¾Υ顼ɡ㤨
E_NOSPTˤ֤;ϤʤƤ롥

CPU㳰ƤӽФȤˤˡϡͥΤ
ƺѤʤäǰCPU㳰Ƴ⡤ӥ
뤬顼֤˸ƤФOSEK/VDX OSͤΥ顼եå
뵡ǽƳͭ⤤Ȼפ뤿Ǥ롥

ѹˤꡤˡCPUå֤ǥѥåػ߾֤ext_tsk
ƤФ줿ˤ⥨顼꥿󤹤ˡͤ뤬Υᥤ롼
󤫤Υ꥿ext_tskˤʤʤᡤѤʤޤ¾
ñ̤Υ꥿ˡ礵̣⤢㤨Сߥϥ
餫CPUå֤Τޤޥ꥿󤷤ΰˡ

ˤ碌ơext_kerˤĤƤ⡤֤ͤERѹ롥ASPͥ
Ǥϡext_ker顼֤ȤϤʤHRPͥǤϡE_OACV顼
֤礬롥

ʤITRON4.0ͤǤϡexd_tsk꥿󤹤뤳ȤΤʤӥ
ȤʤäƤ뤬TOPPERS奫ͥǤϡexd_tskϥݡȤƤʤ


ͥΥǡ¤ФvolatileˤĤơʥƥ륻
νμ¸˴ؤ

ͥΥǡ¤ϡ¹Լ¹Ԥ¾νñ̡ʳߥϥɥ
ˤ⥢ǽ뤿ᡤvolatileɬפǤϤ
ȹͤ롥ºݡƥ륻ǥͥѿɤॳ
ɤѥκŬˤꥯƥ륻󳰤˰ư졤
Ȥʤä𤵤Ƥ롥

ͥΤ٤ƤΥǡ¤volatileĤˡϡǤϤ
뤬Ŭ޻ߤ뤿ˡͥΥǽˤϰƶͿ
롥ASPͥǤϡˡvolatileɬʤȤ
롥

ASPͥˤƤϡ¹Լ¹Ԥ¾νñ̤񤭴ǽ
Τǡ¤ϡ٤ơCPUå֤ޤߥå֤ˤ
륯ƥ륻ǥƤ롥ƥ륻
ǤΥǡ¤ΥѥκŬˤꥯƥ륻
󳰤˰ưʤ褦ˤˤϡѥФơƥ륻
νˤꡤΥǡ¤Ѥǽ뤳
ȤΤ餻Ф褤

Ūˤϡƥ륻νؿˤäƼ¸С
Τ褦ʺŬ޻ߤ뤳ȤǤ롥ASPͥ¿Υ
åȰ¸ˤơƥ륻νϥޥ䥤
ؿˤƤꡤΤ褦ʺŬ޻ߤǤʤ

ǡƥ륻ν¸ˤϡ
ǡ¤Ѥǽ뤳Ȥ򡤲餫ˡǥѥ
餻ʤФʤʤȤߤ롥GNUȯĶǤϡΤ줫
ˡǤȤǤ롥

(a) ƥ륻νΤޤϽܼŪʬ
	ʶŪˤϡ߶ػߡĤˤʥ饤Ǥʤ̾
	δؿˤ¸롥

(b) ƥ륻νܼŪʬ򥤥饤󥢥
	ˤäƼ¸ƤˤϡΥ饤󥢥֥clobber
	ꥹȤ"memory"ɲä롥

(c) ƥ륻νܼŪʬޥ䥤饤
	ؿƽФǼ¸Ƥˤϡƥ륻
	κǸȽФƬˡAsm("":::"memory")ȤҤ롥

ʤŬѤ륯ƥ륻νϡʲΤ
ΤǤ롥

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


㥹Ȥȼٹå

GCC-O2ץĤƥѥ뤷ˡͥΥ
οսǡηٹåФGCCΥСˤˡ

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

ϡGCC-O2ץĤȡѥ餬Cstrict
aliasing ruleȤ뤿Ǥ롥ѥstrict aliasing rule
ŬѤʤˤϡGCCΥץ-fno-strict-aliasingꤹ
褤ˤꡤٹå޻ߤ뤬strict aliasing rule
ȤŬϹԤʤʤ롥

ASPͥ˼ˤƤϡstrict aliasing ruleȤŬԤ
Ƥ褯ηٹå̵뤷Ƥ⺹٤ʤʲǤϡη
å̵뤷Ƥ⺹٤ʤͳҤ٤롥

ٹåФȤơsemaphore.cμιԤˤĤƸƤ롥

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

ηٹåθϡľŪˤϡ&winfo_sem(WINFO_WOBJ *)˥
ȤƤ뤳ȤǤ뤬ܼŪʸϡΥɤCstrict
aliasing rule˽ʤʸθˤʤǽꡤΥ롼˰¸
Ŭä̤ǽ뤳ȤǤ롥

Cstrict aliasing ruleϡߴΤʤۤʤ뷿̤ơХ
פΰ򥢥ʸѤƤϤʤʤȤΤǤ
ʻѤο񤤤̤ˤʤˡΥǤϡ(WINFO_SEM
*)Υݥ󥿷ͳ(WINFO_WOBJ *)Υݥ󥿷ͳǡХåפ
ΰ򥢥ʸѤƤϤʤʤȤˤʤ롥ޤ
åθˤʤäƤϤʤ(SEMCB *)Υݥ󥿷ͳ
(WOBJCB *)Υݥ󥿷ͳǡХåפΰ򥢥
ʸѤƤϤʤʤ

ASPͥμˤƤϡsemaphore.cδؿˤƤϡ(SEMCB *)
(WINFO_SEM *)Υݥ󥿤ѤƤꡤ(WOBJCB *)
(WINFO_WOBJ *)Υݥ󥿷ͳǥΰ򥢥뤳ȤϤʤ
ƤӽФwait.cδؿˤƤϡ(WOBJCB *)
(WINFO_WOBJ *)Υݥ󥿤ѤƤꡤ(SEMCB *)(WINFO_SEM
*)Υݥ󥿷ͳǥΰ򥢥뤳ȤϤʤ

strict aliasing rule˽ʤʸϡΥ롼˰¸
Ŭä̤ǽ뤳ȤǤ뤬ۤʤ륳ѥ
ñ̤ޤǺŬԤ뤳ȤϤʤᡤˤ꤬뤳
ȤϤʤȸȤǤ롥

Ʊϡ¾Υեeventflag.cdataqueue.cpridataq.c
mailbox.cmempfix.cηٹåˤĤƤ⡤ΤޤƤϤޤ롥


ǽɾѥƥﻲȵǽ

ɬȻ

ASPͥˤϡASPͥư륿ASPͥ뼫Ȥǽ
¬뤿ˡƥ٤ι⤤ǽɾѥƥɤ
Фǽ򥵥ݡȤ롥ǽɾѥƥϡޥñ̤ɽ
뤬ºݤ٤ϥåȰ¸Ǥ롥

εǽѤƤץμ¹Ի֤¬ˤϡμ¹ľ
¹ľǽɾѥƥɤ߽Фκ롥Τᡤ
ǽɾѥƥϾͤѤǽɾѥƥ
ͤѤ뤳ȤꤷƤʤ

API

ǽɾѥƥﻲȵǽǤϡΥǡѤ롥

	SYSUTM		ǽɾѥƥ̵ñ̤ϥޥá
				32ӥåȰʾ

SYSUTMϡå¸ˤulong_tʤʤunsigned
longˤƤꡤΥϡ32ӥåȰʾǡå
Ǥ롥

ǽɾѥƥ郎SYSUTMɽǤϰϤĶʤĤޤꡤ
Хե˾硤ǽɾѥƥ0롥ɾоݥץ
μ¹ǽɾѥƥκˤϡ¬֤
SYSUTMɽǤϰϤǤ¤ꡤ0뤳Ȥ̤˹θɬפϤ


SYSUTM32ӥåȤξ硤ǽɾѥƥ71ʬǥХե
롥Τᡤεǽ71ʬ֤ۤ¬˻Ȥäư
ڤʤ

ǽɾѥƥﻲȵǽΤΥӥλͤˤĤƤϡ
TOPPERS奫ͥͽפΡ4.6.1 ƥפ
Ȥ뤳ȡ



ޥñ̤Ǽ뤿ˡŪʥƥå򶡵뤹
ޤθ͡ʥޤϥȥåפΤȲꤹˤɤ߽Ф
ޥñ̤˴ͤˡߤΥƥʥߥñ̤ɽ
ˤ1000ܤͤäΤǽɾѥƥȤ롥
ߤΥƥ1000ܤݤˡХեȯǽ뤬
̵뤷Ƥޤʤ

ƥθͤȥޤθͤӤ֤ɤ߽Ф
ưפǤϤʤξͤɤ߽ФȡɽФδ֤˥ޤХ
Ƴ׵᤬ȯˡϥХե͡⤦
ϥХեͤɤǤޤäǽɾѥƥ
Ƥޤ

褹ˡϤĤͤ뤬ɤˡѤη
ˤꡤ׵ꤷ

(1) ¿ΥåȥƥǼ¸Ǥ뤳ȡ

(2) ӥμ¹Ի֤ǽʸ¤Ȥʤ뤳ȡȡ
    ˤäƥӥμ¹Ի֤礭ưʤȡ

(3) ӥβǽʸ¤Ʊߥ󥰤λ֤ȡ
    ȡˤäƻɤ߼륿ߥ󥰤ưʤȡ

(4) ĴɬפΤѥ᡼Ǿ¤Ȥ뤳ȡ

׵ˡȤơˡѤ뤳Ȥˤ

ޤNMI٤Ƥγߤػߤ֤ǡƥθ͡
ޤθ͡1ܡˡ޳׵̵ͭޤθ͡2ܡ
򡤤νɤ߽ФߤػߤƤ뤿ᡤδ֤˥ƥ
ͤѲ뤳ȤϤʤƥθͤɤ߽Ф֤Ϥɤ
褤ޤޤθͤ2ܤɽФϡ޳׵᤬ä
ˤΤɬפȤʤ뤬(2)׵ᤫ顤޳׵̵ͭˤ餺
߽ФȤȤ롥

ͤɤ߽Ф塤߶ػߤνԤޤ
޳׵᤬ʤäˤϡƥθͤȡ1ܤɤ
ޤθͤϰӤͤǤ뤳ȤݾڤǤ뤿ᡤͤ
ǽɾѥƥθͤ롥

˥޳׵᤬äˤϡ1ܤɤޤθͤ
޳׵ȯ͡ʥХե͡ˤǤȡȯ
ʥХե͡ˤǤξβǽͤ롥Τɤ
ξǤä2ܤɤޤθͤȤäơΤ褦˷
롥2ܤͤϡ޳׵ȯ͡ʥХե͡ˤǤ
뤳ȤݾڤǤ뤿ᡤ1ܤͤ2ܤͤ礭ˤϡ
֤˥ХեäΤȿ¬Ǥ롥Ĥޤꡤ1ܤͤϥХե
ͤȤȤˤʤꡤƥθͤȰӤͤǤȤ
ǽɾѥƥθͤ롥դˡ1ܤͤ2ܤͤƱ
꾮ˤϡ1ܤͤϥХեͤǤȿ¬Ǥ
롥ξˤϡΥƥåΥƥᡤͤ1
ͤӤͤǤȤǽɾѥƥθͤ롥

ǡ޳׵᤬äˤϡ2ܤɤޤθͤ
Ѥˡͤ뤬(3)׵ʤʤ뤿˺Ѥʤä
ޤJSPͥƱͤˡϡ(4)׵ʤ˺Ѥʤ


ǡֿ¬ǤפȤΤϡο¬Ωʤʤ륱뤿
Ǥ롥ο¬Ωʤʤ륱ϡ2Ĥξʬʬ
뤳ȤǤ롥

(a) 1ܤͤХեͤǤˤ⤫餺1ܤͤ2
    ͤ礭ʤ

Τ褦ʥϡ޳ߤ׵ᤵƤˤ⤫餺ӥ
ʤ֤Ĺ³ޤθͤ1ܤɤǤ2ܤ
ޤǤδ֤Ĺ֤ä̡δ֤ˡʺ١˥Хեȯ
˵롥Ĥޤꡤ޳ߤӥʤ֤
ƥåμĹʤäǤ롥Τ褦ʾˤϡƥ
ιԤʤʤ롥

(b) 1ܤͤХեͤǤˤ⤫餺1ܤͤ2
    ͤƱ⾮ʤ

Τ褦ʥϡޤθͤ1ܤɤǤ2ܤɤޤǤ
֤ˡޤۤ1ʬȥåפ˵롥ξ⡤
޳ߤػߤƤ֤ƥåμĹä
ˤʤꡤƥιԤʤʤ롥

Υ⡤޳ߤĹֶػߤƤ롤޳ߤ
ͥ٤ι⤤߽Ĺ³Ƽ¹Ԥ줿ߥ졼Ķ
ˤƥߥ졼ΥץĹ֥塼뤵ʤäʤɤ
ͳǡƥιԤʤ롥Ǥξ
򡤥ӥѾջࡥ

ºݤΥɤˤƤϡƥθͤѿݻƤʤ
ʾ̷current_timeݻƤ뤬̷ݻѿ
ˡΥƥåΥƥѤƷ׻Ƥ롥Τᡤ
ޤθͤХեͤǤȽǤƤϡ
ƥåμ֤򡤵᤿ǽɾѥƥ狼鸺롥
ˤꡤӥμ¹Ի֤ư뤳Ȥˤʤ뤬ifʸ
ʥѥκŬꤹȡͤθ1ʤΤǡưϤ鷺
Ǥ롥

ΥӥϡǤդξ֤ƤӽФȤǤ뤿ᡤSIL
ߥåǽѤơӥΥƥ륻
롥


㳰ػߥե饰enatexǼƤͳ

㳰ػߥե饰ϡTCBenatexեɡʥ㳰
֤Ǥ뤳Ȥ򼨤ˤηݻƤ롥ΥեɤdistexȤ
enatexȤΤϡJSPͥˤƥǥѥåػߥե饰
enadspηݻΤ礵Ǥ롥

ASPͥǤϡenadspdisdspѹˤʤäȤ顤enatexdistex
ѹɤäȻפ롥

ʾ
