
                     JSPͥ ߷ץ 

             Release 1.4бǽ: 15-Mar-2005

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

 嵭Ԥϡʲ (1)(4) ξ狼Free Software Foundation 
 ˤäƸɽƤ GNU General Public License  Version 2 ˵
 ҤƤ˸¤ꡤܥեȥܥեȥ
 ѤΤޤࡥʲƱˤѡʣѡۡʰʲ
 ѤȸƤ֡ˤ뤳Ȥ̵ǵ롥
 (1) ܥեȥ򥽡ɤηѤˤϡ嵭
     ɽѾ浪Ӳ̵ݾڵ꤬Τޤޤηǥ
     ˴ޤޤƤ뤳ȡ
 (2) ܥեȥ򡤥饤֥ʤɡ¾Υեȥȯ˻
     ѤǤǺۤˤϡۤȼɥȡ
     ԥޥ˥奢ʤɡˤˡ嵭ɽѾ浪Ӳ
     ̵ݾڵǺܤ뤳ȡ
 (3) ܥեȥ򡤵Ȥ߹ʤɡ¾Υեȥȯ˻
     ѤǤʤǺۤˤϡΤ줫ξ
     ȡ
   (a) ۤȼɥȡѼԥޥ˥奢ʤɡˤˡ嵭
       ɽѾ浪Ӳ̵ݾڵǺܤ뤳ȡ
   (b) ۤη֤̤ˡˤäơTOPPERSץȤ
       𤹤뤳ȡ
 (4) ܥեȥѤˤľŪޤϴŪ뤤ʤ»
     ⡤嵭ԤTOPPERSץȤդ뤳ȡ

 ܥեȥϡ̵ݾڤ󶡤ƤΤǤ롥嵭Ԥ
 TOPPERSץȤϡܥեȥ˴ؤơŬѲǽ
 ޤơʤݾڤԤʤޤܥեȥѤˤľ
 ŪޤϴŪʤ»˴ؤƤ⡤Ǥʤ

 @(#) $Id: design.txt,v 1.11 2005/08/08 11:20:06 hiro Exp $
------------------------------------------------------------------------


JSPͥˤ»

(1) ݡȤ뵡ǽ

JSPͥϡ̤̾ꥹɥץե˴ޤޤ뵡ǽΤߤ
ݡȤ롥ɥץե볰εǽϡ§ȤƥݡȤ
ʤ

¤߷פˤäƤϡɥץե볰εǽ򥵥ݡ
뤿γĥϹθɥץե˴ޤޤ뵡ǽ
Ψɤ¸뤳Ȥܻؤ

(2) ӥǤγߤΰ

JSPͥǤϡӥϤ٤Ƴ߶ػߤǼ¹Ԥ롥
ɥץեεǽϰǤϡˡǽʬȹͤ뤬ĥ
ǽɲäˤ߷פľ٤Ǥ롥Ūˤϡ󥿥ƥ
ȤƤӽФ줿ӥٱ¹ԤˡͭϤǤ롥

(3) CPU㳰ϥɥμ¹ԥƥ

JSPͥǤϡCPU㳰ϥɥ󥿥ƥȤǼ¹Ԥ롥

: ITRON4.0ͤǤϡƥȤȯCPU㳰Ф
CPU㳰ϥɥ򡤥ƥȤǼ¹Ԥ뤫󥿥ƥ
Ǽ¹Ԥ뤫ϡȤƤ롥


¹ԥƥȤȥƥ֤β۲

(1) ¹ԥƥ

¹ԥƥȤϡƥȤ󥿥ƥȤΤ줫
ʬव롥

¹ԥƥȤδϥåȰ¸ǹԤŪˤϡ
ƥȤ󥿥ƥȤȽ̤ؿsense_contextˤ򡤥
åȰ¸Ѱդ롥

ޤƥȤ󥿥ƥȤδ֤ܤ⡤å
¸ǤǤ롥Ūˤϡߥϥɥ顿CPU㳰ϥɥ餬ư
󥿥ƥȤڤ괹ꡤߥϥɥ顿CPU㳰ϥ
ɥ餫꥿󤹤ȸμ¹ԥƥȤ褦åȰ¸
롥

(2) CPUå

ƥϡCPUå֤CPUå֤Τ줫ˤ롥CPU
֤Ǥϡ٤ƤγߡʥͥδΤΤʲƱˤ
ػߤƤ롥

CPUå֤δϥåȰ¸ǹԤŪˤϡCPUå֡
CPUå֤Τξ֤Ǥ뤫Ƚ̤ؿsense_lock
t_sense_locki_sense_lockˤȡCPUå֤CPUå֤δ֤
ܤؿt_lock_cput_unlock_cpui_lock_cpui_unlock_cpuˤ
åȰ¸Ѱդ롥δؿƤӽФʳˡǡCPU
֤CPUå֤δ֤ܤ뤳ȤϤʤ


ǥѥåȥ㳰롼ưˡ

(1) ǥѥåɬפʥߥ

ǥѥåԤɬפΤϡʲΥߥ󥰤Ǥ롥

(a) ӥǤŪʥǥѥå׵

ƥȤƤӽФ줿ӥˤơŪ
ǥѥå׵ᤵ줿硥Ūˤϡ¹Ծ֤Υ
̤ͥι⤯¹ԤǤ֤Υȡ¹Ծ֤Υ
ʼˤԤ֤ˤ礬롥ξˤ⡤ӥ
ǥǥѥåŪ˸ƤӽФȤǡǥѥåԤ

(b) ߥϥɥ顿CPU㳰ϥɥνи

ߥϥɥ顿CPU㳰ϥɥʰʲϥɥΤˤƤӽ
줿ӥǥǥѥå׵ᤵ줿硤ϥɥν
ǥǥѥåɬפåɬפǤХǥѥ
Ԥϥɥ餬¿Ť˵ưƤ硤Ǥ⳰¦Υϥɥνи
ǤΤ߹Ԥʢˡ

 ץåˤäƤϡCPU㳰ϥɥƬǤϡ󥿥
ƥȤǤǧʤ礬롥Τ褦ʾ硤
ǥϥɥ餬¿Ť˵ưƤ⡤¦ΥϥɥǤ˳¦Υ
ɥ餬뤳ȤǧǤ¦ΥϥɥǥǥѥåԤ
Ȥˤʤ롥ξǤ⡤󥿥ƥȤǤǧ
ʤʬϡϥɥΰǤϤʤȲ᤹С嵭θ§ϼ
뤳Ȥˤʤ롥ϡʲεҤˤƱͤˤƤϤޤ롥

(2) 㳰롼εưɬפʥߥ

㳰롼ưΤϡͽˤȡ֥㳰
ľ֡סα㳰װ 0 Ǥʤס֥¹Ծ֤Ǥס
ƥȤޤCPU㳰ϥɥ餬¹ԤƤʤפλͤĤξ
·äǤ롥ΤȤ顤㳰롼εưԤɬ
פΤϡʲΥߥ󥰤Ǥ롥

(a) ǥѥåľ

ǥѥåˤꡤ¹Ծ֤ΥruntskˤѲ롥
¹Ծ֤ˤʤäưƤС㳰롼
ư롥

(b) ߥϥɥ顿CPU㳰ϥɥνи

ߥϥɥ顿CPU㳰ϥɥʰʲϥɥΤˤνиǤϡ
ǥѥåԤ礬롥ξˤϡ(a) ͳɬפʤ顤
㳰롼ư롥

ϥɥνиǥǥѥåԤʤǤ⡤ϥɥǼ¹
֤ΥФƥ㳰׵ᤵ줿ˤϡϥɥνи
ǵưåưƤХ㳰롼
ư롥ϥɥ餬¿Ť˵ưƤ硤Ǥ⳰¦Υϥɥν
ǤΤ߹Ԥʢˡ

(c) Ф륿㳰׵

Фƥ㳰׵ᤷ̡ư
褦ˤʤС㳰롼ư롥

(d) 㳰ε

㳰ľ֤˰ܹԤ̡ư褦
ʤС㳰롼ư롥㳰ľ֤ؤΰ
Ԥϡena_tex θƽФˤäƵ롥

(3) ӥǤŪʥǥѥåθƽФ

ƥȤƤӽФ줿ӥˤƥǥѥ
ɬפˤʤä硤ӥνǤ٤ߥ󥰤 
dispatch ƤӽФdispatch ƤӽФȡλǺǤ̤ͥι
¹Ԥ롥dispatch ϡƤӽФ˼¹Ծ֤ˤ
ȥ㳰롼εưåưƤ
Х㳰롼ư롥

Τᡤdispatch ƤӽФӥؽäƤΤϡ
ƤӽФ˼¹Ծ֤Ȥʤꡤư٤㳰롼
ʤʤäǤ롥

ʤdispatch νϡåȰ¸󶡤롥

(4) ߥϥɥ顿CPU㳰ϥɥνиǤν

ߥϥɥ顿CPU㳰ϥɥʰʲϥɥΤˤνи
Ǥϡǥѥåɬפ㳰롼εưɬפ
ɬפʽԤϥɥ餬¿Ť˵ưƤ硤Ǥ⳰¦
ϥɥνиǤΤߤνԤ

Ūˤϡǥѥåȥ㳰롼εưΤ줫ν
ɬפʾˤ reqflg  TRUE ˤ뤳ȤȤǤ⳰¦Υϥɥν
 reqflg  TRUE ˤʤäƤСޤǥѥåɬפå
ɬפʤǥѥåԤǥѥåˤ꿷˼¹Ծ֤ˤʤä
㳰롼εưƤС㳰
롼ư롥ǥѥåɬפʤäˤϡ¹Υ
㳰롼εưƤ뤫å
Х㳰롼ư롥ĤΥ㳰롼
ưϡ̣ŪˤϰۤʤΤ롼Ūˤ϶̲Ǥǽ
롥

ʤϥɥνиϡåȰ¸󶡤롥

(5) εưȽλν

ưΥ쥸ȡλΥ쥸¸ϡå
¸μˤäƤϾάǤ롥

εưϡcreate_context  activate_context ˤäơˤ
ؤΥǥѥåäˡεưϤ¹Ԥ褦
˥ƥȤꤹ뤳ȤǹԤ

λˤϡunlock_cpu 夨ơexit_and_dispatch ƤӽФ
exit_and_dispatch ϡ߼¹ΥƥȤ¸ˡǥѥ
ԤؿǤ롥

ʤcreate_contextactivate_contextexit_and_dispatch νϡ
åȰ¸󶡤롥

(6) ¹ԤǤ֤Υʤΰ

¹ԤǤ֤ΥʤкȤơɥ륿Ƴ
ˡ롥ɥ륿Ƴȡǥѥåǳ
򤹤ɬפʤΤǡեȥι¤Ūˤϥ쥬Ȥˤʤ롥ޤ
ǥѥåǤξʬ⸺롥դˡRAM λ̤ɤƤ
ƤޤȤ꤬롥ΤȤ顤ɥ륿ϻȤʤˤ
롥

(7) ǥѥåα֤ݻˡ

ǥѥåαΤϡΤ줫ξǤ롥

 ǥѥåػ߾
 󥿥ƥȼ¹

CPU㳰ϥɥ󥿥ƥȤǼ¹ԤȤᡤCPU㳰ϥ
ɥ¹ϡ󥿥ƥȼ¹˴ޤƹͤ뤳ȤǤ롥
ӥϤ٤Ƴ߶ػߤǼ¹Ԥ뤿ᡤӥ¹
θɬפʤ

ǡ󥿥ƥȼ¹ϡsense_context() ȽǤ롥
ǡǥѥåػ߾֤ɽBOOLѿѰդСǥѥ
α֤ݻǤ뤳Ȥˤʤ롥ºݤˤϡǥѥåľ֤ɽ
BOOLѿ enatex Ƴ

 ӥ¹˳ߤĤʥǥѥåϵĤʤ
ˤϡӥǵư줿ߥϥɥνиǤϡ
ǥѥå⥿㳰롼εưԤäƤϤʤʤȤ
꤬㤦Ȥ顤ξԤζػߤ̡ѿˤˡͤ뤬
ꤹθΨͤȡĤѿξػߤǤɤȻפ롥
ʤǥѥåػ߾֤ȥӥ¹֤Ʊѿ
ӥåȥեɤʬƵΤȹͤ롥ˡCPU㳰
ϥɥ򥿥ƥȤǼ¹ԤǤϡƱѿCPU㳰ϥ
ɥΥͥȲ⵭ʤ롥㤨СΤ褦ѿ pndflg Ƴ
ˡͤ롥

 ǲ̥ӥå  ӥ¹
                                 1 ʤξα
 2ӥåȤ  ǥѥåػ߾
                                 1 ʤ饿ؤα
 ĤΥӥå  CPU㳰ϥɥΥͥȲ
                                 0 ʳʤ饿ؤα


ӥεˡ

(1) sns_xxx

sns_ctxsns_locsns_dspsns_tex ϡӥǥƥ
륻ʤƤǤ롥

(2) ƥѤΥӥ

 CPUå֤ǸƤФȥ顼ˤʤ뤳Ȥա

(2-1) ڴ򵯤ʤΡ: get_pri

        顼å
        t_lock_cpu();
        /*
         *  ƥ륻¹
         */
        t_unlock_cpu();

(2-2) ڴ򵯤ǽΤΡ: act_tsk

        顼å
        t_lock_cpu();
        /*
         *  ƥ륻¹
         */
        if (ǥѥåɬ && enadsp) {
                /* Ԥ֤ˤ륵ӥǤϡ
                         enadsp åɬפϤʤ*/
                dispatch();
        }
        t_unlock_cpu();

(2-3) λΡext_tsk

        顼å
        t_lock_cpu();
        /*
         *  ƥ륻¹
         */
        exit_and_dispatch();

(2-4) ras_tex

        顼å
        tcb = get_tcb_self(tskid);
        t_lock_cpu();

        E_OBJ顼Υå

        tcb->texptn |= rasptn;
        if (tcb == runtsk && runtsk->enatex) {
                texptn = runtsk->texptn;
                runtsk->enatex = FALSE;
                runtsk->texptn = 0;

                t_unlock_cpu();
                (*runtsk->tinib->texrtn)(texptn, runtsk->tinib->exinf);

                /* CPUå֤Τޤޥ꥿󤷤к */
                if (!t_sense_lock()) {
                        t_lock_cpu();
                }

                㳰롼εư٥åư
                runtsk->texptn  0 ˤʤޤǾν򷫤֤

                runtsk->enatex = TRUE;
        }
        t_unlock_cpu();

(2-5) ena_tex

        顼å
        t_lock_cpu();

        E_OBJ顼Υå

        runtsk->enatex = TRUE;
        if (runtsk->texptn != 0) {
                texptn = runtsk->texptn;
                runtsk->enatex = FALSE;
                runtsk->texptn = 0;

                t_unlock_cpu();
                (*runtsk->tinib->texrtn)(texptn, runtsk->tinib->exinf);

                /* CPUå֤Τޤޥ꥿󤷤к */
                if (!t_sense_lock()) {
                        t_lock_cpu();
                }

                㳰롼εư٥åư
                runtsk->texptn  0 ˤʤޤǾν򷫤֤

                runtsk->enatex = TRUE;
        }
        t_unlock_cpu();

(3) 󥿥ƥѤΥӥ

 CPUå֤ǸƤФȥ顼ˤʤ뤳Ȥա

(3-1) ؤ򵯤ʤ

        i_lock_cpu();
        /*
         *  ƥ륻¹
         */
        i_unlock_cpu();

(3-2) ؤ򵯤ǽΤΡ: iact_tsk

        i_lock_cpu();
        /*
         *  ƥ륻¹
         *
         *  ǥѥåɬפʾˤϡreqflg  TRUE ˤ롥
         *  enadsp  FALSE λϡreqflg  TRUE ˤʤ
         */
        i_unlock_cpu();

(3-3) iras_tex

        顼å
        tcb = get_tcb(tskid);
        i_lock_cpu();

        E_OBJ顼Υå

        tcb->texptn |= rasptn;
        if (tcb == runtsk && runtsk->enatex) {
                reqflg = TRUE;
        }
        i_unlock_cpu();

ʾ


