
		TOPPERS/FMPͥ
		߷ץ

		бС: Release 1.0.2
		ǽ: 2009ǯ612

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

----------------------------------------------------------------------
 TOPPERS/FMP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Flexible MultiProcessor Kernel

 Copyright (C) 2005-2009 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: design.txt 358 2009-08-28 05:36:38Z ertl-honda $
----------------------------------------------------------------------

ܼ

TOPPERS/FMPͥμ߷
ưƥ
ǡ¤߷
å߷
acquire_xxx_lock() λ͸Ƥ
νդץå䥫ͥǡ־λ
饹ǻꤹʳΥǡ¤־λˡ
ޥ졼ʸ߻͡
ޥ졼󥿥ߥ󥰤˴ؤͻ
mact_tsk()߷
  ter_tskμ¹Ծ»
mact_tsk() θƤʼäС
ter_tsk¤ߤͳ
ͥƥåΥޥץåĥ
TOPPERS/SMPͥǤɲä¾ѤAPIΰ
ʣΥԤ˴ؤα

ǥåɥå
ACUIRE_LOCKȴ

TOPPERS/FMPͥμ߷

TOPPERS/FMPͥʰʲFMPͥˤϡTOPPERS奫ͥδ
פȤʤTOPPERS/ASPͥʰʲASPͥˤޥץåĥ
ꥢ륿५ͥǤ롥

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

TOPPERS/FMPͥμ߷פԤˤꡤASPͥ᤿ˤ
äơˤꤹ롥

(1) ROMŪ礭ʥѲǽȤ

ROMǡ֤Ϻ٤ꤷʤȤˤ롥ϡƤΥץå
ץ饤١ȥ˥ԡĤȤƤǤ뤫Ǥ롥Τᡤ
֥Ȥν֥å뤳ȤȤ롥֥
å(RAMǡ)ϡ̤ѿ롥

(2) ͡ʥƥΥޥץåƥΥݡ

ޥץåƥΥƥ¿¿ͤǤꡤξư
OSϡΥƥͭѤưɬפ롥
ǡFMPͥǤϰʲΥƥΥХꥨ򥵥ݡȤ롥

ޥƥ
  Х륿
  륿

OSΥåƥ
  㥤ȥå
  ץåå
  γ٥å

ԥåƥ
  ͥƥ
  ߥ졼

ꥢƥ
  ǡ־

ưƥ

FMPͥϼΥƥΥޥץåƥư롥

(a)ƥץåǡץǡФơƱ쥢ɥ쥹ǥ
   ǽǤ뤳ȡ줾ΥץåʪŪʥ
   ꤬ۤʤäƤƤ褤

(b)ץå顤ƱΥɥ쥹ǥǽRAM뤳ȡ
   ͥΥȥ֥åϤΰ֤
   
(c)ǤդΥץå˳ߡʥץåֳߡˤȯǽǤ뤳

(d)ץå֤Ǥ¾ΤεĤ
    : test & set ̿ᡤ Mutexϩ

(e)ץå֤¾浡Ѥƥå1ĺǽǤ뤳
   1ĤΤߤξϥ㥤ȥåΤߥݡȲǽ
   ץå2+1ĺǽǤȥץåå򥵥ݡȲǽ
   åκĿ˾¤ʤȺγ٥å⥵ݡȲǽ

(f)ƥץåˡID򥽥եȥɤ߹ळȤ
   ꡤץåȽ̲ǽǤ뤳ȡ


ǡ¤߷



ꥢƥˤäƼκŬǽʤ褦߷ס

ץåȥ֥åPCB

ץå˻ѿݻ빽¤ΤǤꡤkerflg, p_runtsk, 
p_schedtsk ޤޤ롥

kernel_cfg.c ǥץå˰ۤʤѿȤ롥ƥץå
PCB򥢥뤿ᡤPCBΥݥ󥿤 kernel_cfg.c 
(p_pcb_table[])
  
    PCB _kernel_prc1_pcb;
    PCB _kernel_prc2_pcb;

    PCB* const p_pcb_table[TNUM_PRC] = {
      &_kernel_prc1_pcb,
      &_kernel_prc2_pcb
    };
 
ͥǡץåPCBڤӡPCBǤ򥢥սϡ
٤ my_xxx ȤƵҤƤ롥 my_xxx ϡץåINDEX
p_pcb_table[]롥

    #define my_pcb         (p_pcb_table[prc_index()])
    #define my_p_runtsk    (my_pcb->p_runtsk)

TCBϡTCBǴƤ륿¹ԤץåPCBؤΥݥ
ФȤƻġCYCCBϡCYCCBǴƤϥɥ¹
ץåPCBؤΥݥ󥿤ФȤƻġ

।٥ȥȥ֥å(TEVTCB)

।٥Ȥ˴Ϣǡ¤(systime_offset, current_time)
ޤƤ빽¤Ρkernel_cfg.c 롥륿ξ
ץå롥Х륿ξ1롥

।٥ȥҡפ˴ؤƤϡTEVTCB ȤΩΥݥ
 TEVTCB Ͽ롥।٥ȥϥɥϥޥ졼ǽ
뤿ᡤ।٥ȥҡפΥϡƥƤΥ।
ȥϥɥϿǽʥȤ롥դǽץåξѤ
ƺŬ뤳ȤϲǽǤ롥

ƥץåTEVTCB˥뤿ᡤTEVTCBΥݥ󥿤 
kernel_cfg.c (p_tevtcb_table[])

ͥμץå TEVTCB ڤӡTEVTCB Ǥ򥢥
սϡ٤ my_xxx ȤƵҤƤ롥 my_xxx ϡץå
INDEXp_tevtcb_table[]롥

PCBϡΥץåǻѤ TEVTCB ؤΥݥ󥿤ġ


֥ȤΥȥ֥å

֥Ȥμˡƥ֥ȤΥȥ֥åؤΥ 
󥿤Ͽơ֥ʥơ֥ˤ롥IDֹ椫饳
֥åϡΥơ֥Ѥ
롥

   TCB* const p_tcb_table[TNUM_TSKID] ={
    	&_kernel_tcb_TASK1_1,
    	&_kernel_tcb_TASK1_2,
        ...
   }

֥Ȥν֥å

ROMǡǤ륪֥Ƚ֥åϡASPͥƱͤۤ
롥ϡROMǡǤ뤿ᡤƥץåǽʣƻ
Ƥ꤬ʤǤ롥ޤñΤѿȤϡ
ơ֥뤬ɬפȤʤ뤬Υơ֥뤬ɬפȤʤΤϡ
ΤߤǤ뤿ᡤ̵̤礭

Ԥ֥å

ASPͥǤϡWINFOWINFO_WOBJˤTMEVTB ϡå˳
ݤ롥ˡǤϡå򥿥°ץåΥ
饤١ȶ֤֤硤¾Υץå饢뤳ȤǤ
ʤΤᡤFMPͥǤϡԤ֥åTCB˳ݤ뤳
Ȥ롥


ASPͥǤϡ֥Ȥ।٥ԤǤʤϡWINFO
p_tmevtb NULLꤷƤԤ֥åTCB˳ݤȡ
NULLǤʤᡤTMEVTBcallbackNULL뤳Ȥˤꡤ
।٥ԤǤʤȤꤹ롥


å߷



ƥ˱ơåڤؤ褦ˤ롥

Υå򥵥ݡ

a˥㥤ȥå(G_KLOCK)
     ƥ1ĤΥåG_LOCK

b˥ץåå(P_KLOCK)
     ץå˥ΤΥåP_LOCK
     ץå˥֥ȤΤΥåO_LOCK

c˺γ٥å(F_KLOCK)
     ץå˥ΤΥåP_LOCK
     ֥˥֥ȤΤΥåO_LOCK
    
åλˡ

åȰ¸ target_config.h ǡޥ TTYPE_KLOCK  
G_KLOCK/P_KLOCK/F_KLOCKΤ줫

ɤڤؤ

ƥƥॳϡF_LOCK˵Ҥ롥åʬϥޥ
ȤƥޥϥåΤ֥ȥå
ΤܤΥåμʤΤʬ롥

å֥Ȥε

 㥤ȥå
   G_LOCK : ХѿȤƳ

 å
   P_LOCK : PCB˳
   O_LOCK : PCB˳

 γ٥å
   P_LOCK  : PCB˳
   O_LOCK  : ƥ֥ȤΥȥ֥åǳ

åޥؤΰ

åޥˤϡPCBϤ

֥ȥåޥˤϡ֥ȥȥ֥å
ζʬ(WOBJCB)Ϥ

 G_KLOCK  : ܤΥåǥ㥤ȥå
 P_KLOCK  : ʤ
 F_KLOCK  : ʤ

ǥåɥå

G_KLOCKξϡǥåɥåɬפʤǥåɥåɬפ
ȤΥɤѹ礭Τǡifdef ڤʬ롥

 ext_tsk
 ter_tsk
 chg_pri
 rel_wai
 irel_wai
 make_non_wait
 wait_tmout

ñ̤δ֥åp_pcbΥ˴ؤå

ñ̤δ֥åˤϡդΥץåΥץå֥
PCBˤؤΥݥ󥿡p_pcbˤ롥

νñ̤δ֥åp_pcbϡå˥ǽȤ롥
å˥ޥ졼ȯơp_pcbƤ
Ѥǽ뤿ᡤå˥å롥


acquire_xxx_lock() λ͸Ƥ

߱ȥƥॳμ¹Ի֤θơacquire_xxx_lock() 
߷פԤ

λͤϡåǤfalse򡤥åǤʤ
ĳߤǤtrue֤褦߷פˤʤäƤ롥

ͥ̾å롼ϼΤ褦ˤʤäƤ롥

//ܤΥå롼
#define T_ACQUIRE_TSK_LOCK(p_pcb) {
	t_lock_cpu();
	if (acquire_tsk_lock(&(p_pcb->tsk_lock))) {
		t_unlock_cpu();
		goto retry;
	}
}

//2ܤΥ֥ȥå롼
#define T_ACQUIRE_NESTED_LOCK(p_pcb, p_wobjcb) {
	if (acquire_tsk_lock(&(p_pcb->tsk_lock))) {
		release_obj_lock(&(GET_OBJLOCK(p_wobjcb)));
		t_unlock_cpu();
		goto retry;
	}
}

åȤˤäƤϡߤȯ̵ͭåǤʤΤ褦
åȤǤacquire_xxx_lock() ϥԥåǤʤ
true֤ͤȤʤäƤޤξ硤2ʥåξ硤2ܤμ
Ԥ1ܤΥåʤФʤ餺ƥॳμ¹
֤ʿͤʤȹͤ롥

ʿͤβ׸Ƥ

ʿͤˡȤơΤ褦ˡͤ롥1ܤΥå
򳰤˳ߤ򤤤äĤ롥ߤäϡå
ɬפΤǡ1ܤΥåϿѿѰդѿ1Ĥ
ĥ֥ȥåǤ褤Ϥˡ

POBJLOCK p_locked_objlock[TNUM_PRC];

#define my_p_lockd_objlock p_locked_objlock[prc_index()];

#define T_ACQUIRE_TSK_LOCK(p_pcb) {
	t_lock_cpu();
	if (acquire_tsk_lock(&(p_pcb->tsk_lock))) {
		t_unlock_cpu_and_wait();
		goto retry;
	}
}

#define T_ACQUIRE_NESTED_LOCK(p_pcb, p_wobjcb) {
	my_p_lockd_objlock = &(GET_OBJLOCK(p_wobjcb));
	while (acquire_tsk_lock(&(p_pcb->tsk_lock))) {
		/* åǤʤϤäߤ򳰤 */
		t_unlock_cpu_and_wait();
		t_lock_cpu();
		if (my_p_lockd_objlock == NULL) {
			/* ߤǥå줿ϥȥ饤 */
			t_unlock_cpu();
			goto retry;
		}
	}
	my_p_lockd_objlock = NULL;
}

Interrupt Handler

if (my_p_lockd_objlock != NULL) {
	release_obj_lock(lock_obj_lock);
	my_p_lockd_objlock = NULL;
}


νդץå䥫ͥǡ־λ

׷

ϥɥνñ̤¹Ԥץå򥳥ե졼
եǻǽȤ롥P_KLOCK ξ硤ñ̰ʳΥ֥
ȤɤΥץåΥåǥɤ뤫ե졼ե
ǻǽȤ롥ƥˡƥ֥Ȥδ֥å
κŬ־ϰۤʤ뤿ᡤ֥Ȥδ֥åλ
CFGǲǽȤ롥

饹

νդץå䥫ͥǡ־λꤹ뤿ˡ
饹γǰƳ롥

 ƥˤʣΥ饹Ƥ롥

 饹ˤϡ1Ϣ³IDֹ椬դ

 ֥ȤϤ줫Υ饹°ɬפ롥

 ֥Ȥ°륯饹Ū˻ꤹ(ưŪѹǤʤ)

 饹
   ȥ֥å־
   åʥǡ塼סˤ־
   Ѥåʽñ̰ʳ
   դץåʽñ̡
   դǽץåʽñ̡

 饹ϥåȰ¸롥

 ֥Ȥ°륯饹λϡե졼ե
   ǥ饹ΰϤߤ˥֥  ȤŪAPI򵭽Ҥ뤳Ȥǻꤹ롥

   CLASS(TCL_1){
      CRE_TSK(TASK1, .....);
      CRE_SEM(SEM1, ....);
   }
    
ǡ¤

ñ̤γդǽץåϡ֥å˿ʥȥ
ɲäƳǼ

֥åRAMǡ־λˡϡkernel_cfg.c 
RAMǡФơϤ뤳Ȥˤ¸롥
ƤϡåȰ¸롥

gnu  ϼΤ褦ˤʤäƤ롥

__attribute__((section(".shared"),nocommon));
  nocommonĤʤϡͤɬפ롥(bss
  Ƥޤ)

饹Ƥ

饹ϡåȰ¸Υե졼ƥץ졼ȥե


 NUM_CLASS : 饹

饹ƤϡåȰ¸Υե졼ƥץ졼ȥ
ǡʲϢ

 CLASS_AFFINITY_INIT
   դץå
 CLASS_AFFINITY_MASK
   ޥ졼ǽʥץåΥޥ
   0ӥåȤINDEX0Υץåб"1"ǥޥ졼ǽ
 CLASS_SECTION_TSKCB
   ȥ֥åΥ
 CLASS_SECTION_OBJCB
   ȥ֥åΥ
 CLASS_SECTION_TSTACK
   åΥ
 CLASS_OBJ_LOCK
   ֥ȥå


饹ǻꤹʳΥǡ¤־λˡ

kernel_cfg.c RAMǡΤ饹ǻꤷʤǡ
־λˡ롥

ե졼ƥץ졼ȥե롤դꥹȤơ
ƥץåǥå롥

 PRC_SECTION_PCB
   PCBΥ
 PRC_SECTION_ISTACK
   󥿥ƥѥåΥ
 PRC_SECTION_TEVT
   TEVTCBΥ
    tmevt_heapΥ
    G_TIMERξΥϥǥå0
 PRC_SECTION_SYSLOGCB
     syslogcbΥ

ƥॵӥʥꥢɥ饤СˤѤǡ¤
־λФƤϡtarget_syssvc.h ǻꤹ롥

 
   SEC_PRC1_LOGTASK
   SEC_PRC2_LOGTASK
     ...

 ꥢɥ饤
   SEC_SERIAL1
   SEC_SERIAL2
     ..


ޥ졼ʸ߻͡



ϥץåưʥޥ졼˲ǽȤ롥ޥ졼
ǽʥߥ󥰤׸ƤǤ롥

켡Ǥϲa,b,򥵥ݡȡ¾Υߥ󥰤ǸƤӽФE_OBJ
롥

  (a) ƥȤ鼫ץå¾ΥФ
  (b) Υޥ졼

API

 mig_tsk(ID tskid, ID prcid)
   ⤷ϡƥॳƤӽФդ줿ץ
     å˳դ줿ǽ

 act_tsk(ID tskid)
   򸽺߳դ줿ץåǼ¹Ԥ롥
   塼󥰤ϡλ塤դƤץ
     åǥ¹Ԥ롥
  
ƾ֤ΥФޥ졼

 1.ٻ߾֤Υ 
   դȰưΥץåΥå
   TCB p_pcb ưΥץåPCB򼨤褦ꤹ롥
   դȰưΥץåΥå

   
     ¾Υˤޥ졼󤵤ǽ뤿ᡤ  
       塤ץåγդѤäƤʤå  
       ɬפ롥
    åμ˴ؤƤϡǥåɥåɬפǤ뤿ᡤ
      åϼ㤤ˤȤ뤳ȤȤ롥

  롼
    ưȰưΥץåIDå
    ID㤤Υå
    ưƤʤå
      ưƤХȥ饤
    p_pcb ؤ
    å

 2.Ԥ֤Υ
  1Ʊ
  suspend_runningβǽ

 3.Ԥ֤Υ(।٥ȥҡפϿʤ)
  1Ʊ
    
 4.ƥȤ鼫ץåμ¹Բǽ֤Υ
  1 + ǥ塼ɲú

 5.Ԥ֤Υ(।٥ȥҡפϿ)
  global ͥ륿ޡ ξ
    å꤬ʸҡ
  local ͥ륿ޡ ξ
    TCB TEVTCB Ͽ륨ȥ꡼ɲ
    ॢȽϿ˽°ƤץåǹԤ
    TCB TEVTCB Ͽ륿ߥ󥰤׷
       ।٥ȥҡפ٤
    ।٥ȥåȴϢ뤿׸Ƥ
       ǥåɥåȯǽ뤿ᡤ塼ؤ
         ԤʳƥץåΥޤ礭ʤ
        ʻ֤ĹۤĴ
          
 6.
  
    ƥ¸
    󥿥ƥȤΥåڤؤ
    migrate_task()


ޥ졼󥿥ߥ󥰤˴ؤͻ

оݥξ

ޥ졼󤹤оݤΥξ֤ˤꡤޥ졼μ¸
񤷤Ȥʤ롥

ʥߥ
   a.ƥȤƱץå˳դƤ¾Υ
     Ф

交ʥߥ
   b.󥿥ƥȤƱץå˳դƤ륿
     Ф
     ߤνиǥޥ졼ԤʤФʤʤᡤ
       åμɬפˤʤ롥åμϥȥ饤Ԥʤ
     оݥ¹Ծ֤ΤȤΤAPIμ¹Ԥٱ䤷Ƥޤ
       ֤ˤAPIο񤤤Ѥͤ򤱤

ʥߥ
  c.runtsk or shcedtskؤƤ륿Υޥ졼
   ΥɤǤϡǥѥåϥå˼¹Ԥ뤿
     ᡤǥѥå˥ޥ졼󤹤ǽ롥

ޥ졼μ¸ˡ

 󥿥ƥȤƱץå˳դƤ¹Բǽ
   ֤ΥФ
    (a)Ʊˡǲǽ

 󥿥ƥȤƱץå˳դƤ¹Ծ
   ΥФ
   
    TCBmigflgɲá¹Ծ֤Υξmigflg˰ưΥ
      åΥץåID졤reqflg    trueˤ롥          

    ߥϥɥνиǥޥ졼Ԥ
      dspflgΥåterflgåλ塤ƥ
        ¸
      󥿥ƥȤΥåڤؤ
      migrate_task()
        åμ
        ץåΥǥ塼Ф
        ưΥץåΥǥ塼
        ߤȯ
        åβ
        exit_and_dispatch()
    åΥȥ饤ˤԲǽ

 ¾Υץåμ¹Ծ֤Υ
   schedtskˤʤäƤʤʤ
    
 ¾Υץåμ¹Բǽ֤Υ
   migflg˥å

Ƥ

  ¾ΥץåΥоݤAPIȯԤơ¹Ծ֤Ǥϼԡ
    Բǽ֤ǤϼԤ륹ڥåϼ뤫

  ߤνиǤΥޥ졼μ¸ˡθƤ


mact_tsk()߷

API

  act_tsk(ID tskid)
  iact_tsk(ID tskid)
   °ץåǼ¹Ԥ롥
   塼󥰤ϡλ塤λ˳դƤ
     ץåǥ¹Ԥ롥

  ter_tsk(ID tskid)
   λ
   ȯԤƱץå˳դƤ륿Τߤ
     ǽȤ
   ¹Ի֤ξ¤ޤʤǥȥ饤

  mact_tsk(ID tskid, ID prcid)
  imact_tsk(ID tskid, ID prcid)
   ץåꤷƥư롥
   prcid0ꤹȡդץåǵư롥
   塼󥰤ϼư˻ꤷץåǵư


¸θƤ

amact_tsk()оݤΥٻ߾֤ξ

ter_tsk()¤ߤᡤϲŪʾ֤Ȥʤʤᡤ
ϡɬٻ߾֤ȤʤäƤϤǤ롥
    
bmact_tsk()׵᤬塼󥰤

塼󥰤줿ưԤΤϡext_tsk()  ter_tsk() Ǥ롥
ext_tsk()˴ؤƤϡФޥ졼Ʊν
ʤ

ter_tsk()˴ؤƤϡFDMPƱͤˡǥåɥåΤˤä
åݤ pend_tertsk 򥻥åȤ¾Υƥॳˤ
֤սǡλȺƵư򤹤ͤ롥
ʤ顤ˡǤϡ¾Υץåˤޥ졼ȯƤ
ޤᡤFMPͥǤϡpend_tertsk 򥻥åȤter_tsk ǥ
饤ter_tsk ǽλȺƵưԤ

ǡ¤

TCB "ID actprc"ɲäεưΥץå(0Ǹ߳դΥ
å)򼨤


mact_tsk() θƤʼС

APIͰ1

 act_tsk(ID tskid)
   iact_tsk(ID tskid)
   °ץåǼ¹Ԥ롥
   塼󥰤ϡλ塤λ˽°Ƥץ
     åǥ¹Ԥ롥

 mact_tsk(ID tskid, ID prcid)
   imact_tsk(ID tskid, ID prcid)
   ץåꤷƥ¹Ԥ롥
   塼󥰤ϡλ塤ꤷץåǥ
     ¹Ԥ롥
   prcid0ꤹȡ°ץåǵư롥

 mig_tsk(ID tskid, ID prcid)
   °Ƥץå˽°Ƥ¹Ծ֡ٻ߾֡
     Ԥ֤Υ⤷ϼǽ
   ǥѥåػΥȯԤȡǥѥåĻ˥ޥ
     졼Ԥ

APIͰ1μ¸κ

P_KLOCK⤷F_KLOCK˼¸Ȥʤ롥

塼󥰤Ƥ֤ǡλ硤ޤ 
°ƤץåΥåƽλθ塤ưΤ
ᡤ˼¹ԤץåΥåʽ°⤷mact_tskǻꤷ 
 ˤɬפ롥

ext_tsk()Ǥϡʤter_tsk() Ǥϥ֥Ԥξ硤ǥ
ɥåΤᡤäåᡤλȺƵư¾
սǼ¹Ԥǽ롥FMPͥǤϡmake_non_wait()Ǽ¹Ԥ
롥

make_non_wait()ϰʲδؿƤӽФ
  wait_complete()
  wait_tmout()
  wait_tmout_ok()
  wait_release()
  init_wait_queue()

(a)1 

ƥॳ뤫ƤӽФؿǥå뤿ᡤȥ饤
Ѥåμʤ

(b)2

ƴؿˤĤƤδؿǥåμľǽƤ롥

 wait_complete()
   ƥॳ뤫鿧ƤӽФ
   ƤӽФ塤dispatch_request()ƤӽФ
   ʤȻפ

 wait_tmout()
 wait_tmout_ok()
   ।٥ȤΥХåؿȤƸƤӽФ
   ǥåƤΤʤ

 wait_release()
   rel_wai()
   irel_wai()
   ʤȻפ

 init_wait_queue()
   ʤȻפ

 
  1. pend_tertsk åȲ⤷ʤȤ
  2. ter_tsk μ¹Ծ»֤ޤʤȤͤˤƤޤ
  ->2

 ǡ¤
  TCB 
    ID actprc --- εưΥץå

 Ƶư륿ߥ
  mact_tsk
    ٻ߾֤ξ
      ξΥץååƤ

  ter_tsk
    actprcξ֤å

  ext_tsk
    ξΥץåå
    actprcξ֤ѲƤʤå

 Ƥ :  ter_tsk

ǥѥåػߤ⤷ϡ߶ػ߾֤ǡۤʤ륿ؤε  ư׵
塼󥰾֤Υλ硥ter_tsk()ǥޥ졼
η̡ưΥץåǺǹͥ٤ˤʤä硤ϡξ
ΥץåưƤޤå˲ưʤȤ
ʤ롥

ץååޤϺγ٥åter_tskǥ֥Ԥ
Υλ硤ǥåɥåΤᡤöå
Ƥ顤֥ȥååνǥå롥

ξΥåǥ֥ԤˤʤäƤʤ
䡤¾Υ֥ȤԤˤʤäƤϡȥ饤뤿ᡤ¹Ի
֤ξ¤ޤʤFDMPͥǤTCB pend_tertsk Ƴ
ơȥ饤ȯ˼¹Ծ»֤ޤƤ롥

pend_tertsk Ƴȡter_tsk  pend_tertsk 򥻥åȸ塤
åơ֥ȥå->åνǼߤ롥
åˡ¾Υƥॳ뤬¹Ԥ졤Υƥॳ
Ԥ֤ϡβսmake_non_wait()ˤǡpend_tertsk
åơtrueʤ齪λȺƵư򤹤ɬפ롥

FMPͥǤϡmact_tskƳƤꡤmact_tsk׵ϥڥǥ
롥ڥǥ󥰤줿硤Ƶư˥ޥ졼ȯ롥
嵭ͤˡǥåɥå¾Υƥॳ뤬¹Ԥ줿ϡ
ΥƥॳˤƵưǥޥ졼ȯ롥

¾Υƥॳϡter_tskоݤȤʤäƤ륿դ
ץåȤϰۤʤץå¹Ԥǽ뤿ᡤۤ
ץåˤޥ졼ȯ뤳Ȥˤʤ롥

FMPͥǤϡۤʤץåˤޥ졼ϵĤ
ʤͳȤƤϡFMPͥǤϥǥѥåϥå
ư뤿ᡤǥѥåΥޥ졼󤷤Ƥޤȡ
OSΥǡ¤򵯤ƤޤǤ롥

Ԥ֤ٻ߾֤ΥФޥ졼ϲǽǤ롥
pend_tertskѤǥåɥåǤϡоݤȤ륿Ԥ֤
ꡤԤ֤ΥƵưݤ˥ޥ졼󤵤Τ
ʤ

ʤ顤ޥ졼¹Ԥ뤿ˤϡưΥץå
åɬפꡤǥåɥåΤᡤ
ưΥץåΥå򤤤äΥɬפ롥߱
θƳߤ̵ͭåϡmake_non_wait()ؿǤ뤳
Ȥȡ֥ȥåƤΥɤ˲ˤΤ
뤿ѤǤʤΤᡤ߱򰭲Ƥޤ


APIͰ2act_tskλͤѹmact_tskΥݡȡ

 act_tsk(ID tskid)
   iact_tsk(ID tskid)
   °ץåǼ¹Ԥ롥
   塼󥰤ϡλ塤λ˽°Ƥץ
     åǥ¹Ԥ롥

 mact_tsk(ID tskid, ID prcid)
   imact_tsk(ID tskid, ID prcid)
   ץåꤷƥ¹Ԥ롥
   ٻ߾֤ΥˤΤȯԲǽǤ롥Τᡤ塼󥰤ȯ
     ʤ
   prcid0ꤹȡ°ץåǵư롥

 mig_tsk(ID tskid, ID prcid)
   °Ƥץå˽°Ƥ¹Ծ֡ٻ߾֡
     Ԥ֤Υ⤷ϼǽ
   ǥѥåػΥȯԤȡǥѥåĻ˥ޥ
     졼Ԥ

APIͰ2

ٻ߾֡ʼ¹Է³ˤΥФmact_tsk()ο 
ٻ߾֡ʼ¹Է³ˤΥФơmact_tsk()¹Ԥ ̡
ΥưΥץåǺǹͥ٤Υˤʤä硤ǥ
åϤ롥κݡоݥٻ߾ ʼ¹Է³ˤ
ȡĤΥץåǥư뤳ȤˤʤäƤޤ
å˲Ƥޤmact_tsk()оݤΥٻ߾֤ٻ߾ 
ʼ¹Է³ˤΤɤ餫ȽǤ¾ΥץåϤǤʤterflg 
ȥ¹ԤƤץå p_runtsk Υ򼨤
ǤäƤ⡤Ǥ˥ǥѥå㤬ưƤ礬ΤǡȽǤˤ
ѤǤʤˡ


ter_tsk¤ߤͳ

FMPͥǤϡter_tskAPIƤӽФƱץå˳
դ줿Τߤоݤ褦¤ߤƤ롥TOPPERS/FDMP
ͥʰʲFDMPͥˤǤϡͤ¤ߤƤʤ
ꡤξܤʣƤFDMPͥͽ򻲾ȤΤ
ȡˡ

TOPPERS/FDMPͥƳƤʣʾܤϡ桼鸫
Ѥ­Ȥʤ롥̾Υλϡ¾Υץå˽°
ФƤȯԤǤ륿㳰ѤȤơter_tsk()Ϥ
ޤǤ⥿ߤκǽʤªȡߤƥС
ͳȯԤƤ꤬ʤȹͤ롥

ޤter_tsk()¤ߤʤˤϡǥѥåߤν
ǥǥѥåɬפˤʤä˥åμɬפȤʤ롥


ͥƥåΥޥץåĥ

ͥƥåʥͥ륿ޡˤץåǻĤΥץ
åǻĤѹǽȤ롥

륿
  ˥ͥƥåѤΥޡġ
   TEVTCB ġ
  ϥɥ餬Ԥˤʤݤˤϡ¹Ԥץ
    åΥ।٥ȥҡפ³롥
  TEVTCB ϡ°ץåΥåǥɤ롥

Х륿
  ΥץåǤΤߥͥƥåѤΥޡġ
    (ƥåץå)
  ͥƥåѤΥޡĥץå TEVTCB ġ
  ϥɥ餬Ԥˤʤݤˤϡͥƥå
    Υޡĥץå TEVTCB ³롥
  G_KLOCKξΤߥݡ

륿ȥХ륿ڤؤϡtarget_kernel.h 
Ӥ饤󥯥롼ɤեˤơ륿
ͭˤϡTOPPERS_SYSTIM_LOCAL  Х륿ͭ
ˤϡTOPPERS_SYSTIM_GLOBAL Ф褤

Х륿  F/P_KLOCKΥݡȸƤ̤

ѥåѰդ롥signal_timeϡΥå롥

loop ॢȤʤХ꥿
ॢȤ
 TMEVT˥åΥȥ2ɲáʥåȥ֥
   ȥå
 NULLʤ(ϥɥ餫顼ϥɥ)ȥƥ
   Хå
   Хå줿¦ǤϡCYCCBǥåƥϥ
   ɥƤӽФ
 NULLǤʤ
   ö।٥ȥå򳰤
   ꤵ줿åʥåˤ
   ।٥ȥå
   Ƭ٥ȤѲƤʤå
     ѲƤСꤵ줿å loop 
   ѲƤʤСȥƥХå


TOPPERS/SMPͥɲä¾ѤAPIΰ

ԥåAPI

ۤʤץåΥȳߥϥɥ֤¾椬ɬפȤʤ뤿ᡤ
FMPͥǤ⥵ݡȤ롥

ץåͭAPI

ޥ졼ϡץå¾Υ⤷ϼʬȤ˸ꤵ
Ƥ뤿ᡤ߶ػߤǼ¸ǽ

¾Υץå¹Ծ֤ΥΥޥ졼򥵥ݡȤ
ǤäƤ⡤ǽŪˤϳߤΤǡ߶ػߤǼ¸ǽ


ʣΥԤ˴ؤα

¹Ի֤ξ¤ޤʤݤ桼Ƥ

оݥƥॳ

 init_xxx
 ٥ȥե饰 set_flg()

ƱץåФʣߤ뤳ȤƤʤ顤
init_wait_queue()make_non_wait()ͤåƳߤ
Ф褤

åμ˴ؤƤϡretryѤȥ饤ϹԤʤ
˲ŪʥɤǤ뤿˽ʤΤǡ̰Ƥ⤫ޤʤȹ
롥




å/ǥѥåػ߾֤Ǽ¹ΥФsus_tsk/ter_tskȯ
Ԥ줿ο(ޥƥ)ꡥ

оݥƥॳ

 sus_tsk(ID tskid)
   CPUå/ǥѥåػΥФsus_tsk()ȯԤȡ
   ϰŪ˲Ūʾ(run-suspend)ˤʤ롥

sus_tsk(ID tskid)μ¸

- CPUå֤ runtsk ȯ
   - äкɬפϤʤ
   - sus_tsk()μ¹Ը塤ץåֳߤȯ
   - CPUåAPIȯԤǤʤ
   - CPUåǳߤդ
   - ξ֤suspend˰ܹԤƤ뤿ᡤrsm_tsk()
     ư롥

- ǥѥåػ߾֤ runtsk ȯ
   - äкɬפϤʤ
   - sus_tsk()¹Ը塤ץåֳߤȯ
   - ߤϵĤƤΤǡߥ롼뤬
      ǥѥåػΤᡤ⤻˥꥿
   - ena_dsp()¹ԤȡǥѥåԤena_dsp()
     ǥåȤ뤿ᡤsus_tsk()ȤΥ졼󥰤ȯ
     ʤ
   - ξ֤suspend˰ܹԤƤ뤿ᡤrsm_tsk()
      ư롥

- APIȯ
   - CPUå֤ǤϡԤ֤ˤAPIȯԤǤʤ
     ȡʬξ֤ѹǤʤΤᡤAPIȯԤ
     ʤޤext_tsk()ϸ§顼TOPPERSǤϥ
     ˥󥰤ˤƽ


ǥåɥå

оAPI

ter_tsk(ID tskid)
rel_wai(ID tskid)
chg_pri(ID tskid, PRI tskpri)  
ter_tsk(ID tskid)
ॢ



ter_tsk()ˤĤƤϡޥ졼бΤᡤȥ饤褦ѹ
¾Υƥॳ˴ؤƤϡȥ饤ʤ褦ʵȤ
ࡥ

TCBؤɲåȥ

bool_t pend_chgpri : chg_pri(ID tskid, PRI tskpri)¹ɽ
bool_t pend_relwai : Ԥ¹ɽ
UINT pend_newpri : ͥѹαοͥ١ɽ

ॢ(wait_tmout(TCB *tcb))

ƥåԤǤʤв⤷ʤƤ褤륿ޡξϡ
ॢȽоݥƱץåưƤΤǡоݥ
Ϥδ֤ư¾Υ֥Ԥˤʤ뤳ȤϤʤ

Х륿ޡξϡ㥤ȥåǤ뤿ᡤ⤽ǥ
ɥåɬפǤϤʤ

rel_wai(ID tskid)

ƥåˡоݥ̤Ԥ֥ȤФԤ֤ˤʤä
С⤻E_OBJ֤ƱԤ֤ʤԤE_OK


chg_pri(ID tskid, PRI tskpri)  

ǽΥånewpriTCBϿƥå¾Υ롼ǤԤ
ֲˤnewpri򸫤ͥ٤ѹƥånewpriͤͭ
ƱԤΤϤʤΤ̾ͥѹԤ

pend_chgpri/pend_relwaiå륿ߥ

Ԥ֤ݤ˥åmake_non_wait()


ACUIRE_LOCKȴ

ʬԤAPIǳߤػߤƤ饿åޤǤˡ
runnableǤʤʤäƤǽ롥

б

¹Բǽ֤ɤå¹Բǽ֤ǤʤС
٥åߤĤ

ޥ

T_ACQUIRE_TSK_LOCK_AND_CHECK_RUNNABLE()
T_ACQUIRE_NESTED_LOCK_AND_CHECK_RUNNABLE(lockobj1)

оAPI

snd_dtq(ID dtqid, VP_INT data)
tsnd_dtq(ID dtqid, VP_INT data, TMO tmout)
rcv_dtq(ID dtqid, VP_INT *p_data)
trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout)
wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
rcv_mbx(ID mbxid, T_MSG **ppk_msg)
trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
get_mpf(ID mpfid, VP *p_blk)
tget_mpf(ID mpfid, VP *p_blk, TMO tmout)
wai_sem(ID semid)
twai_sem(ID semid, TMO tmout)
dis_dsp(void)
slp_tsk()
tslp_tsk(TMO tmout)
sus_tsk(ID tskid)
dly_tsk(RELTIM dlytim)


ʾ
