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

📄 cpu_support.s

📁 嵌入式系统开发 TOPPERS and JSP Kernel Release 1.3 TOPPERS = Toyohashi Open Platform for Embedded Real-Tim
💻 S
字号:
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2000,2001 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  *  惧淡螟侯涪荚は·Free Software Foundation によって给山されている  *  GNU General Public License の Version 2 に淡揭されている掘凤か·笆 *  布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ *  アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ *      ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 *      に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· *      この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 *      み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ *    (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 *        涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する *        ことˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚を倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· *  塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ *  ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい *  かなる禄巢に簇しても·その勒扦を砷わないˉ *  *  @(#) $Id: cpu_support.S,v 1.9 2002/04/05 07:43:51 honda Exp $ *//* *	プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈ARM7TDMI脱∷ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"#include "arm7tdmi.h"        /* *  タスクディスパッチャ * *  dispatchは· *  dispatch は·システムモ〖ドˇ充哈み敦贿觉轮で钙び叫さなければならな *  いˉ_exit_and_dispatch も·システムモ〖ドˇ充哈み敦贿觉轮で钙び叫す *  のが付搂であるが·カ〖ネル弹瓢箕に滦炳するため·IRQモ〖ドで钙び叫した *	眷圭にも滦炳しているˉ */        .text        .align 4	        .globl dispatch        .globl exit_and_dispatchdispatch:        stmfd sp!, {r4 - r11,lr}   /* レジスタの瘦赂 */        ldr   r0,runtsk_dis        /* runtskを粕み哈む */        ldr   r1,[r0]        str   sp,[r1,#TCB_sp]      /* タスクスタックを瘦赂 */        adr   r2,dispatch_r        str   r2,[r1,#TCB_pc]      /* 悸乖浩倡戎孟を瘦赂 */        ldr   r6,interrupt_count_dis /* r6 <-interrupt_count */        mov r5,#0x9f       /* 充り哈み敦贿(システムモ〖ド) */        mov r4,#0x1f       /* 充り哈み钓材(システムモ〖ド) */                        b     dispatcher_1dispatch_r:        ldmfd sp!,{r4 - r11,lr}        /*         * タスク毋嘲借妄ル〖チンの弹瓢         * dispatch_r は dispatcher_1 から钙び叫されるため·         * tcbのアドレスはr1に掐っている         */        ldrb  r0,[r1,#TCB_enatex]        tst   r0,#TCB_enatex_mask        beq   dispatch_r_1          /* enatex が FALSE ならリタ〖ン */        ldr   r0,[r1,#TCB_texptn]   /* texptnをロ〖ド               */        tst   r0,r0                 /* texptn が0で痰ければ         */        bne   call_texrtn           /* タスク毋嘲ル〖チンの钙び叫し */dispatch_r_1:           mov   pc,lr        exit_and_dispatch:        ldr   r6,interrupt_count_dis /* interrupt_countを0クリア */        mov   r3,#0                str   r3, [r6]                                                mov r5,#0x9f       /* 充り哈み敦贿(システムモ〖ド) */        mov r4,#0x1f       /* 充り哈み钓材(システムモ〖ド) */		msr cpsr, r5	   /* システムモ〖ド */dispatcher_1:    	/*         *  ここではシステムモ〖ドˇ充哈み敦贿觉轮でなければならないˉ    	 */        ldr r0, schedtsk_k /* schedtsk を粕み哈む */        ldr r1, [r0]        cmp r1, #0        beq dispatcher_2        ldr r2, runtsk_dis  /* schedtsk を runtskに */        str r1, [r2]dispatcher_3:                   ldr sp, [r1,#TCB_sp] /* タスクスタックを牲耽 */        ldr pc, [r1,#TCB_pc] /* 悸乖浩倡戎孟を牲耽   */dispatcher_2:        mov   r3,#1        str   r3, [r6]        /* sleepモ〖ドを积つCPUなら今き垂える */        msr cpsr, r4		/* 充哈み略ち      */        msr cpsr, r5		/* 充哈み敦贿      */        mov   r3,#0        str   r3, [r6]                b   dispatcher_1runtsk_dis:        .long runtskschedtsk_k:             .long schedtskinterrupt_count_dis:               .long   interrupt_count                /* *  タスク弹瓢箕借妄 */        .text        .globl activate_ractivate_r:        mov   r1,#0x1F         /* 充り哈み钓材(システムモ〖ド) */        msr   cpsr, r1         /* 充哈み钓材 */        ldr   lr, ext_tsk_k    /* 提り戎孟肋年 */        ldmfd sp!, {r0,pc}     /* 苞眶,PC肋年  */ext_tsk_k:        .long ext_tsk		/* *  充哈みハンドラ】CPU毋嘲ハンドラ叫庚借妄 * *  ret_int はIRQモ〖ドˇIRQ充哈み敦贿觉轮で钙び叫すˉ */        .text        .globl ret_int        .globl ret_exc ret_int:ret_exc:                        /*         *   システムモ〖ドで丸ること         */		ldr   r2, runtsk_ret    /* runtsk を粕み哈む */        ldr   r0,[r2]        ldr   r2, enadsp_ret        ldr   r1,[r2]        cmp   r1,#0        beq   ret_int_1        ldr   r2,schedtsk_ret        ldr   r1,[r2]        cmp   r0,r1             /* runtsk と schedtskを孺秤 */        beq   ret_int_1        stmfd sp!, {r4-r11}     /* 荒りのレジスタを瘦赂 */        str   sp,[r0,#TCB_sp]   /* タスクスタックを瘦赂 */        adr   r1, ret_int_r     /* 悸乖浩倡戎孟を瘦赂   */        str   r1,[r0,#TCB_pc]        b     dispatcher_1ret_int_r:        ldmfd sp!, {r4-r11} /* レジスタの牲耽 */ret_int_1:        /*         * タスク毋嘲借妄ル〖チンの弹瓢         * dispatch_r は dispatcher_1 から钙び叫されるため·         * tcbのアドレスはr1に掐っている         */        ldrb  r0,[r1,#TCB_enatex]        tst   r0,#TCB_enatex_mask        beq   ret_int_2             /* enatex が FALSE ならリタ〖ン */        ldr   r0,[r1,#TCB_texptn]   /* texptnをロ〖ド               */        tst   r0,r0                 /* texptn が0で痰ければ         */        blne   call_texrtn          /* タスク毋嘲ル〖チンの钙び叫し */        ret_int_2:                      ldmfd sp!, {r0}       /* spsr を牲耽 */        msr   cpsr, r0              ldmfd sp!, {r0 - r3,ip,lr,pc} /* タスクへ提る */        runtsk_ret:        .long runtskschedtsk_ret:           .long schedtskenadsp_ret:             .long enadsp                

⌨️ 快捷键说明

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