													TOPPERS Confidential
		TOPPERSץ ǥå
		Хϥɥ˴ؤ߷ץ

		: Ĺϡ̾Ųء
		ǽ: 2014ǯ928

ΰդ

ΥɥȤϡTOPPERS/ASPͥΥХϥɥ鵡ǽĥ˴
߷ץǤ롥

ǡ

ץå֤ɽǡOVRTIMkernel.h˴ޤ롥

----------------------------------------
typedef	ulong_t		OVRTIM;		/* ץå */
----------------------------------------

ץå֤˻ǤͤϡåȰ¸target_kernel.h
Ϥ饤󥯥롼ɤեˤΤȤ뤬ǥե
Ȥkernel.h˴ޤ롥

----------------------------------------
#ifndef TMAX_OVRTIM
#define TMAX_OVRTIM		ULONG_MAX
#endif /* TMAX_OVRTIM */
----------------------------------------

ޤХϥɥΥǡOVRHDRkernel.h˴ޤ롥

----------------------------------------
typedef void	(*OVRHDR)(ID tskid, intptr_t exinf);
----------------------------------------

¾ˡХϥɥ鵡ǽΥӥȴϢ
kernel˴ޤ롥

Ѥϡɥ񸻤ȥݡȤǤʤ

Хϥɥ¸ˡƥåγߤȯΤ
̤Υޡʰʲ򥪡Х󥿥ޤȸƤ֡ˤѤ롥Τᡤ
åȤˤäƤϡХϥɥ򥵥ݡȤǤʤͤ
롥ޤХϥɥ򥵥ݡȤ뤳Ȥǡڴˤ
륪Хإåɤˤʤͤ롥

ǡХϥɥ򥵥ݡȤǤˤϡåȰ¸
ơTOPPERS_TARGET_SUPPORT_OVRHDRޥΤȤ롥

Хϥɥ鵡ǽĥkernel.hǤϡTOPPERS_TARGET_SUPPORT_OVRHDR
ޥƤСTOPPERS_SUPPORT_OVRHDR롥

----------------------------------------
#ifdef TOPPERS_TARGET_SUPPORT_OVRHDR
#define TOPPERS_SUPPORT_OVRHDR			/* Хϥɥ鵡ǽĥ */
#endif /* TOPPERS_TARGET_SUPPORT_OVRHDR */
----------------------------------------

Хϥɥ鵡ǽϡTOPPERS_SUPPORT_OVRHDRƤ
Ȥ߹ࡥˤꡤХϥɥ鵡ǽĥѤå
¸Хϥɥ򥵥ݡȤƤΤߡХϥ
鵡ǽȤ߹ޤ뤳Ȥˤʤ롥

Хϥɥ˴Ϣǡ¤

Хϥɥ뤿ˡTCBˡĤץå֤ɽե
leftotmߤtask.hˡ

----------------------------------------
typedef struct task_control_block {
	...
	OVRTIM	leftotm;				/* Ĥץå */
	...
} TCB;
----------------------------------------

Хϥɥ餬ưƤʤ֤λϡleftotm0ꤹ뤳
Ȥmake_dormant0˽task.cˡ

----------------------------------------
void
make_dormant(TCB *p_tcb)
{
	...
	p_tcb->leftotm = 0U;
	...
}
----------------------------------------

ХϥɥФƤϡ֥åɬפʤDEF_OVR
Ǽ֥åΤߤѰդ롥֥å⡤ñ
ǤǽʬǤꡤǤɬפϤʤoverrun.hˡ

----------------------------------------
typedef struct overrun_handler_initialization_block {
	ATR			ovratr;			/* Хϥɥ° */
	OVRHDR		ovrhdr;			/* Хϥɥεư */
} OVRINIB;
----------------------------------------
extern const OVRINIB	ovrinib;
----------------------------------------

Х󥿥ޤư椫򼨤ե饰Ȥơboot_tѿ
ovrtimer_flagѰդoverrun.hoverrun.cˡ

----------------------------------------
extern boot_t	ovrtimer_flag;
----------------------------------------

󥰥ץåξˤϡХ󥿥ޤư椫ϡˡ
Ƚ̤뤳ȤǤ롥

	ƥȤǤϡ(p_runtsk->leftotm > 0U)λΤưƤ롥
	󥿥ƥȤǤϡưƤʤ

ΤᡤΥե饰ѤʤǽǤ뤬ޥץåؤ
ĥ䥿åȰ¸򲼤뤿ˡѤȤƤʼ
ݡMac OS XåȰ¸ǤϡѤƤˡ

Ĥץå֤¸

ǥѥå㤪ӳ߽CPU㳰νǡλĤץ
å֤¸ɬפ롥ŪˤϡʲΤ褦ʽɬ
פǤ롥

(a) dispatchؤ

ovrtimer_flagtrueǤСʤޤϡp_runtsk->leftotm0ǤʤСˡ
Х󥿥ޤߤĤץå֤p_runtsk->leftotm˳Ǽ
롥Ĥץå֤0ʤޤϤ̤ˤˤʤäƤˤϡ
p_runtsk->leftotm1Ǽ롥

(b) dispatchνи

㳰롼θƽФˡp_runtsk->leftotm0ǤʤС
ץå֤p_runtsk->leftotmȤƥХ󥿥ޤưϤ롥

(c) ߽CPU㳰

ovrtimer_flagtrueǤСХ󥿥ޤߤĤץå
֤p_runtsk->leftotm˳Ǽ롥Ĥץå֤0ʤޤϤ̤
ˤˤʤäƤˤϡp_runtsk->leftotm1Ǽ롥

νϡͥγߤ򤹤٤ƶػߤ֤ǹԤɬפ롥
ߡCPU㳰ȯľˤ٤ƤγߤػߤʤץåǤϡ
ߤػߤˤνԤɬפ롥

(d) ߽CPU㳰νи

ƥȤˡp_runtsk->leftotm0ǤʤСĤ
å֤p_runtsk->leftotmȤƥХ󥿥ޤưϤ롥

(e) νλ

ovrtimer_flagtrueǤСʤޤϡp_runtsk->leftotm0ǤʤСˡ
Х󥿥ޤߤ롥Ĥץå֤p_runtsk->leftotm˳
ǼɬפϤʤmake_dormant0Ǽˡ

(f) μ¹Գϻ

p_runtsk->leftotm0ǤʤСĤץå֤p_runtsk->leftotm
ƥХ󥿥ޤưϤ롥

åȰ¸Υ󥿥ե

Хϥɥ鵡ǽΥåȰ¸ǤϡХϥɥѤΥ
ޡʰʲХ󥿥ޤȸƤ֡ˤ뤿εǽ󶡤롥

ޤޥ롥

(1) TMAX_OVRTIM

ץå֤ȤƥХϥɥѥޤǤ͡ñ
̤ϥޥäȤ롥åȰ¸ʤˤϡkernel.h
ULONG_MAX롥

ޤ5ĤδؿѰդ롥

(1) void target_ovrtimer_initialize(intptr_t exinf)

Х󥿥ޤνԤޤưϤϹԤʤ

δؿϡtarget_timer.cfg˵ҤŪAPIˤꡤ롼
ƥͥϿ뤳ȤꤷƤ롥

(2) void target_ovrtimer_terminate(intptr_t exinf)

Х󥿥ޤ߽Ԥ

δؿϡtarget_timer.cfg˵ҤŪAPIˤꡤλ롼
ȤƥͥϿ뤳ȤꤷƤ롥

(3) void target_ovrtimer_start(OVRTIM ovrtim)

Х󥿥ޤovrtimǻꤷ֤вᤷߤȯ
ꤷưϤ롥ovrtimñ̤ϥޥäȤ롥

(4) OVRTIM target_ovrtimer_stop(void)

Х󥿥ޤߤޤλĤ֤ɤ߽Ф⤷Ĥ֤
0ʤޤϤ̤ˤˤʤäƤˤϡ1֤ޤХ󥿥
ޤγߤ򥯥ꥢ롥

(5) OVRTIM target_ovrtimer_get_current(void)

Х󥿥ޤλĤ֤ɤ߽Ф⤷Ĥ֤0ʤޤϤ̤
ˤʤäƤˤϡ0֤Х󥿥ޤγߤϥꥢ


Ĥץå֤¸μʥå¸

νƤǡ(a)(c)ϡƽФ郎㤦ǽƤƱ
Ǥ뤿ᡤ¸ؿovrtimer_stop򥿡å¸ߤ
åȰ¸γս꤫ƤӽФ褦ˤ롥

----------------------------------------
void
ovrtimer_stop(void)
{
	if (ovrtimer_flag) {
		assert(p_runtsk->leftotm > 0U);
		p_runtsk->leftotm = target_ovrtimer_stop();
		ovrtimer_flag = false;
	}
}
----------------------------------------

ޤ(b),(d),(f)⡤ƽФ郎㤦ǽƤƱǤ뤿ᡤ
¸ؿovrtimer_start򥿡å¸ߤåȰ¸
γս꤫ƤӽФ褦ˤ롥

----------------------------------------
void
ovrtimer_start(void)
{
	if (p_runtsk->leftotm > 0U) {
		target_ovrtimer_start(p_runtsk->leftotm);
		ovrtimer_flag = true;
	}
}
----------------------------------------

(e)ϡĤץå֤p_runtsk->leftotm˳ǼɬפϤʤ
(a),(c)ȽƤۤʤ뤬p_runtsk->leftotmmake_dormant0˽
뤿ᡤmake_dormantƤӽФǤСovrtimer_stopήѤ뤳
ȤǤ롥ǡext_tsk˼νätask_manage.cˡ

----------------------------------------
ER
ext_tsk(void)
{
	...
	(void) make_non_runnable(p_runtsk);
|#ifdef TOPPERS_SUPPORT_OVRHDR
|	ovrtimer_stop();
|#endif /* TOPPERS_SUPPORT_OVRHDR */
	make_dormant(p_runtsk);
	...
}
----------------------------------------

Ĥץå֤¸μʥåȰ¸

(a) dispatchؤ

----------------------------------------
void
dispatch(void)
{
|#ifdef TOPPERS_SUPPORT_OVRHDR
|	ovrtimer_stop();					/* Х󥿥ޤ */
|#endif /* TOPPERS_SUPPORT_OVRHDR */
	å쥸٤ƤΥ쥸򥹥å¸
	...
}
----------------------------------------

(b) dispatchνи

----------------------------------------
void
dispatch(void)
{
	...

  dispatch_r:
	å쥸٤ƤΥ쥸򥹥å
|#ifdef TOPPERS_SUPPORT_OVRHDR
|	ovrtimer_start();					/* Х󥿥ޤư */
|#endif /* TOPPERS_SUPPORT_OVRHDR */
	calltex();  (*b)
}
----------------------------------------

(c) ߽CPU㳰

߽CPU㳰ϼ̤˽롥

----------------------------------------
void
<ߤν>(void)
{
	å쥸򥹥å¸
	if (ƥȤǳȯ) {
|#ifdef TOPPERS_SUPPORT_OVRHDR
|		ʾʤȤ˥ͥγߤػߤ֤ˤ
|		ovrtimer_stop();				/* Х󥿥ޤ */
|		ɬפʤ˸ξ֤᤹
|#endif /* TOPPERS_SUPPORT_OVRHDR */
		å󥿥ƥѤΥåڤ괹
								󥿥ƥȤڤ괹
	}
	...
}
----------------------------------------
void
<CPU㳰ν>(void)
{
	å쥸򥹥å¸
	if (ƥȤCPU㳰ȯ) {
|#ifdef TOPPERS_SUPPORT_OVRHDR
|		ʾʤȤ˥ͥγߤػߤ֤ˤ
|		ovrtimer_stop();				/* Х󥿥ޤ */
|		ɬפʤ˸ξ֤᤹
|#endif /* TOPPERS_SUPPORT_OVRHDR */
		å󥿥ƥѤΥåڤ괹
								󥿥ƥȤڤ괹
	}
	...
}
----------------------------------------

(d) ߽CPU㳰νи

߽CPU㳰νиϼ̤˽롥

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

			  ret_int_r:
				å쥸٤ƤΥ쥸򥹥å
			}
|#ifdef TOPPERS_SUPPORT_OVRHDR
|			ovrtimer_start();			/* Х󥿥ޤư */
|#endif /* TOPPERS_SUPPORT_OVRHDR */
			calltex();  (*b)
		}
|#ifdef TOPPERS_SUPPORT_OVRHDR
|		else {
|			ʾʤȤ˥ͥγߤػߤ֤ˤ
|			ovrtimer_start();			/* Х󥿥ޤư */
|		}
|#endif /* TOPPERS_SUPPORT_OVRHDR */
	}
	...
}
----------------------------------------
void
<CPU㳰ν>(void)
{
	...

			  ret_exc_r:
				å쥸٤ƤΥ쥸򥹥å
			}
|#ifdef TOPPERS_SUPPORT_OVRHDR
|			ovrtimer_start();			/* Х󥿥ޤư */
|#endif /* TOPPERS_SUPPORT_OVRHDR */
			calltex();  (*b)
		}
|#ifdef TOPPERS_SUPPORT_OVRHDR
|		else {
|			ʾʤȤ˥ͥγߤػߤ֤ˤ
|			ovrtimer_start();			/* Х󥿥ޤư */
|		}
|#endif /* TOPPERS_SUPPORT_OVRHDR */
	}
	CPU㳰Υ꥿ǡCPUå֡å֤
								CPU㳰ȯξ֤褦˽
	å쥸򥹥å
	CPU㳰Υ꥿
}
----------------------------------------

(e) νλ

å¸ext_tskб

(f) μ¹Գϻ

----------------------------------------
void
activate_context(TCB *p_tcb)
{
	...

  start_r:
|#ifdef TOPPERS_SUPPORT_OVRHDR
|	ovrtimer_start();					/* Х󥿥ޤư */
|#endif /* TOPPERS_SUPPORT_OVRHDR */
	CPUå֤ˤ
	p_runtskˤεưϤ򡤳ĥѥ᡼ȤƸƤӽФ
	ext_tskʬ ... (*c)
}
----------------------------------------

ХϥɥθƽФμ

Х󥿥ޤλߤȯˤϡåȰ¸
ߥϥɥʤޤϡߥӥ롼ˤ顤å¸
call_ovrhdrƤӽФ

ǡХ󥿥޳ߥϥɥεưȡsta_ovrstp_ovrθƽ
ζ꤬롥ȤơХ󥿥ޤλľˡ
¾ιͥ٤γߤȯνǥХϥɥ餬ư
ϡʻĤץåϹˤ줿ߤ줿礬ˤʤ롥
ξ硤Х󥿥޳ߥϥɥǡХϥɥ
ӽФʤ褦ˤ٤Ǥ롥

å¸call_ovrhdrμϼ̤ꡥ

----------------------------------------
void
call_ovrhdr(void)
{
	assert(sense_context());
	assert(!sense_lock());
	assert(ovrinib.ovrhdr != NULL);

	i_lock_cpu();
	if (p_runtsk!= NULL && p_runtsk->leftotm == 1U) {
		p_runtsk->leftotm = 0U;
		i_unlock_cpu();

		LOG_OVR_ENTER(p_runtsk);
		((OVRHDR)(ovrinib.ovrhdr))(TSKID(p_runtsk), p_runtsk->p_tinib->exinf);
		LOG_OVR_LEAVE(p_runtsk);
	}
	else {
		/*
		 *  Υ롼󤬸ƤӽФˡХϥɥεư
		 *  󥻥뤵줿
		 */
		i_unlock_cpu();
	}
}
----------------------------------------

p_runtskNULLξθƤΤϡץꥢߤФХ
ݤ뤿Ǥ롥

ХϥɥθƽФˡƽФξ֡CPUåͥ
ޥˤᤵʤΤϡΥ롼󤫤Υ꥿ˡ߽и
Ǹξ֤᤹Ǥ롥

call_ovrhdrϡߥϥɥ餫ʤޤϡߥϥɥȤơ˸Ƥӽ
뤿ᡤΥ롼ޤǤˡovrtimer_stopƤФƤʤ
Х󥿥ޤߤƤˡ

ߥϥɥϡʲΤ褦ŪAPItarget_timer.h˵Ҥ
뤳ȤǹԤΤȤʥåȤλѹƤ褤ˡ

----------------------------------------
#ifdef TOPPERS_SUPPORT_OVRHDR
ATT_INI({ TA_NULL, 0, target_ovrtimer_initialize });
ATT_TER({ TA_NULL, 0, target_ovrtimer_terminate });
CFG_INT(INTNO_OVRTIMER, { TA_ENAINT | INTATR_OVRTIMER, INTPRI_OVRTIMER });
DEF_INH(INHNO_OVRTIMER, { TA_NULL, target_ovrtimer_handler });
#endif /* TOPPERS_SUPPORT_OVRHDR */
----------------------------------------

ŪAPIΡINHNO_OVRTIMERINTNO_OVRTIMERINTPRI_OVRTIMER
INTATR_OVRTIMER4Ĥϡtarget_timer.h롥

Хإåɤ㸺ˡ

ʾˡǤϡåȰ¸Υ֥ǵҤ뤳
ꤷɤ顤å¸ovrtimer_start
ovrtimer_stopƤӽФƤ뤬δؿûΤǡ֥
ŸΨ褤δؿ򥢥֥Ÿ
ˤϡ줾졤OMIT_OVRTIMER_STARTOMIT_OVRTIMER_STOPޥ
롥

ޥץåбͥؤб˴ؤ

ޥץåбͥˤơsta_ovrista_ovrstp_ovr
istp_ovr򡤸ƤӽФñ̤Ȱۤʤץå˳դ줿
оݤȯԤμϹפפ롥

Ūˤϡоݥդ줿ץåФƥץåֳ
ߤ򤫤뤳ȤˤäơоݥΥХϥɥư򳫻ϡ
ߤ뤳ȤɬפǤ뤬ߤǸƤӽФovrtimer_stopǡ
ovrtimer_flag(p_runtsk->leftotm > 0U)Ӥʤʤ뤿ᡤפפ
ΤȻפ롥

ʾ
