
		TOPPERS/ASPͥ
		ǽĥ塼˥󥰥

		бС: Release 1.9.2
		ǽ: 2014ǯ12

ΥɥȤϡ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$
----------------------------------------------------------------------

ܼ

顼åξά
ƥåμѹ
üŪΥ쥸ΰ
ĥѥåλȤ
	- ߥ塼ƥåǽĥѥå
	- åХåեǽĥѥå
	- Хϥɥ鵡ǽĥѥå
	- ͥٳĥѥå
	- 󥿥ĥѥå
	- ưŪǽĥѥå
CPU㳰ϥɥľܸƽФ
	- TA_DIRECT°Ƴ
	- åȰ¸νս


顼åξά

ӥΥХإåɤ︺뤿ˡŪʥ顼Υå
ά礬롥ASPͥˤƤϡŪʥ顼ΥåϤ
CHECKޥѤƹԤäƤ뤿ᡤkernel/check.hCHECKޥ
뤳ȤǡŪʥ顼Υåά뤳ȤǤ롥

㤨СIDΥåάˤϡCHECK_TSKIDޥ
CHECK_TSKID_SELFޥ򡤼Τ褦˽Ф褤

#define CHECK_TSKID(tskid)			((void)(tskid))
#define CHECK_TSKID_SELF(tskid)		((void)(tskid))

Υޥˤˡ⤢뤬ѥ᡼ѤΤ뼰
񤫤ƤǽͤȡѤΤ뼰Ͻ񤯤٤ǤϤʤ
Ƥ륳ɤäƤǽʤȤϸʤˡ
Ǥ롥ѤΤʤǤСŬˤäƺ뤳Ȥ
뤿ᡤ¹ԻΨˤϱƶʤȴԤǤ롥Ŭˤä
ʤˤϡѤΤ뼰񤫤ƤʤȤǧǡ
ޥˤƤ褤


ƥåμѹ

ASPͥǤϡͥإƥå򶡵뤹1ߥäɸ
ȤʤäƤ뤬®ʥץåǤ1ߥ˳ߤ륪Хإ
ɤˤʤ礬롥ǡץꥱɬפȤ
ƤˤϡƥåμĹ뤳Ȥǡץåν
٤㸺ˡ롥

ƥåμͿϥåȰ¸Ǥ뤿ᡤ줬ѹǤ
뤫ɤϡåȰ¸Υޥɥ饤ФμĴ٤ɬפ롥
ɸŪˤϡtarget_kernel.hʤޤϤ饤󥯥롼ɤե
ƤTIC_NUMETIC_DENO񤭴뤳ȤǡѹǤ褦
˼Ƥ롥


üŪΥ쥸ΰ

FPU쥸DSP쥸ʤɤüŪΥ쥸ʰʲü쥸
ĥץåǤϡ쥸ΰˤĤ礭3Ĥˡͤ
롥

(1) ü쥸򥿥ΥƥȤ˴ޤʤ

1ĤΥΤߤü쥸Ѥˤϡü쥸򥿥
ƥȤ˴ޤɬפʤͥǴɬפʤ

(2) ü쥸򥿥ΥƥȤ˴ޤ

ʣΥü쥸Ѥˤϡü쥸򥿥Υ
ƥȤ˴ޤˡǤñǤ롥Τˤϡǥѥ
ȳߥϥɥ/CPU㳰ϥɥνǡü쥸¸/
륳ɤɲäɬפ롥ºݤ¸/ϡå쥸
ȤʳΥ쥸ǰۤʤ뤿ᡤդɬפǤ롥

(3) ü쥸򥳥ƥȤ˴ޤ뤫ɤ򥿥˻ꤹ

ü쥸Ѥ륿ȻѤʤǡ٤ƤΥ
ΥƥȤü쥸ޤˡǤϥХإåɤˤ
ˤϡü쥸򥳥ƥȤ˴ޤ뤫ɤ򥿥˻
ˡͭϤǤ롥¸ˡϼ̤Ǥ롥

ޤü쥸򥳥ƥȤ˴ޤ뤫ɤꤹ륿°
ߤ롥㤨СFPU쥸ǤС°TA_FPUߤ롥
ǥѥåǤϡ°򸫤ơ°ꤵƤü
¸/롥

ϡɥŪü쥸ǥ֥Ǥˤϡ°
ꤵƤʤڤ괹ü쥸ǥ֥뤹
ȡäü쥸Ȥä򸡽ФǤ롥

ˡߥϥɥISRϥɥ顤顼ϥɥޤˤ
CPU㳰ϥɥü쥸Ѥˤϡνñ̤ˤ
ü쥸Ѥ뤫ɤ°ߤˡͤ롥

ǡʤޤ¾νñ̡ˤü쥸Ѥ뤫ɤϡ
ѥ饤֥˰¸礬뤿ᡤդɬפǤ롥㤨
Сư黻ޤޤʤץǤäƤ⡤ѥ餬
ǽ⤤ȽǤСư̿礬롥


ĥѥåλȤ

ASPͥǤϡĤγĥǽ뤿ˡĥѥå
ݡȤƤ롥ĥѥåϡextensionǥ쥯ȥ֤Ƥ롥

ĥѥåѤˤϡUNIXǤСASPͥΥե
Υȥåץǥ쥯ȥǡ

	% cp -r extension/<ĥѥåΥǥ쥯ȥ̾>/* .

¹Ԥ롥λΡʳĥΡ˥եϾ񤭤Ƥޤ
ᡤĥʤͥѤˤϡ̤Υǥ쥯ȥ˥
եŸơΥޥɤ¹Ԥ뤳ȡ

ʣγĥѥåȤȤϹθƤʤʲ˽Ҥ٤륱
ƤϡȤˤʣγĥѥåޡ뤳ȤϲǽǤ롥
Ǥϡߥ塼ƥåǽĥѥå󥿥ĥѥå
ޡ뤳ȤϤǤʤޤưŪǽĥѥå¾γĥ
ѥåȥޡ뤳ȤϹθƤʤ

ߥ塼ƥåǽĥѥå

ߥ塼ƥåǽĥѥåϡߥ塼ƥåǽɲä뤿
ĥѥåǤ롥ͥٵž椹뤿λȤߤȤơ
ͥپ¥ߥ塼ƥåTA_CEILING°Υߥ塼ƥåˤΤߤ򥵥ݡ
ȤͥٷѾߥ塼ƥåTA_INHERIT°Υߥ塼ƥåˤϥݡ
ȤƤʤߥ塼ƥåǽĥѥåϡextension/mutexǥ
ȥ֤Ƥ롥

ߥ塼ƥåǽĥѥåǤϡTOPPERS_SUPPORT_MUTEXkernel.h
ƤΤǡѤƥߥ塼ƥåǽѤǤ뤫ɤ
Ƚ̤뤳ȤǤ롥

åХåեǽĥѥå

åХåեǽĥѥåϡåХåեǽɲä
뤿γĥѥåǤ롥åХåեǽĥѥåϡ
extension/messagebufǥ쥯ȥ֤Ƥ롥

åХåեǽĥѥåǤϡTOPPERS_SUPPORT_MESSAGEBUF
kernel.hƤΤǡѤƥåХåեǽ
ѤǤ뤫ɤȽ̤뤳ȤǤ롥

Хϥɥ鵡ǽĥѥå

Хϥɥ鵡ǽĥѥåϡХϥɥ鵡ǽɲä
뤿γĥѥåǤ롥γĥѥåȤˤϡ
åȰ¸бƤɬפ롥Хϥɥ鵡ǽĥѥ
ϡextension/ovrhdrǥ쥯ȥ֤Ƥ롥

Хϥɥ鵡ǽĥѥåǡåȰ¸ĥѥå
бƤˤϡTOPPERS_SUPPORT_OVRHDRkernel.h
ΤǡѤƥХ󥿥޵ǽѤǤ뤫ɤȽ̤
ȤǤ롥

ͥٳĥѥå

ͥٳĥѥåϡͥ٤256ʳ˳ĥ뤿
ĥѥåǤ롥γĥѥåϡͥ٤˲äơǡ
ͥ١åͥ١ߥӥ롼ͥ٤256ʳ˳ĥ
롥ͥٳĥѥåϡextension/pri_levelǥ쥯ȥ
Ƥ롥

ͥٳĥѥåǤϡTOPPERS_SUPPORT_PRI_LEVELkernel.h
ƤΤǡѤƥͥ٤ϰϤĥƤ뤫
Ƚ̤뤳ȤǤ롥

󥿥ĥѥå

󥿥ĥѥåϡ󥿥εǽɲä뤿γĥѥå
Ǥ롥TOPPERS奫ͥͽ˵ꤵ줿󥿥εǽ
äơΥ١ͥ٤ѹ륵ӥras_pri
롥󥿥ĥѥåϡextension/rstr_taskǥ쥯ȥ֤
Ƥ롥

󥿥ĥѥåǤϡTOPPERS_SUPPORT_RSTR_TASKkernel.h
ƤΤǡѤ󥿥εǽѤǤ뤫ɤȽ
̤뤳ȤǤ롥

----------------------------------------------------------------------
ras_pri		Υ١ͥ٤ΰ夲T

CAPI
	ER ercd = ras_pri(PRI tskpri)

ڥѥ᡼
	PRI			tskpri		١ͥ

ڥ꥿ѥ᡼
	ER			ercd		ｪλE_OKˤޤϥ顼

ڥ顼ɡ
	E_CTX		ƥȥ顼
				󥿥ƥȤθƽФ
				CPUå֤θƽФ
	E_PAR		ѥ᡼顼
				tskpriͭϰϳ
	E_ILUSE		ӥ
				ˤĤƤϵǽι򻲾

ڵǽ

Υ١ͥ٤tskpriǻꤷͥ٤ѹ롥Ūʿ
񤤤ϰʲ̤ꡥ

Υ١ͥ٤tskpriǻꤷͥ٤ѹ롥ȼ
ơθͥ٤ѹ롥Ʊͥ٤ΥǤϡ
ǹ̤ͥȤʤ롥

tskpriTPRI_INIʡ0ˤꤹȡΥ١ͥ٤ưͥ
٤ѹ롥

tskpriϡεưͥ٤Ʊ⤯ʤФʤʤ
ǤʤˤϡE_ILUSE顼Ȥʤ롥
----------------------------------------------------------------------

ưŪǽĥѥå

ưŪǽĥѥåϡ֥ȤưŪǽɲä뤿
γĥѥåǤ롥TOPPERS奫ͥͽ˵ꤵ줿ʲ
Υ֥ΤΥӥ롤դǽIDֹο
ꤹŪAPI˲äơͥ뤬դΰꤹŪ
API DEF_KMMƤ롥ưŪǽĥѥåϡextension/dcre
ǥ쥯ȥ֤Ƥ롥

ͥǤưŪ˴ؤƤϡå¸Ǥϡ
ΰƬ˳ơ줿ΰѤʤ
⥸塼ΤߤƤ롥ܳŪưŪԤ
ˤϡåȰ¸ޤϥ桼¦ǡΤδؿѰդɬ
פ롥ѰդؿˤĤƤϡTOPPERS/ASPͥ åȰ
¸ ݡƥ󥰥ɡפΡ6.15 ưŪפ򻲾Ȥ뤳ȡ

ưŪǽĥĥѥåǤϡTOPPERS_SUPPORT_DYNAMIC_CREkernel.h
ƤΤǡѤưŪǽѤǤ뤫ɤȽ
̤뤳ȤǤ롥

ưŪǽĥѥåˤɲä륵ӥ

	ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk)
	ER ercd = del_tsk(ID tskid)
	ER ercd = def_tex(ID tskid, const T_DTEX *pk_dtex)
	ER_ID semid = acre_sem(const T_CSEM *pk_csem)
	ER ercd = del_sem(ID semid)
	ER_ID flgid = acre_flg(const T_CFLG *pk_cflg)
	ER ercd = del_flg(ID flgid)
	ER_ID dtqid = acre_dtq(const T_CDTQ *pk_cdtq)
	ER ercd = del_dtq(ID dtqid)
	ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq)
	ER ercd = del_pdq(ID pdqid)
	ER_ID mbxid = acre_mbx(const T_CMBX *pk_cmbx)
	ER ercd = del_mbx(ID mbxid)
	ER_ID mpfid = acre_mpf(const T_CMPF *pk_cmpf)
	ER ercd = del_mpf(ID mpfid)
	ER_ID cycid = acre_cyc(const T_CCYC *pk_ccyc)
	ER ercd = del_cyc(ID cycid)
	ER_ID almid = acre_alm(const T_CALM *pk_calm)
	ER ercd = del_alm(ID almid)
	ER_ID isrid = acre_isr(const T_CISR *pk_cisr)
	ER ercd = del_isr(ID isrid)

ưŪǽĥѥåˤɲäŪAPI

	AID_TSK(uint_t notsk)
	AID_SEM(uint_t nosem)
	AID_FLG(uint_t noflg)
	AID_DTQ(uint_t nodtq)
	AID_PDQ(uint_t nopdq)
	AID_MBX(uint_t nombx)
	AID_MPF(uint_t nompf)
	AID_CYC(uint_t nocyc)
	AID_ALM(uint_t noalm)
	AID_ISR(uint_t noisr)
	DEF_KMM({ SIZE kmmsz, STK_T *kmm })

----------------------------------------------------------------------
DEF_KMM		ͥ뤬դΰSD

ŪAPI
	DEF_KMM({ SIZE kmmsz, STK_T *kmm })

ڥѥ᡼
ͥ뤬դΰ
	SIZE		kmmsz		ͥ뤬դΰΥʥХȿ
	STK_T		kmm			ͥ뤬դΰƬ

ڥ顼ɡ
	E_PAR		ѥ᡼顼
				kmmsz0ʲ
				¾ξˤĤƤϵǽι򻲾
	E_OBJ		֥Ⱦ֥顼
				ͥ뤬դΰ褬Ѥ

ڵǽ

ƥѥ᡼ǻꤷͥ뤬դΰ˽äơ
ͥ뤬դΰꤹ롥

kmmszѥ᡼kmmϰѥ᡼Ǥ롥

kmmNULLȤ硤kmmszǻꤷΥΰ򡤥ե
졼ݤ롥kmmsz˥å˹פʤꤷ
ˤϡå˹פ褦˥礭˴ݤ
ݤ롥

ͥ뤬դΰ򥢥ץꥱǳݤˤϡ
kmmszǻꤷΥΰݤkmmˤƬϤꤹ롥

DEF_KMMˤꥫͥ뤬դΰꤷʤ硤ͥ뤬
դΰϳݤʤ

kmmkmmsz˥å˹פʤƬϤ䥵ꤷ
ˤϡE_PAR顼Ȥʤ롥
----------------------------------------------------------------------


CPU㳰ϥɥľܸƽФ

CPU㳰ϥɥνϡCPU㳰ȯʤ褦˼ʤ
ʤʤ줬ɤʤåȤˤƤϡCPU㳰ϥɥν
ͳˡץꥱѰդCPU㳰ϥɥľܼ¹Ԥ
ˡѰդΤ˾ޤCPU㳰ϥɥľܸƽФȸƤ֡

Ǥϡϡɥǥ٥ơ֥ĥץåˤơ
Ȱ¸ΤߤνˤꡤCPU㳰ϥɥľܸƽФεǽɲä
ˡˤĤ롥

TA_DIRECT°Ƴ

CPU㳰ϥɥľܸƽФꤹ뤿ˡCPU㳰ϥɥ°ˡ
TA_DIRECT°Ƴ롥

åȰ¸νս

TA_DIRECTͤtarget_kernel.hʤޤϡ饤󥯥롼ɤե
ˤͤ򥳥ե졼Ф褦ˡ
target_def.csvʤޤϡեˤ˼ιԤɲä롥

TA_DIRECT,TA_DIRECT

ˡtarget.tfʤޤϡ饤󥯥롼ɤեˤǡ
TARGET_EXCATRꤵͤˡTA_DIRECTɲä롥㤨С¾Υ
Ȱ¸CPU㳰ϥɥ°ʤˤϡΤ褦ꤹ롥

$TARGET_EXCATR = TA_DIRECT$

ˡOMIT_INITILIZE_EXCEPTIONѤơCPU㳰ϥɥν
뤿εҤCPU㳰ϥɥ֥åɸ
Τ޻ߤˤä޻ߤʬtarget.tf˥ԡǡʲ
νä롥

CPU㳰ϥɥν뤿εҡEXCHDR_ENTRYΥꥹȡ
ʬϡΤ褦˽롥

$FOREACH excno EXC.ORDER_LIST$
	$IF (EXC.EXCATR[excno] & TA_DIRECT) == 0$
		EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
	$END$
$END$

ޤCPU㳰ϥɥ֥åʬϡΤ褦˽
롥

$IF LENGTH(EXC.ORDER_LIST)$
	const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
	$JOINEACH excno EXC.ORDER_LIST ",\n"$
		$IF (EXC.EXCATR[excno] & TA_DIRECT) == 0$
			$TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
		$ELSE$
			$TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)($EXC.EXCHDR[excno]$) }
		$END$
	$END$$NL$
	};$NL$
$ELSE$
	TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
$END$

ʾ
