
        JSPJ[l ^[Qbgˑ |[eBOKCh 

             iRelease 1.4ΉCŏIXV: 1-Jul-2003j

------------------------------------------------------------------------ 
 TOPPERS/JSP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile Kernel

 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN

 L쌠҂́Cȉ (1)`(4) ̏CFree Software Foundation 
 ɂČ\Ă GNU General Public License  Version 2 ɋL
 qĂ𖞂ꍇɌC{\tgEFAi{\tgEFA
 ς̂܂ށDȉjgpEEρEĔzziȉC
 pƌĂԁ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

 {\tgEFÁCۏ؂Œ񋟂Ă̂łDL쌠҂
 TOPPERSvWFNǵC{\tgEFAɊւāC̓Kp\
 ܂߂āCȂۏ؂sȂD܂C{\tgEFA̗pɂ蒼
 ړI܂͊ԐړIɐȂ鑹QɊւĂC̐ӔC𕉂ȂD

 @(#) $Id: /local/fi4-1.4/toppers/RELEASE_20061105_1/doc/fi4_config.txt 2750 2006-03-07T16:15:24.532712Z monaka  $
------------------------------------------------------------------------


̃hLgł́CJSPJ[l̃^[QbgˑŒ񋟂ׂf[^
^֐ȂǂɂĉD

JSPJ[l̃^[Qbgˑ́Cˑ̍ėplCvZbT
ˑCVXeˑCJˑɕĂDJˑ
ւẮC悻̖S܂Ă邪CvZbTˑƃVXe
ˑɂẮCSmȂ킯ł͂ȂDȉ̃f[^^֐
̑́Cǂ̈ˑŒ`Ă܂ȂDV~[VȂǂ
ɒ[ȃP[Xł́CVXeˑSgȂƂlD


PDVXe\z

JSPJ[ĺCGNUJWƂĂCRtBM[^Jx
[eBeB́CGNUJƑgݍ킹ē삷悤Ɏ
ĂDňȉł́CGNUJpꍇ𒆐SɐD
ȊO̊Jpꍇɂ́CJx[eBeB̉Kv
ȂCꕔ̃[eBeBgpłȂP[XD

(1) ^[Qbĝ̌

V^[Qbgˑ쐬鎞́CvZbT̂ƃVXê
߂D܂CGNUȊO̊Jpꍇɂ́CJ̂߂D
̗̂ɗp镶́CpC "_" Ɍ肷D

(2) ^[Qbgˑ̃t@Cu߂̃fBNg

^[Qbgˑ̃t@Cu߂̃fBNgCconfig ̉ɍ
DfBNǵC^[Qbĝȉ̂悤Ɍ肷D
CfBNgɊ܂܂pׂ͂ďƂDȂ킿CfB
Ngɂ́CpC "_" ݂̂gƂłD

GNUJpꍇɂ́Cconfig ̉ɃvZbT̂păvZb
Tˑ̃t@Cu߂̃fBNgivZbTˑfBNg
jCɂ̉ɃVXêpăVXeˑ̃t@Cu
߂̃fBNgiVXeˑfBNgj쐬D

GNUȊO̊Jpꍇɂ́Cconfig ̉ɃvZbT̂ƊJ
̂ "-" ŘÁiႦ΁C"sh3-hitachi"jŁCvZbTˑ
fBNg쐬Dɂ̉ɁCVXêpăVXe
ˑfBNg쐬D̃fBNgɂ́CGNUJp
̃fBNgɒuĂt@CƈقȂt@Ĉ݂uDt@C
uĂȂꍇɂ́CGNUJp̃fBNgQƂD
CMakefile.config ɊւẮCGNUJp̃fBNgQƂ
Ȃ߁CełĂpӂȂ΂ȂȂD

(3) VXe\z@̐ݒ

vZbTˑfBNgуVXeˑfBNg̉ɁC
ꂼCVXe\z@ݒ肷邽߂ Makefile.config t@Cp
ӂD̃t@ĆCMakefile CN[hD

vZbTˑуVXeˑ Makefile.config Œ`ׂ
ɂ́CJ̃R}hݒ肷́CRpCIvVݒ
́C̑̂̂Dł́C̑̕ϐƂ̒`̕@
ĐD

(3-1) TEXT_START_ADDRESS	eLXgZNV̐擪Ԓn
(3-2) DATA_START_ADDRESS	f[^ZNV̐擪Ԓn

eZNV̐擪Ԓn̎w肪Kvȏꍇɂ́C̕ϐɐ擪Ԓn
`D

(3-3) LDSCRIPT			JXNvg̃t@C

p̃JXNvgpꍇɂ́C̕ϐɃJXNvg̃t@
C`Dt@ĆCconfig fBNg̑΃pXŎw
肷D

(4) J̃R}h̐ݒ

(4-1) TARGET		^[Qbg

GNUJ configure ꍇɎw肷^[QbgŁCRpC
̃R}h̐擪ɕt^镶iŌ "-" ͕svjɒ`D
Ⴆ΁CTARGET  m68k-unknown-elf ɒ`ꂽꍇɂ́CRpC
 m68k-unknown-elf-gcc gD̕ϐ`Ȃꍇɂ́C
PȂ gcc gDGNUȊO̊Jpꍇɂ́C`Kv
ȂD

(4-2) CC		RpChCo̖
(4-3) AR		A[JCo̖

GNUȊO̊JpꍇɁCꂼ̃R}ĥ̖ɒ`D
GNUJł́C̑ AS, LD, NM, RANLIB, OBJCOPY, OBJDUMP `
Ă邪CȊO̊Jł͒`ȂĂ悢D

(5) RpCIvV̐ݒ

(5-1) CDEFS		}N`IvVi-Dj
(5-2) INCLUDES		CN[ht@C̃fBNgwIvVi-Ij
(5-3) COPTS		RpCɑ΂邻̑̃IvV
(5-4) LDFLAGS		Jɑ΂IvV
(5-5) LIBS		CuNŵ߂̃IvV

^[QbgɈˑāCׂẴ\[Xt@CɋʂRpCIvV
̒ǉKvȏꍇɂ́CIvV̎ޖɏɎϐɒ`D

VXeˑ Makefile.config ł̕ϐ`鎞́C":=" 
pāC܂ł̒`ɒǉ`ōsDႦ΁CvZbTˑ 
u-Wall -g -O2 -m68020-40vƂIvVǉꍇɂ́Cȉ
̋LqvZbTˑ Makefile.config Ɋ܂߂D

    COPTS := $(COPTS) -Wall -g -O2 -m68020-40

ɑ΂āCVXeˑ Makefile.config  Makefile ̍ŏŃC
N[h邽߁Ĉ悤Ȕz͕KvȂCύXɋ邽߂
lɈƂɂD

قƂǂ̏ꍇɁCvZbTˑ Makefile.config ɂ͈ȉ̋Lq
܂߂KvD

    GNUJpꍇ
	INCLUDES := -I$(SRCDIR)/config/$(CPU)

    ̑̊Jpꍇ
	INCLUDES := -I$(SRCDIR)/config/$(CPU)-$(TOOL) -I$(SRCDIR)/config/$(CPU)

܂CVXeˑ Makefile.config ɂ͈ȉ̋Lq܂߂Kv
D

    GNUJpꍇ
	INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)/$(SYS)

    ̑̊Jpꍇ
	INCLUDES := $(INCLUDES) -I$(SRCDIR)/config/$(CPU)-$(TOOL)/$(SYS) \
				-I$(SRCDIR)/config/$(CPU)/$(SYS)

܂CAZuꃌx̎ʖCCꃌx̎ʖ̐擪 "_" 
t̂ɂȂꍇɂ́Cꂩ Makefile.config  CDEFS  
-DLABEL_ASM ǉD

(5-6) STASK_DIR		VXeT[rX̃\[XuꂽfBNg
(5-7) STASK_ASMOBJS	AZuŋLqꂽVXeT[rX̃IuWFNg
(5-8) STASK_COBJS	CŋLqꂽVXeT[rX̃IuWFNg
(5-9) STASK_CFLAGS	VXeT[rXɑ΂RpCIvV
(5-10) STASK_LIBS	VXeT[rXɑ΂郉CuNw

VXeT[rXiVXeO^XNfoCXhCoȂǁj̃\[X
uꂽfBNgC\IuWFNgt@C̃XgC
RpCۂɓKpRpCIvVC̍\ɕKvȃ
CuNwsꍇɂ́CɎϐɒ`D

VXeˑ Makefile.config ł̕ϐ`鎞́CCDEFS 
ȂǂƓl̈KvłD

(5-11) KERNEL_DIR	J[l̃\[XuꂽfBNg
(5-12) KERNEL_ASMOBJS	AZuŋLqꂽJ[l̃IuWFNg
(5-13) KERNEL_COBJS	CŋLqꂽJ[l̃IuWFNg
(5-14) KERNEL_CFLAGS	J[lɑ΂RpCIvV

J[l̃\[XuꂽfBNgC\IuWFNgt@
C̃XgCRpCۂɓKpRpCIvV
w肷ꍇɂ́CɎϐɒ`D

VXeˑ Makefile.config ł̕ϐ`鎞́CCDEFS 
ȂǂƓl̈KvłD

قƂǂ̏ꍇɁCvZbTˑ Makefile.config ɂ͈ȉ̋Lq
܂߂KvD

    GNUJpꍇ
	KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)
	KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) cpu_support.o
	KERNEL_COBJS := $(KERNEL_COBJS) cpu_config.o

    ̑̊Jpꍇ
	KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)-$(TOOL)
	KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)
	KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) cpu_support.o
	KERNEL_COBJS := $(KERNEL_COBJS) cpu_config.o

܂CVXeˑfBNg Makefile.config ɂ͈ȉ̋Lq
߂KvD

    GNUJpꍇ
	KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS)
	KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) sys_support.o
	KERNEL_COBJS := $(KERNEL_COBJS) sys_config.o

    ̑̊Jpꍇ
	KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)-$(TOOL)/$(SYS)
	KERNEL_DIR := $(KERNEL_DIR):$(SRCDIR)/config/$(CPU)/$(SYS)
	KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) sys_support.o
	KERNEL_COBJS := $(KERNEL_COBJS) sys_config.o

(6) ItZbgt@C̐

AZuŋLqvOCC̍\̂ɃANZX
ꍇɂ́C\̂̊etB[h̃ItZbgQƂ邱ƂKvłD 
JSPJ[lł́CKvȃItZbglt@CiWł offset.hjɏo
͂邽߂̎dg݂ƂāCmakeoffset.c  genoffset pӂĂD
makeoffset.c ́Cǂ̃ItZbglt@Cɏo͂邩w肷
ŁC^[QbgˑŗpӂKvDgenoffset ́C_łGNU
Jɂ̂ݑΉĂD

makeoffset.c  genoffset gƂŁCႦ΁CTCB  texptn tB[
h̃ItZbgl TCB_texptn Ƀ}N`邱ƂCTCB ̃^XN
ReLXgubNitskctxbjɊ܂܂ pc tB[h̃ItZbgl
 TCB_pc Ƀ}N`邱ƂłD܂CTCB  enatex tB[
h̃ItZbglCrbgʒuCrbg}XNCꂼ TCB_enatexC
TCB_enatex_bitCTCB_enatex_mask Ƀ}N`邱ƂłD}N
`rbgʒurbg}XŃCANZXTCYGfBAw
肷邱ƂłD

GNUJȊOpꍇȂǁC̎dg݂ŃItZbgt@C𐶐
łȂɂ́Coffset.h ^[QbgˑŗpӂCMakefile.config 
 OMIT_MAKEOFFSET kXgOȊOɒ`D

makeoffset.c  genoffset Ɋւ}jÁC_ł͗pӂłĂ
ȂDg킩ȂꍇC@\Ȃꍇɂ́CkꂽD

(7) X^[gAbvW[Ȃ

^[QbgɂẮC[hW[̐擪ƍŌɃNׂvO
C^[QbgˑŗpӂKvD̏ꍇCX^[gAb
vW[[hW[̐擪ɃNKvD

[hW[̐擪ɃNׂvOꍇɂ́C
Makefile.config ɂāC̃IuWFNgt@C START_OBJS ɒ
`Cɑ΂RpC[ƈˑ֌W쐬[`Ȃ
ȂȂD[hW[̍ŌɃNׂvOꍇɂ́C
̃IuWFNgt@C END_OBJS ɒ`Cɑ΂RpC
[ƈˑ֌W쐬[`Ȃ΂ȂȂD

Ⴆ΁CX^[gAbvW[̃\[Xt@C start.S ̏ꍇɂ́C
Makefile.config Ɏ̂悤ȋLqƂ悢D

	# X^[gAbvW[̃IuWFNgt@C
	START_OBJS = start.o

	# X^[gAbvW[̃RpC[
	$(START_OBJS): %.o: %.S
		$(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<

	# X^[gAbvW[̈ˑ֌W쐬[
	$(START_OBJS:.o=.d): %.d: %.S
		@$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \
			-O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend

܂CRpCɕW crtbegin.o  crtend.o pꍇɂ́C
Makefile.config Ɏ̂悤ȋLqƂ悢D

	# IuWFNgt@C
	START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o)
	END_OBJS = $(shell $(CC) -print-file-name=crtend.o)

	# ˑ֌W쐬[
	$(START_OBJS:.o=.d): %.d:
	$(END_OBJS:.o=.d): %.d:

̏ꍇC̃t@CRpC邱Ƃ͂Ȃ߁CRpC[
͕svłD܂Cˑ֌W쐬[̓_~[ł悢iˑ֌W쐬[
ȂƃG[ɂȂjD

ȂCJ[lp̃X^[gAbvW[́Cmain ֐ł͂ȂC
kernel_start ֐NKvD

(8) JXNvg

JɕW̃JXNvggpłȂꍇɂ́C^[Qbgˑ
ŗpӂD


QDAvP[Vp̃CN[ht@C

^[QbgˑŒ񋟂ׂAvP[Vp̒`͎̒ʂłD
̒`̒ŁC(1)  (2)  tool_defs.h Ɋ܂߂Ȃ΂Ȃ
D̑̒`́Ccpu_defs.h ܂ sys_defs.hi܂͂炩C
N[ht@CjɊ܂߂D

(1) RpCˑ̃f[^^̒`

eTCY̐^Cȉ̃V{Ƀ}N`D̒`́C
typedef ł͂ȂC#define ɂ}N`Ȃ΂ȂȂD

(1-1) _int8_		8rbg̐^
(1-2) _int16_		16rbg̐^
(1-3) _int32_		32rbg̐^
(1-4) _int64_		64rbg̐^

̒ŁC_int32_ ȊÓCRpCT|[gĂȂꍇɂ͒
`KvȂD_int32_ ̒`͕K{łD

(1-5) _intptr_		|C^i[ł鐮^

_intptr_ ́CtH[}bgo͂ɂāCint^|C^^i[ł鐮
^ƂĎgpD`ȂꍇClong gD

(2) RpC̊g@\̂߂̃}N`

(2-1) inline		CCw
(2-2) Inline		t@Ĉ݂ɗLȃCCw
(2-3) asm		CCAZuiœKj
(2-4) Asm		CCAZuiœK}~j

̒ŁCasm  Asm ́C^[QbgˑŗpĂȂΒ`
KvȂD

(3) ^CeBbN̒`

(3-1) TIC_NUME		^CeBbN̎̕qiP: 1~bj
(3-2) TIC_DENO		^CeBbN̎̕iP: 1~bj

(4) ݃nh^CPUOnh֘A̒`

(4-1) INHNO		݃nhԍ̃f[^^
(4-2) EXCNO		CPUOnhԍ̃f[^^

(5) ݃}XNƊ݃}XN̕ύX^QƊ֘A̒`iIvVj

chg_ixxCget_ixx ^[QbgˑɃT|[gꍇɂ́Cȉ̒`
ѐ錾^[QbgˑŒ񋟂DxxCxxxxCXXXX ́C^[Qbg
ɓK؂ȕɒ߂Dxxxx  XXXX ́C4łȂĂ悢D

(5-1) IXXXX				݃}XÑf[^^
(5-2) ER chg_ixx(IXXXX ixxxx)		chg_ixx ̃vg^Cv錾
(5-3) ER get_ixx(IXXXX *p_ixxxx)	get_ixx ̃vg^Cv錾

(6) ݔԍƊ݂̋֎~^֘A̒`iIvVj

dis_intCena_int ^[QbgˑɃT|[gꍇɂ́Cȉ̒`
^[QbgˑŒ񋟂D

(6-1) ER dis_int(INTNO intno)		dis_int ̃vg^Cv錾
(6-2) ER ena_int(INTNO intno)		ena_int ̃vg^Cv錾

(7) \]pVXe֘A̒`iIvVj

JSPJ[ĺCւ̗pړÏƂĂ邱ƂC^[Qb
gˑɁC\]p̃T[rXR[ vxget_tim T|[g\ƂĂ
Dvxget_tim T|[gꍇɂ́Cȉ̒`ѐ錾^[Qbg
ˑŒ񋟂D

(7-1) SYSUTIM				\]pVXẽf[^^
(7-2) ER vxget_tim(SYSUTIM *p_sysutim)	vxget_tim ̃vg^Cv錾

(8) ^[Qbgʃ}N̒`

cpu_defs.h ł̓vZbT́icpu_defs.h ̒uĂfBNg
啶ɂ́jCsys_defs.h ł̓VXéisys_defs.h ̒u
ĂfBNg啶ɂ́j}N`D

(9) vZbT̃GfBA̒`

(9-1) SIL_ENDIAN

vZbTrbOGfBȀꍇɂ SIL_ENDIAN_BIGi1jCg
GfBȀꍇɂ SIL_ENDIAN_LITTLEi0jɃ}N`D

(10) VXe̒~̒`

(10-1) kernel_abort(void)

assert}NɂAT[V̎sCT[rXR[vIȃG[
ԂꍇɁCVXe~֐܂̓}NDkernel_exit 
яo@l邪CfobOeՂɂ邽߂ɂ́CCC֐
}NŒ`C̏ŃVXe~鏈ɒ`̂]܂
ikernel_exit ĂяoƁCG[_̏ԂωĂ
܂jD


RDJ[lp̃f[^^֐Ȃ

^[QbgˑŒ񋟂ׂJ[lp̃f[^^֐Ȃǂ͎̒ʂ
D̃f[^^}N̒`Ɗ֐̃vg^Cv錾́CʂɋL
qȂCcpu_config.h ܂ sys_config.hi܂͂炩CN
[ht@CjɊ܂߂D܂C֐̎̂́CC̏ꍇ 
cpu_config.c ܂ sys_config.c ɁCAZȕꍇ 
cpu_support.S ܂ sys_support.S ɋLqD

(1) ^XNReLXgubÑf[^^

(1-1) CTXB

^[Qbgˑ̃^XNReLXgۑ邽߂ɁCTCB ɎƂ
Kvȃf[^\̌^D

(2) VXeԎQ

(2-1) BOOL sense_context(void)

݂̎sReLXgC^XNReLXg̏ꍇ FALSEC^XNR
eLXg̏ꍇ TRUE Ԃ֐D

(2-2) BOOL sense_lock(void)

݂̃VXeԂCCPUbNԂ̏ꍇ TRUECCPUbNԂ
 FALSE Ԃ֐D

(2-3) BOOL t_sense_lock(void)

^XNReLXgɂāC݂̃VXeԂCCPUbNԂ̏ꍇ
 TRUECCPUbNԂ̎ FALSE Ԃ֐D̊֐C^X
NReLXgĂ΂邱Ƃ͂ȂD

(2-4) BOOL i_sense_lock(void)

^XNReLXgɂāC݂̃VXeԂCCPUbNԂ̏
 TRUECCPUbNԂ̎ FALSE Ԃ֐D̊֐C^X
NReLXgĂ΂邱Ƃ͂ȂD

 Iɂ́Csense_lock 񋟂Ă t_sense_lock  
i_sense_lock ͕KvȂCt t_sense_lock  i_sense_lock 񋟂
Ă sense_lock 邱Ƃ͂ł邪C^[QbgɈˑɍ
s邽߂ɁC^[Qbgˑ3̊֐񋟂邱
ƂĂD

(3) CPUbNƂ̉

(3-1) void t_lock_cpu(void)

^XNReLXgɂāCCPUbNԂCCPUbNԂɑJ
֐D̊֐CCPUbNԂŌĂ΂邱Ƃ͂ȂD܂C^
XNReLXgĂ΂邱ƂȂD

(3-2) void t_unlock_cpu(void)

^XNReLXgɂāCCPUbNԂCCPUbNԂɑJ
֐D̊֐CCPUbNԂŌĂ΂邱Ƃ͂ȂD܂C
^XNReLXgĂ΂邱ƂȂD

(3-3) void i_lock_cpu(void)

^XNReLXgɂāCCPUbNԂCCPUbNԂɑJ
ڂ֐D̊֐CCPUbNԂŌĂ΂邱Ƃ͂ȂD܂C^
XNReLXgĂ΂邱ƂȂD

(3-4) void i_unlock_cpu(void)

^XNReLXgɂāCCPUbNԂCCPUbNԂɑJ
ڂ֐D̊֐CCPUbNԂŌĂ΂邱Ƃ͂ȂD܂C
^XNReLXgĂ΂邱ƂȂD

(4) ^XNfBXpb`

(4-1) void dispatch(void)

^XNfBXpb`iȉCPɃfBXpb`ƌj𖾎IɌĂԂ
߂̊֐D^XNReLXgĂ΂ꂽT[rXR[CCPUb
NԂŌĂ΂D

̊֐Ă΂ƁC֐Ă񂾃^XÑReLXgۑC s
ł^XN̒ōōD揇ʂ̃^XNischedtskj̃ReLXg𕜋A
ĎsԂƂDsł^XNȂꍇischedtsk  NULL ̏
jɂ́C݂āCsł^XNł܂ő҂DŁC
sł^XNł̂҂ԂɋNꂽ݃nh̏oŁC
fBXpb`Ă΂Ȃ悤ɑ΍􂷂邱ƂKvłD̓Iɂ́C
sł^XNł̂҂ԁCꎞIɔ^XNReLXgɐ؂
邩CfBXpb`֎~ԂɂD

VɎsԂɂȂ^XNC^XNO[`̋N𖞂
Ă΁C^XNO[`ND܂C̊֐Ăяo
^XNɎsԂɂȂC^XNO[`̋N
Ă΁C^XNO[`̋NsD^XNO[`
̋Nɂ́C^[Qbgˑ񋟂 calltex ܂ call_texrtn 
p邱ƂłD

(4-2) void exit_and_dispatch(void)

ݎs̃ReLXĝāCfBXpb`Ăяo߂̊֐D^
XNReLXgĂ΂ꂽT[rXR[i̓Iɂ́Cext_tskj
܂̓J[l̏CCPUbNԂŌĂ΂D

̊֐Ă΂ƁC֐Ă񂾃^XÑReLXgۑCs
ł^XN̒ōōD揇ʂ̃^XNischedtskj̃ReLXg𕜋A
ĎsԂƂDsł^XNȂꍇischedtsk  NULL ̏
j̏́Cdispatch ƓlłD

VɎsԂɂȂ^XNC^XNO[`̋N𖞂
Ă΁C^XNO[`ND

̊֐́CJ[l̏Ă΂邽߂ɁC^XNReL
XgĂ΂Ăł邱ƂKvłDȂC̊֐
̓^[ȂD

(5) ݃nh^CPUOnh̏o

(5-1) INTHDR_ENTRY(inthdr)
(5-2) INT_ENTRY(inthdr)

INTHDR_ENTRY(inthdr) ͋NԒn inthdr ̊݃nhĂяoo
[`𐶐}NCINT_ENTRY(inthdr) ͐o
[`̐擪̃x𓾂邽߂̃}NłDINT_ENTRY(inthdr) 
郉x́C݃nhubNɏo[`̐
Ԓno^邽߂ɎgDo[`𐶐KvȂ
ꍇɂ́CINTHDR_ENTRY(inthdr) P extern 錾ɓWJ΂悢D

݃nh̏óCsReLXg^XNReLXg
؂芷CXNb`WX^ۑāC݃nhĂяoD
݃nh߂ƁC̎sReLXgɖ߂ƂƂɁCKvɉ
fBXpb`ƃ^XNO[`̋NsDfBXpb`ƃ^
XNO[`̋ŃC̓Iɂ͎̂悤ɍsD

(a) ȉ̏́C݃nh^XNReLXgsɋNꂽ
ꍇŁCreqflg  TRUE ̎̂ݍsD

(b) enadsp  TRUE ŁCsԂ̃^XNiruntskjƎsł^XN
ōōD揇ʂ̃^XNischedtskjvĂȂꍇɂ́CO҂̃^
XÑReLXgۑC҂̃^XÑReLXg𕜋AĎs
ԂƂDsł^XNȂꍇischedtsk  NULL ̏ꍇjɂ́C
݂āCsł^XNł܂ő҂DłCsł
^XNł̂҂ԂɋNꂽ݃nh̏oŁC^XNfB
Xpb`Ă΂Ȃ悤ɂ邱ƂKvł邪Co^X
NReLXgŎsĂ΁Cɑ΍􂷂Kv͂ȂD

(c) sԂ̃^XNi(b) Ń^XNfBXpb`sꍇ́CVɎ
sԂƂȂ^XNj^XNO[`̋N𖞂Ă
΁C^XNO[`ND܂C(b) Ń^XNfBXpb`
sꍇ́C܂ŎsԂł^XNɎsԂɂȂC
^XNO[`̋N𖞂Ă΁C^XNO[`
̋NsD^XNO[`̋Nɂ́C^[Qbgˑ
񋟂 calltex ܂ call_texrtn p邱ƂłD

̃}NŐ郋[`ł́CL̏̈ꕔ݂̂sCc̏
͕ʂɗpӂ[`ɔCĂ悢D̓Iɂ́C^XNfBXpb`
ƃ^XNO[`̋ŃCʂɃ[`Ƃėpӂ̂K
ł낤D

(5-3) EXCHDR_ENTRY(exchdr)
(5-4) EXC_ENTRY(exchdr)

EXCHDR_ENTRY(exchdr) ͋NԒn exchdr CPUOnhĂяoo
[`𐶐}NCEXC_ENTRY(exchdr) ͐o
[`̐擪̃x𓾂邽߂̃}NłDEXC_ENTRY(exchdr) 
郉x́CCPUOnhubNɏo[`
擪Ԓno^邽߂ɎgDo[`𐶐Kv
ꍇɂ́CEXCHDR_ENTRY(exchdr) P extern 錾ɓWJ΂悢D

CPUOnh̏óCsReLXg^XNReLXg
ɐ؂芷CXNb`WX^ۑāCCPUOnhĂяoD
CPUOnhɂ́CVP^̃p[^ p_excinf nD̃p[^
́CCPUOɊւۑX^bN̈ւ̃|C^ł邱Ƃ
z肵Ă邪C̓Iɂ̓^[Qbgɒ߂D

CPUOnh߂ƁC̎sReLXgɖ߂ƂƂɁCKv
ă^XNfBXpb`ƃ^XNO[`̋NsD^X
NfBXpb`ƃ^XNO[`̋ŃC݃nh̏o
̏ꍇƓlłiL (a)`(c)jD

(7) ^XNReLXgݒ菈icpu_context.hj

^[Qbgˑ̃^XNReLXgݒ肷邽߂ create_context  
activate_context 2̊֐pӂD2̊֐ĂяoƂŁC^
XÑReLXgi̓Iɂ́C^XNReLXgubN̓eƃ^X
ÑX^bN̈j^XNNłԂɐݒ肷D2̊֐͌Ă
^C~OقȂ邾ŖmȖS͂ȂCǂ̂悤ȏ͂ǂ
̊֐ōsȂ΂ȂȂƂ͂ȂD

̊֐̐錾у}N̒`́Ccpu_context.h Ɋ܂߂D́C
cpu_config.h 鎞_ł TCB `ĂȂ߂łD

(7-1) void create_context(TCB tcb)

^XNx~ԂɈڍs鎞ɌĂ΂D̓Iɂ́C^XN̐
iJSPJ[lł́CCRE_TSK Ń^XN𐶐邽߁C^XNǗW[
̏jƃ^XN̏Iiext_tskCter_tskjɌĂ΂D

(7-2) void activate_context(TCB tcb)

^XNsłԂɈڍs鎞ɌĂ΂D̓Iɂ́Cact_tsk Ń^
XNN鎞C^XN̏Iiext_tskCter_tskjɋNṽL[
COɂċN鎞CTA_ACT w肵ă^XN𐶐i^
XNǗW[̏jɌĂ΂D

(7-3) ACTIVATED_STACK_SIZEiIvVj

ext_tsk X^bNɊmۂ_~[̈̃TCY`邽߂̃}ND
_~[̈悪KvȂꍇ́C̃}N`Kv͂ȂD

ext_tsk ́C^XNIC^XNɑ΂ create_context 
ĂԁD܂C^XN̋NvL[COĂꍇɂ́C^XN
ɑ΂ activate_context ĂԁDcreate_context  activate_context 
́CΏۃ^XÑX^bN̈ꍇ邪Cꂪ ext_tsk
iтĂ΂֐jgpĂX^bN̈ƏdȂꍇC
̎gpĂX^bN̈Ŕj󂷂錋ʂɂȂD

ACTIVATE_STACK_SIZE Ccreate_context  activate_context 
X^bN̈̃TCYiɂ́CX^bN̒ꂩ牽oCg߂܂ł
邩jɃ}N`ĂƁCext_tsk ŃX^bNɒ`TC
Ỹ_~[̈mۂC̎gpĂX^bN̈j󂷂̂h
D

(8) ^[Qbgˑ̏^I

(8-1) void cpu_initialize(void)

vZbTˑ̏DJ[l̏ŁCJ[l̊eW
[OɌĂ΂D

(8-2) void sys_initialize(void)

VXeˑ̏DJ[l̏ŁCcpu_initialize ɑ
ČĂ΂D

(8-3) void cpu_terminate(void);

vZbTˑ̏IDJ[l̏IŌĂ΂D

(8-4) sys_exit(void)

VXȅIDJ[l̏IŁCcpu_terminate ɑČĂ΂
D̊֐̓^[ȂDROMj^VXeł́CROMj
^ďoŎ邱Ƃz肵ĂD

(8-5) call_atexit(void)

Jˑ̏IDKvɉāCatexit ɂēo^ꂽ֐
s C++ ɂfXgN^̎ssD

(9) ݃nh^CPUOnh̒`

(9-1) void define_inh(INHNO inhno, FP inthdr)

݃nhԍ inhno ̋NԒn inthdr ɐݒ肷D݊Ǘ@
\̏Ă΂D

(9-2) void define_exc(EXCNO excno, FP exchdr)

CPUOnhԍ excno ̋NԒn exchdr ɐݒ肷DCPUOn
hǗ@\̏Ă΂D

(10) CPUO_̃VXeԂ̎Q

(10-1) BOOL exc_sense_context(VP p_excinf)

CPUOReLXgC^XNReLXg̏ꍇ FALSEC
^XNReLXg̏ꍇ TRUE Ԃ֐DCPUOnhĂ΂
T[rXR[Ă΂Dp_excinf ɂ́CCPUOnhւ̈
̂܂ܓnD

(10-2) BOOL exc_sense_lock(VP p_excinf)

CPUOReLXgCCPUbNԂ̏ꍇ TRUECCPUbN
Ԃ̎ FALSE Ԃ֐DCPUOnhĂ΂ꂽT[rXR
[Ă΂Dp_excinf ɂ́CCPUOnhւ̈̂܂
nD

(11) TCB ̃tB[h̃rbg̒`iIvVj

TCB ̃tB[h̔zu͐\ɑ傫eƎv邽߁C^[Qb
gˑɃtB[h̃rbgύXł悤ɂĂD̓Iɂ́C
2̃tB[h̃rbgύXłD̃}N`Ȃ
ꍇCŏrbgƂȂD

(11-1) TBIT_TCB_TSTAT		tstati^XNԁj̃rbg
(11-2) TBIT_TCB_PRIORITY	priorityiDxjtB[h̃rbg

32rbgvZbT̏ꍇɂ́C 8 ɒ`̂IłD

(12) rbg}bvT[`ɃrbgT[`߂g߂̒`iIvVj

vZbTrbgT[`߂ꍇCfBL[̃rbg}bvT[
`ɂ̖߂p悢D̏ꍇCȉ̊֐у}N
^[QbgˑŒ`D

(12-1) CPU_BITMAP_SEARCH

vZbT̃rbgT[`߂pꍇC̃}N`D̃}
N`邱ƂɂC^[Qbgˑ bitmap_search 
D

(12-2) UINT bitmap_search(UINT bitmap)

rbgT[`s֐Dbitmap  1 ̃rbg̓Cłʂ̂̂T
[`C̃rbgԍԂDrbgԍ́CŉʃrbgiLSBj 0 
Dbitmap ̉16rbgɁCK 1 ̃rbgiȂ킿Cbitmap 
 0 w肳邱Ƃ͂ȂjƂ肵Ă悢D

WCuɃrbgT[`߂p ffs ꍇCffs p 
bitmap_search ̂悤ɒ`΂悢D
	#define	bitmap_search(bitmap)	(ffs(bitmap) - 1)

vZbT̎rbgT[`߂Cłʂ 1 ̃rbgT[`
̂łꍇɂ́C̃}N`āCrbg̊tύX邱
łD

(12-3) UINT PRIMAP_BIT(pri)

^XNDx̓\iōDx 0 ƂjCɑΉrb
g}bvɕϊDftHg̒`͎̒ʂD
	#define	PRIMAP_BIT(pri)		(1 << (pri))

(13) ^[Qbgˑ̃T[rXR[

ȉ̃T[rXR[̏[`^[QbgˑŒ`D

(13-1) dis_int
(13-2) ena_int

ȉ̃T[rXR[^[QbgˑɃT|[gꍇɂ́C̏
[`^[QbgˑŒ`DiIvVj

(13-2-1) chg_ixx
(13-2-2) get_ixx

(14) \]pVXe֘A̒`iIvVj

(14-1) SUPPORT_VXGET_TIM

^[Qbgˑ vxget_timT[rXR[pꍇɁC̃}
N`D

(14-2) hw_timer.h

^[Qbgˑ̃^C}W[̃CN[ht@CD^[Qbg
 vxget_timT[rXR[pꍇC^[Qbgˑ̃^C}
W[KvɂȂD̂߂̃CN[ht@Cł 
hw_timer.h ́CVXeT[rX̃VXeNbNhCoŗp
ƋʂɂĂD

(15) J[l̓ʖ̃l[Ƃ̉icpu_rename.hC
     cpu_unrename.hCsys_rename.hCsys_unrename.hj

^[QbgˑŗpĂ鎯ʖiW[ɕʖj
CITRON4.0dlɏ] _kernel_ Ŏn܂̂Ƀl[Kv
D

̓Iɂ́CvZbTˑŗpĂ鎯ʎqXgAbvt@C
 cpu_rename.def ɁCVXeˑŗpĂ鎯ʎqXgAbv
t@C sys_rename.def ɍ쐬Dgenrename gāC̃t@
CCꂼ cpu_rename.h  cpu_unrename.hCsys_rename.h  
sys_unrename.h 𐶐Dxxx_rename.def  xxx_rename.h  
xxx_unrename.h 𐶐ɂ́Cu$(KERNEL_DIR)/utils/genrename xxxv
s΂悢D

܂Ccpu_config.h ̐擪 cpu_rename.h Csys_config.h ̐擪 
sys_rename.h CN[hD

genrename t@Ĉ͎悤ȓełDxxx_rename.def 
xxxx Ƃʎq܂܂ĂꍇCxxx_rename.h ɂ͎̂悤ȃ}N
`D

#define xxxx		_kernel_xxxx
#ifdef LABEL_ASM
#define _xxxx		__kernel_xxxx
#endif /* LABEL_ASM */

ŁCLABEL_ASM ́CAZuꃌx̎ʖCCꃌx̎
ʖ̐擪 "_" t̂ɂȂꍇɒ`ׂ}Nłi`
̕@ɂẮuVXe\z@̐ݒvQƁjD

܂Cxxx_unrename.h ɂ͎̂悤ȃ}N`D

#undef xxxx
#ifdef LABEL_ASM
#undef _xxxx
#endif /* LABEL_ASM */

(16) g[XÔ߂̃}N`itool_config.hj

J[l̃g[XO̎擾́CJˑŃg[XÔ߂̃}
N`邱ƂɂčsDg[XÔ߂̃}N͖150
C擾OɑΉ}N`Dg[XO擾
Ȃꍇɂ́C̃}Nɒ`΂悢D

(17) ̑

(17-1) TARGET_NAME

NbZ[W̃^[QbgD

(17-2) void sys_putc(char c)

^[QbgVXe̒჌x̕o̓[`DROMj^VXe
ł́CROMj^ĂяoŎ邱Ƃz肵ĂD

(17-3) OMIT_CALLTEXiIvVj

^[Qbgˑ calltex 񋟂KvȂꍇɁC̃}N
`Dڂ́Cu^XNO[`̋N֐Ƃ̒ŎQƂ
 TCB ̃tB[hv̐߂QƂ̂ƁD

(17-4) LABEL_ALIAS(new_label, defined_label)iIvVCtool_config.hj

new_label  defined_label ƓAhXɒ`邽߂̃}ND
悤ȃ}NłȂꍇɂ́C`ȗ邱ƂłD̃}
N`́Ctool_config.h ̒ōŝWƂD

(17-5) COPYRIGHT_CPUiIvVj
(17-6) COPYRIGHT_SYSiIvVj

J[lÑbZ[WɁCꂼvZbTˑуVXe
̒쌠\ǉ邽߂̃}ND


SD^[Qbgˑp邱Ƃł^[Qbgˑ̕ϐE֐

(1) ^XNǗ֘A̕ϐ

(1-1) TCB *runtsk

sԂ̃^XNivZbTReLXgĂ^XNj TCB 
w|C^DsԂ̃^XNȂꍇ NULL ɂDT[rXR[
̏ŁC^XNiT[rXR[Ăяo^XNjɊւ
QƂꍇ runtsk gDJ[l̏ȊOŁC̕ϐ
̂́C^XNfBXpb`iȂ킿C^[Qbgˑĵ
łD

(1-2) TCB *schedtsk

sł^XN̒ōōD揇ʂ̃^XN TCB w|C^Ds
ł^XNȂꍇ NULL ƂȂDfBXpb`֎~ԂȂǁCfBX
pb`ۗĂԂ́Cruntsk ƈvĂƂ͌ȂD̕
̂̓XPW[݂̂ŁC^[Qbgˑ͂̕ϐ
Ă͂ȂȂD

(1-3) BOOL reqflg

݃nh^CPUOnh̏oɁC^XNfBXpb`܂
^XNO[`̋Nv邱ƂtOD̕ϐ̓T[
rXR[i^[QbgˑjŃZbgC݃nh^CPU
Onh̏oi^[QbgˑjŎQƁ^NAD

(1-4) BOOL enadsp

^XNfBXpb`ԂłiȂ킿C^XNfBXpb`֎~
łȂjƂtOD̕ϐ̓T[rXR[idis_dspCena_dspC
^[Qbgˑ chg_ixxj̒ŏD

܂C^XNfBXpb`i^[Qbgˑj̒ŁCsł^XN
ł̂҂ԂɋNꂽ݃nh̏oŃ^XNfBXpb`
Ă΂Ȃ悤ɂ邽߂ɁC̕ϐꎞI FALSE ɐݒ肷邱
łD

(2) ^XNO[`̋N֐Ƃ̒ŎQƂ TCB ̃tB[h

(2-1) void calltex(void)
(2-2) void call_texrtn(void)

^XNO[`̋Ns֐Dcalltex ́CsԂ̃^XN
^XNO[`̋N𖞂Ă΁Ccall_texrtn Ăяo
Dcall_texrtn ́C^XNO[`̌ĂяosD^XNO
[`ĂяóCꎞICPUbND

̊֐́CfBXpb`⊄݃nh^CPUOnh̏o
CCPUbNԂŌĂ΂邱Ƃz肵ĂDcalltex Ăяo
̂łȒPł邪Csグ邽߂ɂ́CÑ`FbN
AZuŋLqCcall_texrtn Ăяo悢D`FbN
NɂẮC^[Qbgˑ calltex ̃\[XR[hQ
Ƃ邱ƁD܂̏ꍇɂ́COMIT_CALLTEX }N`邱ƂŁC^
[Qbgˑ calltex 菜D

(2-3) BOOL enatex
(2-4) TEXPTN texptn

call_texrtn Ăяo߂ɁCÑ`FbNAZuŋLq
ꍇɂ́CTCB ̂̃tB[hQƂKvD

(3) VXeO@\

ُ펖ۂʒm邽߂ɁCVXeO@\ւ̃Oo͊֐p邱
łDVXeO@\ɂẮC[UY}jAQƂ邱ƁD


TDVXeT[rXp̃f[^^֐Ȃ

5.1 VXeC^tF[XCiSILĵ߂̒`

^[QbgˑŒ񋟂ׂVXeC^tF[XCiSILĵ
̒`͎̒ʂłD̒`́Ccpu_defs.h܂sys_defs.hi
͂炩CN[ht@CjɊ܂߂D܂C֐̎̂
KvȏꍇCC̏ꍇcpu_config.c܂sys_config.cɁCAZu
̏ꍇcpu_support.S܂sys_support.SɋLqD

(1) ԑ҂֘A

(1-1) void sil_dly_nse(UINT dlytim)

dlytimŎw肳鎞ԁiP: 1imbj҂֐^[QbgˑŒ
D

@̓^[Qbgˑł邪Cȉ̊֐AZuŋLq
̂CvZbTˑɊ܂߂̂WIȕ@ƂDAZu
ŋLq̂́CRpC̍œKɈˑȂ悤ɂ邽߂łD
̊֐́Cł胁ANZXsȂ悤ɎׂłD

	void sil_dly_nse(UINT dlytim)
	{
		if (dlytim > SIL_DLY_TIM1) {
			dlytim -= SIL_DLY_TIM1;
			while (dlytim > SIL_DLY_TIM2) {
				dlytim -= SIL_DLY_TIM2;
			}
		}
	}

(1-2) SIL_DLY_TIM1iIvVj
(1-3) SIL_DLY_TIM2iIvVj

sil_dly_nseL̕WIȕ@ŎꍇC2̒萔VXe
ˑŃ}N`DȂC2̒萔̌vO
pӂĂD]́CkꂽD

(2) ݃bNԂ̐֘AiIvVj

(2-1) SIL_PRE_LOC
(2-2) SIL_LOC_INT()
(2-3) SIL_UNL_INT()

^[QbgˑŊ݃bNԂ̐@ύXꍇɂ́C
̃}Nɂ̕@`D}N`Ȃꍇɂ́C ^[
QbgˑɂāCJ[lCPUbN̋@\pĊ݃bN
ԂD

(3) vZbT̃GfBA̒`

(3-1) SIL_ENDIAN

gGfBAvZbTłSIL_ENDIAN_LITTLEi0jCrbOGfB
AvZbTłSIL_ENDIAN_BIGi1jɃ}N`D

(4) GfBA̔]iIvVj

(4-1) VH SIL_REV_ENDIAN_H(VH data)
(4-2) VW SIL_REV_ENDIAN_W(VW data)

GfBA̔]悭@ꍇɂ́C̃}N
ɂ̕@`D̃}N`Ȃꍇɂ́CWIȕ@
ŃGfBA̔]sD

(5) GfBA]t̃ԃANZXiIvVj

GfBA𔽓]ăǏo^݂Iȕ@ꍇC
Y郁ԃANZX֐^[QbgˑŗpӂC^[Qbg
ˑ̕WIȒ`𖳌ɂ邽߂̃}N`D

(5-1) VH sil_reh_bem(VP mem)                OMIT_SIL_REH_BEM
(5-2) void sil_wrh_bem(VP mem, VH data)     OMIT_SIL_WRH_BEM
(5-3) VW sil_rew_bem(VP mem)                OMIT_SIL_REW_BEM
(5-4) void sil_wrw_bem(VP mem, VW data)     OMIT_SIL_WRW_BEM

gGfBAvZbTł́C̃ԃANZX֐^[
QbgˑŗpӂCEɎ}N`D

(5-5) VH sil_reh_lem(VP mem)                OMIT_SIL_REH_LEM
(5-6) void sil_wrh_lem(VP mem, VH data)     OMIT_SIL_WRH_LEM
(5-7) VW sil_rew_lem(VP mem)                OMIT_SIL_REW_LEM
(5-8) void sil_wrw_lem(VP mem, VW data)     OMIT_SIL_WRW_LEM

rbOGfBAvZbTł́C̃ԃANZX֐^[
QbgˑŗpӂCEɎ}N`D

(6) W̃ANZX֐̖iIvVj

(6-1) OMIT_SIL_ACCESS

V~[VȂǂŁCׂẴԃANZX֐^[Qbg
ˑŗpӂꍇɂ́C^[Qbgˑ̕WIȒ`𖳌ɂ
߂ɁC̃}N`D

5.2 VXeNbNhCop̃f[^^֐Ȃ

^[QbgˑŒ񋟂ׂVXeNbNhCop̃f[^^֐
Ȃǂ͎̒ʂłD̒`́Chw_timer.hi܂͂炩C
N[ht@CjɊ܂߂D֐̎̂Kvȏꍇɂ́CK؂ȃt@
CpӂD

(1) INHNO_TIMER

^C}݃nh̃xN^ԍ`}NC^[Qbgˑ
񋟂D

(2) ^C}̐

(2-1) void hw_timer_initialize(void)

^C}C^C}݂Iɔ֐C^[Qbg
Œ񋟂D^C}݂̎́CTIC_NUMETIC_DENOŎw肳ꂽ
ԂƈvD

(2-2) void hw_timer_int_clear(void)

^C}ݗvNA֐C^[QbgˑŒ񋟂D

(2-3) void hw_timer_terminate(void)

^C}̓~C^C}݂𔭐Ȃ悤ɂ֐C^[
QbgˑŒ񋟂D

(3) \]pVXeQƋ@\֘AiIvVj

^[Qbgˑvxget_timT[rXR[pꍇɁCȉ
f[^^֐Ȃǂ^[QbgˑŒ񋟂D

(3-1) CLOCK

^C}l̓\̂߂̃f[^^D

(3-2) CLOCK hw_timer_get_current(void)

^C}̌ݒlǂݏoC\ŕԂ֐D

(3-3) BOOL hw_timer_fetch_interrupt(void)

^C}ݗv`FbN֐D^C}݂vĂꍇ
TRUECvĂȂꍇFALSEԂD

(3-4) UINT TO_USEC(CLOCK clock)

^C}l̓\C1ʕbPʂɕϊ邽߂̃}Ni܂͊֐jD
hw_timer_get_currentœǂݏolC^C}ݔ̌oߎ
iP: 1ʕbjɕϊ邽߂ɗpD

(3-5) BOOL BEFORE_IREQ(CLOCK clock)

݂֎~ԂŁC܂hw_timer_get_currentĂяoC
hw_timer_fetch_interruptĂяoꍇlDhw_timer_get_current
ĂяoɃ^C}ɒBC^C}݂vƁC
hw_timer_get_current͎ɒB钼Õ^C}liCclockƂj
ԂChw_timer_fetch_interruptTRUEԂƂɂȂD̏󋵂ł
ݎ𓾂邽߂ɁCclocklȏ̏ꍇɂ́C
hw_timer_fetch_interruptTRUEԂĂCݔO̒lƂ݂Ȃ
ɂDBEFORE_IREQ́CclockݔO̒lƂ݂ȂׂꍇTRUEC
łȂꍇFALSEԂ}Ni܂͊֐jłD

5.3 VAC^tF[XhCop̃f[^^֐Ȃ

^[QbgˑŒ񋟂ׂVAC^tF[XhCop̃f[^^
֐Ȃǂ͎̒ʂłD̒`́CʂɋLqȂC
hw_serial.hi܂͂CN[ht@CjɊ܂߁CKv
RtBM[Vhw_serial.cfgɋLqD֐̎̂Kv
ȏꍇɂ́CK؂ȃt@CpӂD

VAC^tF[XhCo̒ŁC^[Qbg̃VAI/OfoCX
Ɉˑ镔CVAI/OfoCXhCoƌĂԁDVAI/OfoC
XhCóCITRONfoCXhCo݌vKChCPDICɑD

(1) TNUM_PORT

VAC^tF[XhCoT|[gVA|[g`
}ND̃}ŃCcpu_config.h܂sys_config.hi܂͂炩
CN[ht@CjŒ`D

(2) VAI/OfoCX̊݃nhƂ̓o^

VAI/OfoCX̊݃nh^[QbgˑŒ񋟂C
J[lɓo^ÓIAPIhw_serial.cfgɊ܂߂DVAI/OfoCX
̊nh̃xN^ԍ́Chw_serial.hi܂͂CN[h
t@CjŃ}N`Chw_serial.cfghw_serial.hCN
[h@WƂD

(3) void sio_initialize(void)

VAI/OfoCXhCo郋[`D̊֐́CVA
C^tF[XhCõ^[Qbgˑ̏[`Ăяo
D

(4) SIOPCB

VAI/O|[gǗubÑf[^^ihw_serial.hɂ́C^錾
܂Ă΂悢jD

(5) SIO_ERDY_SNDSIO_ERDY_RCV

M\R[obN̎ʔԍSIO_ERDY_SNDɁCMʒmR[obN
ʔԍSIO_ERDY_RCVɃ}N`DR[obN̋֎~^s
T[rXR[isio_ena_cbrsio_dis_cbrjŗpD

(6) foCXT[rX[`

ȉ̃foCXT[r[`́CiȂƂjVAI/O|[g
݂̊֎~ꂽԂŌĂяoD܂C^XNReLXgC^
XNReLXĝŌĂяoꍇiŌĂяo
삷悤ɂȂ΂ȂȂjD

(6-1) SIOPCB *sio_opn_por(ID siopid, VP_INT exinf)

siopidŎw肳VAI/O|[gI[v֐Dexinf̓VA
I/O|[gɑ΂gŁCR[obNĂԎɃ|[gʂ邽
߂ɓnD

(6-2) void sio_cls_por(SIOPCB *siopcb)

siopcbŎw肳VAI/O|[gN[Y֐D

(6-3) BOOL sio_snd_chr(SIOPCB *siopcb, char c)

siopcbŎw肳VAI/O|[gɁCcŎ镶𑗐M֐D
𑗐MWX^ɓꂽꍇɂTRUECOɑM̑MI
ĂȂ߂ɁC𑗐MWX^ɓȂꍇɂFALSE
D

(6-4) INT sio_rcv_chr(SIOPCB *siopcb)

siopcbŎw肳VAI/O|[g當ǂފ֐DM
ꍇCǂ񂾕̃R[h͐̒lƂĕԂCMĂȂ
ɂ-1ԂD

(6-5) sio_ena_cbr(SIOPCB *siopcb, UINT cbrtn)

siopcbŎw肳VAI/O|[ǵCcbrtnŎw肳R[ob
NDcbrtnɂ́CSIO_ERDY_SNDSIO_ERDY_RCVwłD

(6-6) sio_dis_cbr(SIOPCB *siopcb, UINT cbrtn)

siopcbŎw肳VAI/O|[ǵCcbrtnŎw肳R[ob
N֎~Dcbrtnɂ́CSIO_ERDY_SNDSIO_ERDY_RCVwłD

(7) R[obN[`

^[Qbgˑ́CKvȃ^C~OŁCVAC^tF[XhCo
̃^[QbgˑɊ܂܂ȉ̃R[obN[`Ăяoт
Ȃ΂ȂȂDCꂼ̃R[obN֎~Ă鎞́C
R[obN[`ĂяoĂ͂ȂȂD

R[obN[`́CiȂƂjVAI/O|[g݂̊
֎~ꂽԂŁC^XNReLXgŌĂяoDexinfɂ́CVA
I/O|[g̃I[vɎw肳ꂽgnD

(7-1) void sio_ierdy_snd(VP_INT exinf)

M\R[obN[`DVAI/O|[gɑ΂ĕMł
ԂɂȂꍇɌĂяoDVAC^tF[XhCóC̃R
[obN[`̒ŁCsio_snd_chrĂяoĎ̕𑗐M邩C
MׂȂꍇɂ͑M\R[obN֎~D

(7-2) void sio_ierdy_rcv(VP_INT exinf)

MʒmR[obN[`DVAI/O|[g當Mꍇ
ɌĂяoDVAC^tF[XhCóC̃R[obN[`
̒ŁCKsio_rcv_chrĂяoĎMoD

5.4 VXeO^XNp̂߂̒`

^[QbgˑŒ񋟂ׂVXeO^XN̂߂̒`͎̒ʂ
D̒`́Ccpu_config.h܂sys_config.hi܂͂炩
CN[ht@CjɊ܂߂D

(1) LOGTASK_PORTID

VXeO^XNCVXeOo͂VA|[gID`
}N^[QbgˑŒ񋟂D

(2) VXeO^XN֘A̒`iIvVj

VXeO^XNɊւȉ̃}N^[QbgˑŒ񋟂D
̃}N^[QbgˑŒ`Ȃꍇɂ́CftHg̒lg
D

(2-1) LOGTASK_PRIORITY		VXeO^XN̏Dx
(2-2) LOGTASK_STACK_SIZE	VXeO^XÑX^bNTCY
(2-3) LOGTASK_INTERVAL		VXeO^XN̓ԊuiP: ~bj


UD^[Qbgˑ̃qg

(1) ^XNfBXpb`2ʂ̎j

^XNfBXpb`̎jƂāCReLXg̕ۑEAƃ^XN
O[`̋NÃ[`ōsjijAƌĂԁj
ƁCReLXg̕ۑEs^XN̑IEReLXg̕Aƃ^X
NO[`̋N΂΂̃[`ōsjijB
ĂԁjDjB́CۑReLXg󋵂ɉĕKvŏ
ɂ邱ƂeՂɂȂƂ_DCV~[V
̏ꍇC@ɂĂ͕jB̂Ȃ\lD

^XNO[`̋NӏƂϓ_݂ꍇC2̕jɂ
ӂׂႢDȉCɂD^XN1ƃ^XN22
^XNC^XN1̕Dx̂ƂDŏC^XN2s
Ɋ݃nhNC̒^XN1NꂽʁC^X
N2^XN1ɂăvGvgꂽ̂ƂDŁC^XN1^
XN2ɑ΂ă^XNO[`̋NvC҂Ԃɓ
T[rXR[𔭍sČʃ^XN2ɃfBXpb`󋵂l
D̎C^XNfBXpb`́C^XN2ɑ΂ă^XNO[
`̋NsKv邪CȀꍇɂ́C^XN1疾I
Ă΂ꂽfBXpb`̒Ń^XNO[`̋Nŝ
΂āCjB̏ꍇɂ́C^XN2̃ReLXg𕜋A郋[`֕
CReLXg𕜋A鏈ɑƂă^XNO[`
̋NsD

JSPJ[lł́CjÂ邩jB̂邩^[QbgˑɔC
ƂƂD̂߂ɁC^XNO[`̋N^XNfBXpb
`Ɋ܂߂dlƂĂD

(2) ݃nh̏o

݃nh̏o̓éCvZbT̊݃A[LeN`
傫قȂ邪C悻̗͎̏̒ʂłDCPUOn
h̏oCnƂẮC悻̗͓̏
lłDCvZbT݂CPUOňقȂ鈵ꍇ́C
ۂ̏o͂ȂقȂ̂ƂȂD

	------------------------------------------------------------
	WX^̕ۑiɃXNb`WX^j
	݃X^bN֐؊iłÕnĥ݁j

	o^ꂽ݃nȟďo

	^XNX^bN֐؊iłÕnĥ݁j
	if (łÕnh && reqflg) {
		if (enadsp && runtsk != schedtsk) {
			^XNfBXpb`
			^XNO[`̋Nicalltexj
		}
		else  {
			^XNO[`̋Nicalltexj
		}
	}
	WX^̕AiɃXNb`WX^j
	ݏ̃^[

	unhv́C݃nhCPUOnh̑́D
	ułÕnhv́u߂悪^XNvƌ邱Ƃ
	   łD
	------------------------------------------------------------

̒ŁCif̏ꍇł^XNO[`̋N
sKv邱ƂiC^XNO[`̋Ns
ۃ^XN͈قȂjCif͎̂悤ɍœKłꍇD

	------------------------------------------------------------
		if (enadsp && runtsk != schedtsk) {
			^XNfBXpb`
		}
		^XNO[`̋Nicalltexj
	------------------------------------------------------------


VDM68Ki68LC040jp̃^[Qbgˑ

(1) O

ׂẴ^XNX[p[oCU[hŎs邱ƂƂC[U[h
pȂD

(2) sReLXgCPUbN

^XNReLXg̓}X^[hC^XNReLXg͊݃[h
sDsense_context ́CSR ̃}X^^݃[hrbgQƂ
@ŎD

IPM  7 ̎iNMI ׂĂ݂̊֎~j̎ɌC 
CPUbNԂł̂ƂDsense_lock ́CSR  IPM QƂ
@ŎDNMI ̓J[l̊ǗO݂̊Ȃ̂ŁCCPUbNԂ 
NMI 󂯕t͍̂xȂD

chg_ipm T|[g邩ǂCSUPPORT_CHG_IPM `邩ǂ
ύXłD^XNReLXg IPM ύXꍇɂ́Cchg_ipm g
Ȃ΂ȂȂDchg_ipm T|[gȂꍇɂ́C^XNReLX
g IPM ύX邱Ƃ͂łȂD܂C^XNReLXgł́CIPM 
͏ 0 ɂȂĂD

chg_ipm T|[gꍇłCchg_ipm g IPM  7 ɕύX邱
Ƃ͋ȂD́Cchg_ipm  loc_cpu^unl_cpu ̊֌WGɂȂ邽
߂łD܂CIPM  1`6 ̎ɂC^XNfBXpb`͕ۗȂD 
IPM ́C^XNfBXpb`ɂāCVsԂɂȂ^XNֈ
pD̂߁C^XNsɁCʂ̃^XNɂ IPM ύX
ꍇD́CfBXpb`jBŎꍇɂ͑f
ł邪CjAŎꍇɂ͂ IPM ̐ݒ菈D
jAŎꍇɂ́CIPM  1`6 ̎ɂ^XNfBXpb`͕ۗ
ƂyłD

(3) ݃nho

M68KiM68020ȏjł́C݃nh̋NɂāCgpX^bN
IɊ݃X^bN֐؂芷邽߁C݃X^bNւ̐؊
͕KvȂDłÕnhł邩ǂ́CX^bNɐς܂ꂽ 
SR ̃}X^^݃[hrbgQƂĔ肵ĂD^XNfBX
pb`ƃ^XNO[`̋ŃCret_int [`ɔCĂ
D

reqflg `FbNOɊ݂֎~̂́C݂֎~ȂƁC 
reqflg `FbNɋNꂽ݃nhŃfBXpb`v
ꂽꍇɁCfBXpb`sȂ߂łD

interrupt_entry:
	movem.l %d0-%d1/%a0-%a1, -(%sp)	/* XNb`WX^ۑ */
	jsr <݃nh>		/* ݃nhĂяo */
	movem.l (%sp)+, %d0-%d1/%a0-%a1	/* XNb`WX^𕜋A */
	btst.b #4, (%sp)		/* ߂悪݃[hȂ */
	jbeq 1f				/*           Ƀ^[ */
	ori.w #0x0700, %sr		/* ݋֎~ */
	tst.l reqflg			/* reqflg  TRUE ł */
	jbne ret_int			/*              ret_int  */
1:	rte

(4) CPUOnho

M68Kł́CCPUOnh̋NɂĊ݃[hւ̈ڍs͂炸C
gpX^bN͐؂芷ȂD̂߁CCPUOnhŊ
[hɐ؂芷ĂD܂CłÕnhł邩ǂ𔻒肷
邽߂ɁC݃[hɐ؂芷O SR X^bNɕۑD^X
NfBXpb`ƃ^XNO[`̋ŃCret_exc [`
CĂD

CPUOnhւ̈́COX^bNt[̐擪ԒniȂ킿C 
CPUOnh̏oĂ΂ꂽ̃X^bN|C^jƂĂ
D

reqflg `FbNOɊ݂֎~̂́C݂֎~ȂƁC 
reqflg `FbNɋNꂽ݃nhŃfBXpb`v
ꂽꍇɁCfBXpb`sȂ߂łD

exception_entry:
	movem.l %d0-%d1/%a0-%a1, -(%sp)	/* XNb`WX^ۑ */
	lea.l 16(%sp), %a0		/* Ot[̐擪 A0  */
	move.w %sr, %d0			/* SR  D0  */
	and.w #~0x1000, %sr		/* ݃[h */
	move.l %d0, -(%sp)		/*  SR X^bNɕۑ */
	move.l %a0, -(%sp)		/* A0 Ƃēn */
	jsr <CPUOnh>		/* CPUOnhĂяo */
	addq.l #4, %sp			/* ̂Ă */
	move.l (%sp)+, %d0
	and.w #0x1000, %d0		/* ݃[hȂ */
	jbeq 1f				/*       Ƀ^[ */
	or.w #0x1700, %sr		/* }X^[hE݋֎~ */
	tst.l reqflg			/* reqflg  TRUE ł */
	jbne ret_exc			/*              ret_exc  */
1:	movem.l (%sp)+, %d0-%d1/%a0-%a1	/* XNb`WX^𕜋A */
	rte

(5) jÃfBXpb`

ȉ̃R[hł́Cchg_ipm ̓T|[gĂȂD܂C̗pȂR
[gł邽߁CeXgĂȂD

CTXB ́uVP mspv݂̂܂ލ\̂ƂD^XÑReLXǵC
}̂悤Ƀ^XÑX^bNɕۑDXNb`WX^iD0`D1CA0
`A1jƂ̑̃WX^ʁXɐςނ̂́C^XNO[`̋N
ɓs悢߂łD

 *   	+-----------------------------------+  TCB ɕۑĂ MSP
 *  	|                D2                 |
 *	+-----------------------------------+
 *		    . . . . . .
 *	+-----------------------------------+
 *	|                D7                 |
 *	+-----------------------------------+
 *	|                A2                 |
 *	+-----------------------------------+
 *		    . . . . . .
 *	+-----------------------------------+
 *	|                A6                 |
 *	+-----------------------------------+
 *	|                D0                 |
 *	+-----------------------------------+
 *	|                D1                 |
 *	+-----------------------------------+
 *	|                A0                 |
 *	+-----------------------------------+
 *	|                A1                 |
 *	+-----------------+-----------------+
 *	|        SR       |   PC (16bit)  |
 *	+-----------------+-----------------+
 *  	|   PC (16bit)  |    O     |
 *  	+-----------------+-----------------+  fBXpb`NO MSP

dispatch ́Ctrap_dispatch  TRAP߂ŌĂԊ֐ƂD

exit_and_dispatch:
	or.w #0x1000, %sr		/* }X^[h */
	jbra dispatch_1

trap_dispatch:
	movem.l %d0-%d1/%a0-%a1, -(%sp)	/* XNb`WX^ۑ */
	movem.l %d2-%d7/%a2-%a6, -(%sp)	/* c̃WX^ۑ */
	move.l runtsk, %a0		/* ReLXgۑ */
	move.l %sp, TCB_msp(%a0)
dispatch_1:
	move.l schedtsk, %a0
	move.l %a0, runtsk		/* schedtsk  runtsk  */
	jbeq dispatch_3			/* schedtsk 邩H */
	move.l TCB_msp(%a0), %sp	/* ReLXg𕜋A */
	movem.l (%sp)+, %d2-%d7/%a2-%a6	/* WX^𕜋A */
	btst.b #TCB_enatex_bit, TCB_enatex(%a0)
	jbeq dispatch_2			/* enatex  FALSE Ȃ烊^[ */
	tst.l TCB_texptn(%a0)		/* texptn  0 Ȃ烊^[ */
	jbeq dispatch_2
	jsr call_texrtn			/* ^XNO[`̌ďo */
dispatch_2:
	movem.l (%sp)+, %d0-%d1/%a0-%a1	/* XNb`WX^𕜋A */
	rte

dispatch_3:
	stop #0x2000			/* ݑ҂i݃[hj */
	/*
	 *  Ŋ݃[hɐ؂芷̂́CŔ銄ݏ
	 *  ɂǂ̃X^bNgƂ̉ƁC݃nh
	 *  ̃^XNfBXpb`̖h~Ƃ2̈ӖD
	 */
	or.w #0x1700, %sr		/* }X^[hE݋֎~ */
	tst.l reqflg			/* reqflg  FALSE Ȃ */
	jbeq dispatch_3			/*        dispatch_3  */
	clr.l reqflg			/* reqflg NA */
	jbra dispatch_1

ret_int:
	/*
	 *  ł́C݃[hE݋֎~ԁD
	 */
	move.l %a1, -(%sp)		/* A1 ݃X^bNɕۑ */
	movec.l %msp, %a1		/* ^XNX^bN A1  */
	move.l (%sp)+, -(%a1)		/* A1 ^XNX^bNɐς */
	movem.l %d0-%d1/%a0, -(%a1)	/* XNb`WX^ς */
	clr.l reqflg			/* reqflg NA */
	move.l runtsk, %a0		/* A0  runtsk */
	tst.l enadsp			/* enadsp  FALSE Ȃ */
	jbeq ret_int_3			/*         ret_int_3  */
	cmp.l schedtsk, %a0		/* runtsk  schedtsk Ȃ */
	jbeq ret_int_3			/*                  ret_int_3  */

	/* fBXpb` */
	movem.l %d2-%d7/%a2-%a6, -(%a1)	/* WX^ۑ */
	move.l %a1, TCB_msp(%a0)	/* ^XNX^bNۑ */
ret_int_1:
	move.l schedtsk, %a0
	move.l %a0, runtsk		/* schedtsk  runtsk  */
	jbne ret_int_2			/* schedtsk 邩H */
ret_int_1x:
	stop #0x2000			/* ݑ҂i݃nhj */
	or.w #0x0700, %sr		/* ݋֎~ */
	tst.l reqflg			/* reqflg  FALSE Ȃ */
	jbeq ret_int_1x			/*        ret_int_1x  */
	clr.l reqflg			/* reqflg NA */
	jbra ret_int_1
ret_int_2:
	move.l TCB_msp(%a0), %a1	/* ^XNX^bN A1  */
	movem.l (%a1)+, %d2-%d7/%a2-%a6	/* WX^𕜋A */

ret_int_3:
	btst.b #TCB_enatex_bit, TCB_enatex(%a0)
	jbeq ret_int_4			/* enatex  FALSE Ȃ烊^[ */
	tst.l TCB_texptn(%a0)		/* texptn  0 łȂ */
	jbne ret_int_5			/*           ret_int_5  */
ret_int_4
	movem.l (%a1)+, %d0-%d1/%a0	/* XNb`WX^𕜋A */
	move.l (%a1)+, -(%sp)		/* A1 ݃X^bNɕۑ */
	movec.l %a1, %msp		/* A1 ^XNX^bN */
	move.l (%sp)+, %a1		/* A1 ݃X^bN畜A */
	rte

ret_int_5:
	move.w 16(%a1), %d0		/* ߂ SR  D0  */
	move.l TCB_exinf(%a0), -(%a1)	/* exinf ^XNX^bN */
	move.l TCB_texptn(%a0), -(%a1)	/* texptn ^XNX^bN */
	move.l #ret_tex, -(%a1)		/* #ret_tex ^XNX^bN */
	clr.l TCB_enatex(%a0)		/* runtsk->enatex NA */
	clr.l TCB_texptn(%a0)		/* runtsk->texptn NA */
	move.w #O, -(%a1)	/* OX^bNt[ */
	move.l TCB_texrtn(%a0), -(%a1)
	move.w %d0, -(%a1)
	movec.l %a1, %msp		/* A1 ^XNX^bN */
	rte

^XNO[`ďõX^bN

 *   	+-----------------------------------+
 *  	|             ret_tex               |
 *	+-----------------------------------+
 *	|              texptn               |
 *	+-----------------------------------+
 *	|              exinf                |
 *	+-----------------------------------+
 *	|                D0                 |
 *	+-----------------------------------+
 *	|                D1                 |
 *	+-----------------------------------+
 *	|                A0                 |
 *	+-----------------------------------+
 *	|                A1                 |
 *	+-----------------+-----------------+
 *	|        SR       |   PC (16bit)  |
 *	+-----------------+-----------------+
 *  	|   PC (16bit)  |    O     |
 *  	+-----------------+-----------------+

ret_tex:
	addq.l #8, %sp			/* GÂĂ */
	or.w #0x0700, %sr		/* ݋֎~ */
	jsr call_texrtn			/* ^XNO[`̋N */
	movem.l (%sp)+, %d0-%d1/%a0-%a1	/* XNb`WX^𕜋A */
	rte

(6) jBi̗pj

\[XR[hQƁD

ȏ
