⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu_support.s

📁 toppers操作系统源码
💻 S
📖 第 1 页 / 共 2 页
字号:
/* *  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: cpu_support.S,v 1.37 2005/08/22 16:57:25 honda Exp $ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"#include <t_config.h>         			/* *  毋嘲/充り哈み叫掐り庚借妄ル〖チン *  SH3はベクタテ〖ブルを积たず、毋嘲,TRAPAが券栏するとVBR+0x100戎孟を、 *  柒婶/嘲婶/NMI充り哈みが券栏すると、VBR+0x600戎孟を悸乖する。 */        /* *	VBR に肋年する猛 */    .section .text    .align 2            .global _BASE_VBR_BASE_VBR:        nop      nop     nop/* *  Exception 100 vector *  アドレスエラ〖,スロット稍碰炭吾毋嘲、Trapa毋嘲霹が券栏すると悸乖される。 * *  CPU毋嘲ハンドラは、润タスクコンテキストで悸乖する、そのため、CPU毋嘲ハン *  ドラを钙び叫す涟に毋嘲/充り哈みを绩すレジスタバンク1の r7 レジスタをイン *  クメントし、リタ〖ンしてきた稿にデクリメントする。CPU毋嘲がタスクコンテキ *  ストで券栏し、regflg が TRUE になった箕に、 ret_exc へ尸呆する。 *  regflg をチェックする涟に充り哈みを敦贿しないと、reqflg をチェック稿に弹 *  瓢された充り哈みハンドラ柒でディスパッチが妥滇された眷圭に、ディスパッチ *  されない。 * *		 *  毋嘲が券栏すると、毋嘲券栏傅のコンテキストであるspc,pr,ssr,r0×r7を锣闰 *  する。毋嘲が券栏した箕爬でのコンテキストを拇べ润タスクコンテキストなら *  _exception_from_intから悸乖を倡幌する。毋嘲の妥傍はEXPEVTレジスタ粕み、 *  exc_tableからCPU毋嘲ハンドラの倡幌戎孟を粕み哈む。券栏した毋嘲に滦して *  CPU毋嘲ハンドラが判峡されていなければ、_no_reg_exceptionにブランチして、 *  ssr,sr,spc,prの柒推を叫蜗して匿贿する。CPU毋嘲ハンドラからリタ〖ンして *  きたら、reqflgを拇べ0笆嘲ならrec_exc()に若び、0なら傅の借妄にリタ〖ンす *  る。 * * *  BLビットの胺いについて *  ssr,spc に提り黎のコンテキストを提して rte を券乖する狠には·充哈み∈NMI  *  も崔む∷を减け烧けないように BL ビットを1にする涩妥があるˉ毋嘲/充哈みハ *  ンドラ姜位箕には BL をビットを1にせず IPM を MAX_IPM に肋年するˉこれは· *  BL ビットが1の眷圭に毋嘲が券栏すると CPU がリセットされることを雇胃して· *  奥链のため·ssr,spcを牲耽する木涟でBLを1に肋年しているˉ *        */				    .org   0x0100              /*  _BASE_VBR + 0x0100戎孟に芹弥   */    .align 2    .global _general_exception_general_exception:    stc.l  spc,@-r15           /* spc,pr,ssr をスタックに瘦赂する */    sts.l  pr,@-r15                   stc.l  ssr,@-r15    stc.l  gbr,@-r15					    sts.l  macl,@-r15					    sts.l  mach,@-r15					                            stc.l  r0_bank,@-r15       /* 毋嘲券栏箕のr0×r7を瘦赂        */    stc.l  r1_bank,@-r15    stc.l  r2_bank,@-r15    stc.l  r3_bank,@-r15    stc.l  r4_bank,@-r15    stc.l  r5_bank,@-r15    stc.l  r6_bank,@-r15        stc.l  r7_bank,@-r15    tst    r7,r7               /* 毋嘲券栏傅のコンテキストを冉年            */    bf/s   _exception_from_exc /* 券栏傅が毋嘲/充り哈みハンドラならジャンプ */     add    #0x01,r7	       /* 毋嘲/充り哈みネスト搀眶をインクリメント   */    mov    r15,r1              /* 提り黎が充り哈みハンドラでないのでスタッ  */    mov.l  _stacktop_exc,r15   /* クを掐れ仑え傅のスタックポインタを瘦赂    */     mov.l  r1,@-r15     mov.l  _expevt,r0          /* 毋嘲を钓材すると久えるレジスタを瘦赂      */    mov.l  @r0,r5              /* EXPEVTレジスタを艰评                      */    ldc    r1,r4_bank          /* CPU毋嘲ハンドラへの苞眶                   */    ldc    r5,r5_bank	         mov.l  _unmak_rb_bl_exc,r2 /* BLビットを0に·レジスタバンクを磊り仑え   */    stc    sr,r3                   and    r3,r2			    ldc    r2,sr                   shlr2  r5                  /* EXPEVTを3ビット宝シフト                   */    shlr   r5                    mov.l  _exc_table_exc,r0   /* exc_tableのアドレスをr0に                 */    mov.l  @(r0,r5),r2         /* ハンドラのアドレスを艰评                  */    tst    r2,r2               /* ハンドラが判峡されていない毋嘲なら        */    bt     _no_reg_exception   /* no_reg_exceptionへジャンプ                */    jsr    @r2                 /* CPU毋嘲ハンドラへ                         */     nop    mov.l  _mask_md_ipm_exc,r0    ldc    r0,sr               /* 充り哈み敦贿                              */    stc    r7_bank,r7          /* 毋嘲/充り哈みのネスト搀眶をデクリメント   */    dt     r7    ldc    r7,r7_bank    mov.l  _reqflg_exc,r2      /* reqflgのチェック                          */    mov.l  @r2,r1    tst    r1,r1               /* reqflgがFALSEならret_to_task_excに若び    */    bt/s   _ret_to_task_exc    /* タスクに提る                              */     mov.l  @r15,r15           /* 提り黎がタスクなのでスタックを提す        */    xor    r0,r0                   bra    ret_exc     mov.l  r0,@r2             /* reqflgをクリア                            *//* *   exception_from_int *   CPU毋嘲券栏箕のコンテキストが润タスクコンテキストの眷圭の借妄 *   タスクコンテキストの眷圭との借妄の般いは、とCPU毋嘲ハンドラの *   借妄が姜位すると涩ず傅の借妄に提ることである。 */	_exception_from_exc:    mov.l   _expevt,r0        /* 毋嘲を钓材すると久えるレジスタを瘦赂      */    mov.l   @r0,r5            /* EXPEVTレジスタを艰评                      */    ldc     r15,r4_bank       /* CPU毋嘲ハンドラへの苞眶                   */    ldc     r5,r5_bank	         mov.l   _unmak_rb_bl_exc,r2 /* BLビットを0に·レジスタバンクを磊り仑え */    stc     sr,r3    and     r3,r2			    ldc     r2,sr                   shlr2   r5                /* EXPECTを3ビット宝シフト                   */    shlr    r5                	    mov.l   _exc_table_exc,r0 /* exc_tableのアドレスをr0に                 */    mov.l   @(r0,r5),r2       /* ハンドラのアドレスを艰评                  */    tst     r2,r2             /* ハンドラが判峡されていない毋嘲なら        */    bt      _no_reg_exception /* no_reg_exceptionへジャンプ                */    jsr     @r2               /* CPU毋嘲ハンドラへ                         */     nop    mov.l  _mask_md_ipm_exc,r0    ldc    r0,sr              /* BL=1,充り哈み敦贿                         */    stc    r7_bank,r7         /* 毋嘲/充り哈みのネスト搀眶をデクリメント   */    dt     r7    ldc    r7,r7_bank_ret_to_task_exc:    mov.l  @r15+,r7           /* r0×r1,ssr,pr,spcを牲耽しタスクに提る     */    mov.l  @r15+,r6    mov.l  @r15+,r5    mov.l  @r15+,r4    mov.l  @r15+,r3    mov.l  @r15+,r2    mov.l  @r15+,r1            mov.l  _mask_md_bl_exc,r0     ldc    r0,sr             /* BLを1に                                   */    mov.l  @r15+,r0    lds.l  @r15+,mach                    lds.l  @r15+,macl            ldc.l  @r15+,gbr                   ldc.l  @r15+,ssr                lds.l  @r15+,pr    ldc.l  @r15+,spc    rte     nop/*	 *  no_reg_exception() *  CPU毋嘲として判峡されていない毋嘲が券栏すると钙び叫される *  毋嘲コ〖ド、毋嘲が券栏した箕爬のpc,sr,prを叫蜗してカ〖ネル *  を匿贿する。 */					_no_reg_exception:    mov.l  _expevt,r5    mov.l  @r5,r4    stc    spc,r5    stc    ssr,r6    sts    pr,r7    mov.l  _cpu_expevt_k,r1    jsr    @r1     nop	.align  4_stacktop_exc:	    .long  STACKTOP            /* タスク迫惟婶のスタックの介袋猛  */_expevt:	    .long  EXPEVT_exc_table_exc:	    .long  _exc_table_unmak_rb_bl_exc:		    .long  0x4fffffff_mask_md_ipm_exc:	    .long  0x40000000 + MAX_IPM << 4	_reqflg_exc:    .long  _reqflg_cpu_expevt_k:	    .long  _cpu_expevt	_mask_md_bl_exc:	    .long  0x50000000 + MAX_IPM << 4		/* *  タスクディスパッチャ * *  _dispatch は、r7_bank1 = 0,充哈み敦贿觉轮で钙び叫さなければならな *  いˉ_exit_and_dispatch も·r7_bank1 = 0ˇ充哈み敦贿觉轮で钙び叫す *  のが付搂であるが·カ〖ネル弹瓢箕に滦炳するため·r7_bank1 = 1で钙び *  叫した眷圭にも滦炳しているˉ */    .text    .align 2    .global _dispatch_dispatch:    sts.l  pr,@-r15         /* pr,r8×r15 をスタックに瘦赂           */    mov.l  r14,@-r15        /* r0×r7は钙び叫し傅で瘦赂しているため  */        mov.l  r13,@-r15        /* 瘦赂する涩妥が痰い                    */        mov.l  r12,@-r15    mov.l  r11,@-r15    mov.l  r10,@-r15    mov.l  r9, @-r15    mov.l  r8, @-r15    mov.l  _runtsk_dis,r2   /* r0 <- runtsk                          */    mov.l  @r2,r0    mov.l  r15,@(TCB_sp,r0) /* タスクスタックをTCBに瘦赂 60笆布ならOK*/		    mov.l  dispatch_r_k,r1  /* 悸乖浩倡戎孟を瘦赂                    */    mov.l  r1,@(TCB_pc,r0)  /* 悸乖浩倡戎孟をTCBに瘦赂  60笆布ならOK */    bra    dispatcher     nopdispatch_r:	    mov.l  @r15+,r8         /* レジスタを牲耽                       */    mov.l  @r15+,r9    mov.l  @r15+,r10    mov.l  @r15+,r11    mov.l  @r15+,r12    mov.l  @r15+,r13    mov.l  @r15+,r14    lds.l  @r15+,pr    /*     *  タスク毋嘲借妄ル〖チンの弹瓢     *  dispatch_rはdispatcherから钙び叫されるため·     *  tcbのアドレスはr0に掐っているˉ           */    mov.l  @(TCB_enatex,r0),r1    mov.l  _enatex_mask_dis,r2    tst    r1,r2    bt     dispatch_r_1         /* enatex が FALSE ならリタ〖ン */    mov.l  @(TCB_texptn,r0),r1  /* texptnをロ〖ド               */    tst    r1,r1    bt     dispatch_r_1         /* texptn が 0で痰ければ        */    mov.l  _call_texrtn_dis,r1  /* タスク毋嘲ル〖チンの钙び叫し */    jmp    @r1             nop                          dispatch_r_1:       rts     nop                    .global _exit_and_dispatch_exit_and_dispatch:    xor    r1,r1                 /* r7_bank1を0クリア             */    ldc    r1,r7_bankdispatcher:    /*     * ここには充り哈み敦贿で丸ること     */    mov.l  _schedtsk_dis,r12    /* r0 <- schedtsk                   */    mov.l  @r12,r0                 mov.l  _runtsk_dis,r2    mov.l  r0,@r2               /* schedtskをruntskに               */    cmp/eq #0,r0                /* schedtsk があるか々              */    bt     dispatcher_1         /* 痰ければジャンプ                 */            mov.l  @(TCB_sp,r0),r15     /* TCBからタスクスタックを牲耽      */    mov.l  @(TCB_pc,r0),r1      /* TCBから悸乖浩倡戎孟を牲耽        */    jmp    @r1      nopdispatcher_1:    /* イミディエイト猛を髓搀粕み哈むのは跟唯が碍いので祸涟に脱罢する     * r8  : 充り哈み敦贿のためのSRの猛        * r9  : 充り哈み略ち面のSRの猛     * r10 : reqflgの戎孟     * r11 : 0x01     * r12 : 0x00     * r13 : sleep面のSRの觉轮            */    mov.l  _mask_md_ipm_dis,r8  /* 充り哈み敦贿のSRの猛             */#ifdef NO_SLEEP    mov.l  _mask_md_dis,r9      /* 充り哈み略ち面のSRの猛           */        #else    mov.l  _mask_bl_md_dis,r9   /* 充り哈み略ち面のSRの猛           */#endif                          #ifdef SUPPORT_CHG_IPM    mov.l  _task_intmask_k,r2    mov.l  @r2,r3    or     r3,r9#endif    mov.l  _reqflg_dis,r10    mov    #0x01,r11    xor    r12,r12    mov.l  _stacktop_dis,r15   /* スタックを充り哈みスタックに     */    ldc    r11,r7_bank         /* r7_bank1 を1にして充り哈み觉轮に */        dispatcher_2:            /*     *  ここで充哈みモ〖ドに磊り垂えるのは·ここで券栏する充哈み借妄     *  にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で     *  のタスクディスパッチの松贿という企つの罢蹋があるˉ     */     /*      *  充哈み钓材稿にsleep炭吾を悸乖すると·充哈み钓材炭吾の悸乖涟に      *  充哈み妥滇が掐っている眷圭·充哈み钓材炭吾の悸乖と鼎に充哈みが      *  减け烧けられその牲耽稿に·reqflgのチェックではなく sleep 觉轮      *  に掐ってしまうˉ      *  この啼玛は·充哈みの钓材と sleep 觉轮への败乖がアトミックに悸      *  乖できないことに弹傍するˉ      *  そのため·sleep 悸乖木涟の SR 恃构では BL ビットを'1'に肋年す      *  ることで·充哈みの钓材と sleep 觉轮への笆惯をアトミックに悸乖      *  するˉ      *  ldc r9,sr ではBLビットがセットされるため·充哈みは减け烧けずス      *  リ〖プモ〖ドに败乖するˉスリ〖プモ〖ド面は·BLビットが1でも充      *  哈みを减け烧けるため(SH7709ハ〖ドウェアマニュアル 8-10)·スリ〖      *  プモ〖ドへの败乖木稿に充哈みを减烧スリ〖プモ〖ドから牲耽するˉ      */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -