
		TOPPERS/ASPͥ
		ե졼

		бС: Release 1.9.2
		ǽ: 2013ǯ1231

ΥɥȤϡTOPPERS/ASPͥΥե졼ɸŪ
٤եƤˤĤƲ⤷ΤǤ롥åȰ¸
ƤˤĤƤϡΥɥȤϰϳǤ롥

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

 Copyright (C) 2005-2013 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$
----------------------------------------------------------------------

ܼ

եμ
ŪAPI
ͥ빽إåեkernel_cfg.h
	(1) ʬ
	(2) ֥ȿ
	(3) ֥ȤIDֹ
ͥ빽եkernel_cfg.c
	(1) ʬ
	(2) ͥμΥå
	(3) 󥯥롼ɥǥ쥯ƥ֡#includeˤν
	(4) ȥ졼ޥΥǥե
	(5) ֥ȤIDֹݻѿ
	(6) ƥͥ륪֥Ȥ˴ؤ
	(7) ߤ˴ؤ
	(8) CPU㳰˴ؤ
	(9) 󥿥ƥѤΥåΰ˴ؤ
	(10) ।٥ȴ˴ؤ
	(11) ƥ⥸塼νؿ
	(12) 롼μ¹Դؿ
	(13) λ롼μ¹Դؿ


եμ

ASPͥΥե졼ϡƥॳե졼ե
ơͥ빽եkernel_cfg.cˤȹ
إåեkernel_cfg.hˤ롥ޤե졼
ˡɬפ֥ե롥


ŪAPI

ASPͥΥե졼ŪAPIϼ̤ꡥ

(1) ǽ
	CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
								PRI itskpri, SIZE stksz, STK_T *stk })

(2) 㳰ǽ
	DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn })

(3) Ʊ̿ǽ
	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 })

 dtqmbpdqmbmprihdNULLǤʤϥݡȤʤ

(4) סǽ
	CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
										MPF_T *mpf, void *mpfmb })

 mpfmbNULLǤʤϥݡȤʤ

(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) CPU㳰ǽ
	DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })

(8) ƥ๽ǽ
	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 })

ŪAPIΥѥ᡼⡤IDΥѥ᡼ϥ֥ȼ̾
ݥ󥿷void *TASKTEXRTNCYCHDRALMHDRISRINTHDREXCHDR
INIRTNTERRTNSTK_T *MPF_T *ˤintptr_tΥѥ᡼ϰ
ѥ᡼Ȥ롥¾Υѥ᡼ϡѥ᡼Ȥ롥


ͥ빽إåեkernel_cfg.h

ͥ빽إåեkernel_cfg.hˤˤϡ
롥

(1) ʬ

kernel_cfg.hʣ󥤥󥯥롼ɤΤɤεҤ롥
ŪˤϡեƬ˼ιԤ롥

#ifndef	TOPPERS_KERNEL_CFG_H
#define	TOPPERS_KERNEL_CFG_H

ޤե˼ιԤ롥

#endif	/* TOPPERS_KERNEL_CFG_H */

(2) ֥ȿ

ͥ뤬ݡȤ륪֥Ȥοޥץץåǥ
쥯ƥ֡#defineˤ롥ŪˤϡΤ褦ʵҤ롥

#define TNUM_TSKID	<ο>
#define TNUM_SEMID	<ޥեο>
#define TNUM_FLGID	<٥ȥե饰ο>
#define TNUM_DTQID	<ǡ塼ο>
#define TNUM_PDQID	<ͥ٥ǡ塼ο>
#define TNUM_MBXID	<᡼ܥåο>
#define TNUM_MPFID	<Ĺסο>
#define TNUM_CYCID	<ϥɥο>
#define TNUM_ALMID	<顼ϥɥο>

(3) ֥ȤIDֹ

ե졼IDֹդ֥Ȥ̾򡤳դ
IDֹ˥ޥץץåǥ쥯ƥ֡#defineˤ롥
㤨СΤ褦ʵҤ롥

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


ͥ빽եkernel_cfg.c

(1) ʬ

kernel_cfg.cѤΥإåեIDưդ̥ե򥤥󥯥롼
ץץåǥ쥯ƥ֡#includeˤ롥Ūˤϡ
ιԤ롥

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

(2) ͥμΥå

kernel_cfg.cȥͥμबפƤ뤫å뤿ˡ
Ԥ롥

#if TKERNEL_PRID != 0x07u
#error The kernel does not match this configuration file.
#endif

(3) 󥯥롼ɥǥ쥯ƥ֡#includeˤν

ƥॳե졼ե˴ޤޤCץץåΥ
󥯥롼ɥǥ쥯ƥ֡#includeˤƱΥǥ쥯ƥ֡#include
롥㤨С

#include "sample1.h"

Ȥ󥯥롼ɥǥ쥯ƥ֤Фơ

#include "sample1.h"

Ȥǥ쥯ƥ֤롥ǥ쥯ƥ֤νϡ
ॳե졼եǤΥ󥯥롼ɥǥ쥯ƥ֤ν
˰פ롥

(4) ȥ졼ޥΥǥե

kernel_cfg.cǻѤȥ졼ޥΥǥե롥
ŪˤϡιԤ롥

#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 */

(5) ֥ȤIDֹݻѿ

ե졼Ф륪ץ--external-idˤˤꡤե
졼ID ֹդ֥Ȥ̾"_id"ղä
̾ѿ롥ѿϡconst°ղäIDѿȤ
դIDֹͤȤ롥㤨СΤ褦ʵҤ롥

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

(6) ƥͥ륪֥Ȥ˴ؤ

ƥॳե졼եˡ֥ȤŪ
APICRE_XXXפޤޤƥͥ륪֥Ȥ˴ؤơ֥
Τ롥

ե졼ϡƱΥ֥ȤŪAPI򽸤ᡤ
֥ȤIDֹդ롥IDֹϡ¾Υ֥ȤIDֹ
ʣʤIDֹ椬Ϣ³褦˳դ롥

ե졼Ф륪ץ--id-input-fileˤˤꡤ
ե졼֥Ȥ˳դIDֹꤹ뤳ȤǤ롥
Ʊΰۤʤ륪֥ȤФƱIDֹꤷꡤե
졼IDֹǤ¤Ϣ³褦˳դȤƤIDֹ椬Ϣ³
ʤˤϡASPͥϡ֥ȤIDֹ椬Ϣ³Ƥ뤳Ȥ
ꤷƼƤˡե졼ϥ顼𤹤롥

ޤե졼Ф륪ץ--id-output-fileˤˤ
ꡤե졼IDֹդ֥Ȥ̾ȳդ
IDֹȤ򡤥ץǻꤷե˽Ϥ롥

ƥͥ륪֥Ȥ˴ؤɸŪʹϡ̤Ǥ롥
֥Ȥˤä㳰ˤϡ֥ι롥

(a) Υ֥IDѿ

Υ֥IDѿ롥Ūˤϡ֥
ȤξάXXXxxxפȤȡΤ褦ʹԤ롥

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

(b) ֥Ȥɬפʥΰ

֥ȤˤäƤϡ֥Ȥɬפʥΰ롥
Ūˤϡ֥ι롥

(c) ֥Ȥν֥å

֥Ȥν֥å롥Ūˤϡ֥
ξάXXXxxxפȤȡΤ褦ʹԤ롥

const XXXINIB _kernel_xxxinib_table[TNUM_XXXID] = {
	<֥ID1Υ֥Ȥν>,
	<֥ID2Υ֥Ȥν>,
				ġ
	<֥IDTNUM_XXXIDΥ֥Ȥν>
};

֥Ȥνηϡ֥˰ۤʤ롥Ūˤϡ
֥ι롥

(d) ֥ȤΥȥ֥å

֥ȤΥȥ֥å롥Ūˤϡ֥
ȤξάXXXxxxפȤȡΤ褦ʹԤ롥

XXXCB _kernel_xxxcb_table[TNUM_XXXID];

(6-1) ˴ؤ

ASPͥϡĤʤбƤʤᡤ˴
ɬʤФʤʤ

ξάϡTSKסtskפǤ롥֥å
ǡTINIBѿ̾_kernel_tinib_tableȥ
åΥǡTCBѿ̾_kernel_tcb_table Ǥʤ
TSKtskפ夨ơTtפѤƤˡ

֥åˤϡCRE_TSKŪAPIǻꤵ˲äơ
DEF_TEXŪAPIǻꤵޤ롥

ʲǤϡƥॳե졼ե˼ŪAPIޤޤ
Ƥ٤ˤĤƽҤ٤롥

CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk });
DEF_TEX(tskid, { texatr, texrtn });

(6-1-1) ɬפʥΰ

ɬפʥΰȤơΥåΰ褬롥stkNULL
ˤϡ륿ˡꤵ줿Υåΰݤ롥
Ūˤϡ嵭ŪAPIФơ롥

stkNULLξΤ
static STK_T _kernel_stack_<̾>[COUNT_STK_T(stksz)];

(6-1-2) ν

֥å륿νϡηȤ롥

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

ǡstkNULLξˤϡ(stksz)夨ROUND_STK_T(stksz)
(stk)夨(_kernel_stack_<̾>)롥CRE_TSKб
DEF_TEXʤˤϡtexatrTA_NULLtexrtnNULLȤ롥

(6-1-3) ơ֥

ФƤϡ줿ʥŪAPIҤ줿
ˤơ֥˽Ϥɬפ롥ϡ줿ǡ
νʤŪˤϡεưˤԤɬפ뤿Ǥ
롥

ŪˤϡΤ褦ʹԤ롥

const ID _kernel_torder_table[TNUM_TSKID] = {
	<ǽ줿ΥID>,
	<2ܤ줿ΥID>,
				ġ
	<Ǹ줿ΥID>
};

(6-1-4) 顼

˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱtskidФCRE_TSKʣE_OBJ
DEF_TEXбCRE_TSKʤE_NOEXS
ƱtskidФDEF_TEXʣE_OBJ

ѥ2ǸФ
tskatrʡTA_ACTϡˤǤʤE_RSATR
	 åȰ¸ǥ°ɲòġTARGET_TSKATR
(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)ǤʤE_PAR
stksz0ʲåκǾ͡TARGET_MIN_STKSZˤ⾮
E_PAR
stkszåΰΥȤʤE_PAR
	- åȰ¸͡CHECK_STKSZ_ALIGNˤܿǤʤ
	 Υ顼åϡstkNULLǤʤˤΤ߹Ԥ
texatrTA_NULLˤǤʤE_RSATR

ѥ3ǸФ
tasktexrtnץγϤȤʤE_PAR
	- åȰ¸͡CHECK_FUNC_ALIGNˤܿǤʤ
	- NULLξʥåȰ¸CHECK_FUNC_NONNULL
stkåΰƬϤȤʤE_PAR
	- åȰ¸͡CHECK_STACK_ALIGNˤܿǤʤ
	- NULLξʥåȰ¸CHECK_STACK_NONNULL

(6-2) ޥե˴ؤ

ޥեξάϡSEMsemפǤ롥ʲǤϡƥॳե졼
ե˼ŪAPIޤޤƤ٤ˤĤƽҤ
롥ʤޥեɬפʥΰϤʤ

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

(6-2-1) ޥեν

ޥե֥å륻ޥեνϡηȤ
롥

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

(6-2-2) 顼

ޥե˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱsemidФCRE_SEMʣE_OBJ

ѥ2ǸФ
sematrʡTA_TPRIϡˤǤʤE_RSATR
(0 <= isemcnt && isemcnt <= maxsem)ǤʤE_PAR
(1 <= maxsem && maxsem <= TMAX_MAXSEM)ǤʤE_PAR

(6-3) ٥ȥե饰˴ؤ

٥ȥե饰ξάϡFLGflgפǤ롥ʲǤϡƥॳե
졼ե˼ŪAPIޤޤƤ٤ˤ
ƽҤ٤롥ʤ٥ȥե饰ɬפʥΰϤʤ

CRE_FLG(flgid, { flgatr, iflgptn });

(6-3-1) ٥ȥե饰ν

٥ȥե饰֥å륤٥ȥե饰νϡ
ηȤ롥

	{ (flgatr), (iflgptn) }

(6-3-2) 顼

٥ȥե饰˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱflgidФCRE_FLGʣE_OBJ

ѥ1ǸФ
iflgptnFLGPTN˳ǼǤʤE_PAR
	 iflgptnuint32_t˳ǼǤʤϡcfg1_out.cΥѥ
	   ˥顼Ȥʤ롥

ѥ2ǸФ
flgatrʡTA_TPRIϡáTA_WMULϡáTA_CLRϡˤǤʤE_RSATR
iflgptnFLGPTN˳ǼǤʤE_PAR
	 iflgptnuint32_tˤϳǼǤ뤬FLGPTN˳ǼǤʤϡ
	   ѥ2ǥ顼򸡽Ф롥

(6-4) ǡ塼˴ؤ

ǡ塼ξάϡDTQdtqפǤ롥ʲǤϡƥॳե
졼ե˼ŪAPIޤޤƤ٤ˤĤ
Ҥ٤롥

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

(6-4-1) ǡ塼ɬפʥΰ

ǡ塼ɬפʥΰȤơǡ塼ΰ褬롥
ǡ塼ˡɬפʥΥǡ塼ΰ롥
Ūˤϡ嵭ŪAPIФơ롥

dtqcnt0ǤʤΤ
static DTQMB _kernel_dtqmb_<ǡ塼̾>[dtqcnt];

(6-4-2) ǡ塼ν

ǡ塼֥åǡ塼νϡ
Ȥ롥

	{ (dtqatr), (dtqcnt), (_kernel_dtqmb_<ǡ塼̾>) }

ǡdtqcnt0ξˤϡ_kernel_dtqmb_<ǡ塼̾>夨ơ
NULLѤ롥

(6-4-3) 顼

ǡ塼˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱdtqidФCRE_DTQʣE_OBJ

ѥ2ǸФ
dtqatrʡTA_TPRIϡˤǤʤE_RSATR
dtqcntͤξE_PAR
dtqmbNULLǤʤE_NOSPT

(6-5) ͥ٥ǡ塼˴ؤ

ͥ٥ǡ塼ξάϡPDQpdqפǤ롥ʲǤϡƥॳ
ե졼ե˼ŪAPIޤޤƤ٤
ˤĤƽҤ٤롥

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

(6-5-1) ͥ٥ǡ塼ɬפʥΰ

ͥ٥ǡ塼ɬפʥΰȤơͥ٥ǡ塼ΰ
롥ͥ٥ǡ塼ˡɬפʥͥ٥ǡ塼
ΰ롥Ūˤϡ嵭ŪAPIФơ
롥

pdqcnt0ǤʤΤ
static PDQMB _kernel_pdqmb_<ͥ٥ǡ塼̾>[pdqcnt];

(6-5-2) ͥ٥ǡ塼ν

ͥ٥ǡ塼֥åͥ٥ǡ塼ν
ϡηȤ롥

	{ (pdqatr), (pdqcnt), (maxdpri), (_kernel_pdqmb_<ͥ٥ǡ塼̾>) }

ǡpdqcnt0ξˤϡ_kernel_pdqmb_<ͥ٥ǡ塼̾>夨
ơNULLѤ롥

(6-5-3) 顼

ͥ٥ǡ塼˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱpdqidФCRE_PDQʣE_OBJ

ѥ2ǸФ
pdqatrʡTA_TPRIϡˤǤʤE_RSATR
pdqcntͤξE_PAR
(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)ǤʤE_PAR
pdqmbNULLǤʤE_NOSPT

(6-6) ᡼ܥå˴ؤ

᡼ܥåξάϡMBXmbxפǤ롥ʲǤϡƥॳե
졼ե˼ŪAPIޤޤƤ٤ˤ
ƽҤ٤롥ʤ᡼ܥåɬפʥΰϤʤ

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

(6-6-1) ᡼ܥåν

᡼ܥå֥å᡼ܥåνϡ
ηȤ롥

	{ (mbxatr), (maxmpri) }

(6-6-2) 顼

᡼ܥå˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱmbxidФCRE_MBXʣE_OBJ

ѥ2ǸФ
mbxatrʡTA_TPRIϡáTA_MPRIϡˤǤʤE_RSATR
(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)ǤʤE_PAR
mprihdNULLǤʤE_NOSPT

(6-7) Ĺס˴ؤ

ĹסξάϡMPFmpfפǤ롥ʲǤϡƥॳ
ե졼ե˼ŪAPIޤޤƤ٤
ˤĤƽҤ٤롥

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

(6-7-1) Ĺסɬפʥΰ

ĹסɬפʥΰȤơĹסΰȸ
Ĺסΰ褬롥Ĺסˡɬפ
θĹסΰmpfNULLξΤߡˤȸĹס
ΰݤ롥Ūˤϡ嵭ŪAPIФơ
롥

mpfNULLξΤ
static MPF_T _kernel_mpf_<Ĺס̾>[(blkcnt) * COUNT_MPF_T(blksz)];
								
ɬ
static MPFMB _kernel_mpfmb_<Ĺס̾>[blkcnt];

(6-7-2) Ĺסν

Ĺס֥åĹסν
ϡηȤ롥

	{ (mpfatr), (blkcnt), ROUND_MPF_T(blksz), mpf,
						(_kernel_mpfmb_<Ĺס̾>) }

ǡmpfNULLξˤϡmpf夨ơ_kernel_mpf_<Ĺס
̾>Ѥ롥

(6-7-3) 顼

Ĺס˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱmpfidФCRE_MPFʣE_OBJ

ѥ2ǸФ
mpfatrʡTA_TPRIϡˤǤʤE_RSATR
blkcnt0ʲξE_PAR
blksz0ʲξE_PAR
mpfmbNULLǤʤE_NOSPT

ѥ3ǸФ
mpfĹסΰƬϤȤʤE_PAR
	- åȰ¸͡CHECK_MPF_ALIGNˤܿǤʤ
	- NULLξʥåȰ¸CHECK_MPF_NONNULL

(6-8) ϥɥ˴ؤ

ϥɥξάϡCYCcycפǤ롥ʲǤϡƥॳե
졼ե˼ŪAPIޤޤƤ٤ˤ
ƽҤ٤롥ʤϥɥɬפʥΰϤʤ

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

(6-8-1) ϥɥν

ϥɥ֥åϥɥνϡ
Ȥ롥

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

(6-8-2) 顼

ϥɥ˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱcycidФCRE_CYCʣE_OBJ

ѥ2ǸФ
cycatrʡTA_STAϡˤǤʤE_RSATR
(0 < cyctim && cyctim <= TMAX_RELTIM)ǤʤE_PAR
(0 <= cycphs && cycphs <= TMAX_RELTIM)ǤʤE_PAR
ٹcycatrTA_STAꤵƤơ(cycphs == 0)ξ

ѥ3ǸФ
cychdrץγϤȤʤE_PAR
	- åȰ¸͡CHECK_FUNC_ALIGNˤܿǤʤ
	- NULLξʥåȰ¸CHECK_FUNC_NONNULL

(6-9) 顼ϥɥ˴ؤ

顼ϥɥξάϡALMalmפǤ롥ʲǤϡƥॳ
ե졼ե˼ŪAPIޤޤƤ٤
ˤĤƽҤ٤롥ʤ顼ϥɥɬפʥΰϤʤ

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

(6-9-1) 顼ϥɥν

顼ϥɥ֥å륢顼ϥɥν
ϡηȤ롥

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

(6-9-2) 顼

顼ϥɥ˴ؤ륨顼ϼ̤Ǥ롥

ե졼ΤФ
ƱalmidФCRE_ALMʣE_OBJ

ѥ2ǸФ
almatrTA_NULLˤǤʤE_RSATR

ѥ3ǸФ
almhdrץγϤȤʤE_PAR
	- åȰ¸͡CHECK_FUNC_ALIGNˤܿǤʤ
	- NULLξʥåȰ¸CHECK_FUNC_NONNULL

(7) ߤ˴ؤ

ߤ˴ؤϡå뤳ȤǤ롥
ʤˤϡʲǽҤ٤륿åȤ˰¸ʤɸŪʾ
롥åˤϡ(7-1)(7-3)˽Ҥ٤
ʤ(7-2)˽Ҥ٤ˡ

(7-1) ׵饤˴ؤ

׵饤°ꤹŪAPICFG_INTפꤷ׵
饤˴ؤ롥Ūˤϼ̤ꡥ

ʲǤϡƥॳե졼ե˼ŪAPIޤޤ
Ƥ٤ˤĤƽҤ٤롥

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

(7-1-1) ꤹ׵饤ο

ꤹ׵饤οޥץץåǥ쥯ƥ
֡#defineˤ롥ޤͤѿ롥Ū
ˤϡΤ褦ʹԤ롥

#define TNUM_INTNO <ꤹ׵饤ο>
const uint_t	_kernel_tnum_intno = TNUM_INTNO;

(7-1-2) ׵饤֥å

׵饤֥å롥ŪˤϡΤ褦ʹԤ
롥

const INTINIB _kernel_intinib_table[TNUM_INTNO] = {
	<׵饤1ν>,
	<׵饤2ν>,
				ġ
	<׵饤TNUM_INTNOν>
};

γ׵饤νϡηȤ롥

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

(7-1-3) 顼

׵饤˴ؤ륨顼ϼ̤Ǥ롥

ѥ2ǸФ
intnoCFG_INTФֹȤʤE_PAR
intnoCFG_INTˤäѤߤξE_OBJ
intatrʡTA_ENAINTϡáTA_EDGEϡˤǤʤE_RSATR
	 åȰ¸ǳ°ɲòġTARGET_INTATR
ͥ˸ꤵƤintnoФơintpriTMIN_INTPRI
ͤꤵ줿E_OBJ
ͥ˸ꤵƤintnoФơintpriTMIN_INTPRI
⾮ͤꤵʤäE_OBJ
intpriCFG_INTФͥ٤ȤʤE_PAR

ɬפ˱ƥåȰ¸ǸФ
intatr°ȤǤʤͤξE_RSATR
intpriͥ٤ȤǤʤͤξE_PAR
Ʊγͥ٤Ǥʤ׵饤Фơۤʤ
ͥ٤ꤷE_PAR

(7-2) ߥӥ롼˴ؤ

(7-2-1) ߥϥɥ

ƥॳե졼ե˴ޤޤߥӥ롼
ɲäŪAPIATT_ISRפФơƱγֹФɲä
줿ߥӥ롼˸ƤӽФؿ롥

ŪˤϡƱγֹФƳߥӥ롼ɲä

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

ȤŪAPIФơΤ褦ʴؿ롥ǡisrpri_1
isrpri_2ġġisrpri_nϡͤξ¤ؤƤΤȤ롥
ͤƱΤδ֤Ǥϡƥॳե졼եǤŪ
APIν̤¤ǤΤȤ롥

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

	i_begin_int(intno);
	saved_ipm = i_get_ipm();

	LOG_ISR_ENTER(<intno>);		/* ISR1θƽФ */
	isr_1((intptr_t)(exinf_1));
	LOG_ISR_LEAVE(intno);

	if (i_sense_lock()) {		/* ISRθƽФξ֤᤹ */
		i_unlock_cpu();
	}
	i_set_ipm(saved_ipm);

	LOG_ISR_ENTER(<intno>);		/* ISR2θƽФ */
	isr_2((intptr_t)(exinf_2));
	LOG_ISR_LEAVE(intno);

	if (i_sense_lock()) {		/* ISRθƽФξ֤᤹ */
		i_unlock_cpu();
	}
	i_set_ipm(saved_ipm);

	ġ

	LOG_ISR_ENTER(<intno>);		/* ISRnθƽФ */
	isr_n((intptr_t)(exinf_n));
	LOG_ISR_LEAVE(intno);

	i_end_int(intno);
}

ǡISRnθƽФθ˸ƽФξ֤ᤵʤΤϡߥϥɥ
Υ꥿ˤꡤͥ뤬ξ֤᤹Ǥ롥

ƱγֹФɲä줿ߥӥ롼1ĤΤߤξ
ˤϡΤ褦ʴؿ롥

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);
}

ڲۤǡLOG_ISR_ENTERLOG_ISR_LEAVEΰɤ뤫
ƻĤäƤ롥ATT_ISRϿ줿ISRФƤISR IDͿʤ
ᡤIDISR̤뤳ȤǤʤʤֹϤƤ뤬
ĥexinfˤϤ٤⤷ʤ

(7-2-2) ߥϥɥ

Τ褦˳ߥϥɥˤϡߥϥɥ
˴ؤˤơƥॳե졼ե˼
ŪAPIޤޤƤΤƱͤ˽롥

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

inhnoϡintnoбߥϥɥֹǤ롥

(7-2-3) 顼

ߥӥ롼˴ؤ륨顼ϼ̤Ǥ롥

ѥ2ǸФ
isratrTA_NULLˤǤʤE_RSATR
	 åȰ¸ǳߥӥ롼°ɲòġTARGET_ISRATR
intnoATT_ISRФֹȤʤE_PAR
	 intnoбinhnoʤޤ
(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)ǤʤE_PAR
intnoбinhnoФDEF_INHE_OBJ
intnoФCFG_INTʤE_OBJ
intnoФCFG_INTꤵ줿ͥ٤TMIN_INTPRI⾮
E_OBJ
	 ͥISRϥݡȤʤ

ǽǤХåȰ¸ǸФ
isrץγϤȤʤE_PAR

(7-3) ߥϥɥ˴ؤ

ߥϥɥŪAPIDEF_INHפߥϥɥʾ
Ҥγߥӥ롼ɲäˤꥳե졼
ߥϥɥޤˤ˴ؤ롥Ūˤϼ̤ꡥ

ʲǤϡƥॳե졼ե˼ŪAPIޤޤ
Ƥ٤ˤĤƽҤ٤롥

DEF_INH(inhno, { inhatr, inthdr });

(7-3-1) ߥϥɥο

ߥϥɥοޥץץåǥ쥯ƥ
#defineˤ롥ޤͤѿ롥Ū
ˤϡΤ褦ʹԤ롥

#define TNUM_INHNO <ߥϥɥο>
const uint_t	_kernel_tnum_inhno = TNUM_INHNO;

(7-3-2) ߥϥɥν

ߥϥɥˡߥϥɥν롼
롥ŪˤϡΤ褦ʹԤ롥

INTHDR_ENTRY(inhno, inhno_num, inthdr)

inhno_numϡinhnoʳߥϥɥֹˤͤɽΤǡ
֥쵭Ҥ˻Ѥ뤿ΤΤǤ롥

(7-3-3) ߥϥɥ֥å

ߥϥɥ֥å롥ŪˤϡΤ褦ʹԤ
롥

const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {
	<ߥϥɥ1ν>,
	<ߥϥɥ2ν>,
				ġ
	<ߥϥɥTNUM_INHNOν>
};

γߥϥɥνϡηȤ롥

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

(7-3-4) 顼

ߥϥɥ˴ؤ륨顼ϼ̤Ǥ롥

ѥ2ǸФ
inhnoDEF_INHФߥϥɥֹȤʤE_PAR
inhnoDEF_INHˤäѤߤξE_OBJ
#inhnoбintnoФATT_ISRE_OBJ
#	 inhnoбintnoʤˤϡΥåԤʤ
#	 Υåϡߥӥ롼¦ǹԤ
inhatrTA_NULLˤǤʤE_RSATR
	 åȰ¸ǳߥϥɥ°ɲòġTARGET_INHATR
	 TA_NONKERNELȤˤϡTARGET_INHATRꤹ
ͥ˸ꤵƤinhnoФơinhatrTA_NONKERNEL
ƤE_RSATR
ͥ˸ꤵƤinhnoФơinhatrTA_NONKERNEL
ꤵƤʤE_RSATR
inhnoбintnoФCFG_INTʤE_OBJ
	 inhnoбintnoʤˤϡΥåԤʤ
inhatrTA_NONKERNELꤵƤ餺inhnoбintnoФ
CFG_INTꤵ줿ͥ٤TMIN_INTPRI⾮E_OBJ
	 inhnoбintnoʤˤϡΥåԤʤ
inhatrTA_NONKERNELꤵƤꡤinhnoбintnoФ
CFG_INTꤵ줿ͥ٤TMIN_INTPRIʾǤE_OBJ
	 inhnoбintnoʤˤϡΥåԤʤ

ǽǤХåȰ¸ǸФ
inthdrץγϤȤʤE_PAR

(8) CPU㳰˴ؤ

CPU㳰˴ؤϡå뤳ȤǤ롥
ʤˤϡʲǽҤ٤륿åȤ˰¸ʤɸŪʾ
롥åˤϡξʤ

ƥॳե졼եˡCPU㳰ϥɥ
ŪAPIDEF_EXCפޤޤƤˡCPU㳰ϥɥ˴ؤ
롥

ʲǤϡƥॳե졼ե˼ŪAPIޤޤ
Ƥ٤ˤĤƽҤ٤롥

DEF_EXC(excno, { excatr, exchdr });

(8-1) CPU㳰ϥɥο

CPU㳰ϥɥοޥץץåǥ쥯ƥ
֡#defineˤ롥ޤͤѿ롥
ŪˤϡΤ褦ʹԤ롥

#define TNUM_EXCNO <CPU㳰ϥɥο>
const uint_t	_kernel_tnum_excno = TNUM_EXCNO;

(8-2) CPU㳰ϥɥν

CPU㳰ϥɥˡCPU㳰ϥɥν롼
롥ŪˤϡΤ褦ʹԤ롥

EXCHDR_ENTRY(excno, excno_num, exchdr)

excno_numϡexcnoCPU㳰ϥɥֹˤͤɽΤǡ
֥쵭Ҥ˻Ѥ뤿ΤΤǤ롥

(8-3) CPU㳰ϥɥ֥å

CPU㳰ϥɥ֥å롥ŪˤϡΤ褦ʹԤ
롥

const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {
	<CPU㳰ϥɥ1ν>,
	<CPU㳰ϥɥ2ν>,
				ġ
	<CPU㳰ϥɥTNUM_EXCNOν>
};

CPU㳰ϥɥνϡηȤ롥

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

(8-4) 顼

CPU㳰ϥɥ˴ؤ륨顼ϼ̤Ǥ롥

ѥ2ǸФ
excnoDEF_EXCФCPU㳰ϥɥֹȤʤE_PAR
excnoDEF_EXCˤäѤߤξE_OBJ
excatrTA_NULLˤǤʤE_RSATR
	 åȰ¸CPU㳰ϥɥ°ɲòġTARGET_EXCATR

ǽǤХåȰ¸ǸФ
exchdrץγϤȤʤE_PAR

(9) 󥿥ƥѤΥåΰ˴ؤ

󥿥ƥѤΥåΰ˴ؤϡɬʤ
ʤʤ

(9-1) DEF_ICSʤ

ƥॳե졼եˡŪAPIDEF_ICSפޤޤ
ʤˤϡιԤ롥

#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 */

(9-2) DEF_ICS

ʲǤϡƥॳե졼ե˼ŪAPIޤޤ
٤ˤĤƽҤ٤롥

DEF_ICS({ istksz, istk });

istkNULLξˤϡꤵ줿󥿥ƥѤΥ
ΰݤ󥿥ƥѤΥåΰν
롥Ūˤϡ嵭ŪAPIФơιԤ롥

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

istkNULLǤʤˤϡ󥿥ƥѤΥåΰν
򡤼η롥

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

(9-3) ѿ

DEF_ICS̵ͭˤ餺롥

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 */

(9-4) 顼

󥿥ƥѤΥåΰ˴ؤ륨顼ϼ̤Ǥ롥

ѥ2ǸФ
ŪAPIDEF_ICSפʣE_OBJ
istksz0ʲåκǾ͡TARGET_MIN_ISTKSZˤ⾮
E_PAR
istkszåΰΥȤʤE_PAR
	- åȰ¸͡CHECK_STKSZ_ALIGNˤܿǤʤ
	 Υ顼åϡistkNULLǤʤˤΤ߹Ԥ

ѥ3ǸФ
istkåΰƬϤȤʤE_PAR
	- åȰ¸͡CHECK_STACK_ALIGNˤܿǤʤ
	- NULLξʥåȰ¸CHECK_STACK_NONNULL

(10) ।٥ȴ˴ؤ

।٥ȴ˴Ϣơ롥

TMEVTN	_kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];

(11) ƥ⥸塼νؿ

ƥͥ륪֥ȤδߴCPU㳰ϥɥγƵǽ
ؿ˸ƤӽФؿ_kernel_initialize_objectˤ롥
3ĤνؿƤϡѤʤǽνؿϸƤӽФʤ

	_kernel_initialize_task
	_kernel_initialize_interrupt
	_kernel_initialize_exception

٤ƤεǽȤäؿϼ̤Ǥ롥

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();
}

(12) 롼μ¹Դؿ

ƥॳե졼ե˴ޤޤ롼ɲ
ŪAPIATT_INIפФơɲä롼˸ƤӽФ
롥Ūˤϡ

ATT_INI({ iniatr, exinf, inirtn });

ȤŪAPIФơ

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

ƤӽФؿ_kernel_call_inirtnȤ̾롥롼
ƤӽФϡƥॳե졼եǤŪ
APIν˰פ롥

㤨С

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

Ȥ2ĤŪAPIνǵҤ줿ؿϼ̤Ǥ
롥

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

(12-1) 顼

롼˴ؤ륨顼ϼ̤Ǥ롥

ѥ2ǸФ
iniatrTA_NULLˤǤʤE_RSATR

ǽǤХåȰ¸ǸФ
inirtnץγϤȤʤE_PAR

(13) λ롼μ¹Դؿ

ƥॳե졼ե˴ޤޤ뽪λ롼
äŪAPIATT_TERפФơɲäλ롼˸Ƥӽ
ؿ롥Ūˤϡ

ATT_TER({ teratr, exinf, terrtn });

ȤŪAPIФơ

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

ƤӽФؿ_kernel_call_terrtnȤ̾롥λ롼
ƤӽФϡƥॳե졼եǤŪ
APIεս˰פ롥

㤨С

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

Ȥ2ĤŪAPIνǵҤ줿ؿϼ̤Ǥ
롥

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

(13-1) 顼

λ롼˴ؤ륨顼ϼ̤Ǥ롥

ѥ2ǸФ
teratrTA_NULLˤǤʤE_RSATR

ǽǤХåȰ¸ǸФ
terrtnץγϤȤʤE_PAR

ʾ
