📄 cpu_support.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 + -