📄 cpu_support.arm
字号:
/* * 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 * 2003 by Advanced Data Controls, Corp * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: cpu_support.arm,v 1.4 2003/12/24 06:51:28 honda Exp $ *//* * プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈ARMv4脱∷ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"#include <armv4.h>#include <t_config.h> /* * タスクディスパッチャ * * dispatchは· * dispatch は·システムモ〖ドˇ充哈み敦贿觉轮で钙び叫さなければならな * いˉ_exit_and_dispatch も·システムモ〖ドˇ充哈み敦贿觉轮で钙び叫す * のが付搂であるが·カ〖ネル弹瓢箕に滦炳するため·IRQモ〖ドで钙び叫した * 眷圭にも滦炳しているˉ */ .text .align 4 .globl dispatch .globl exit_and_dispatchdispatch: stmfd sp!, {r4 - r11,lr} /* レジスタの瘦赂 */ ldr r0, =runtsk /* runtskを粕み哈む */ ldr r1, [r0] str sp, [r1,#TCB_sp] /* タスクスタックを瘦赂 */ adr r2, dispatch_r str r2, [r1,#TCB_pc] /* 悸乖浩倡戎孟を瘦赂 */ ldr r6, =interrupt_count /* r6 <-interrupt_count */ mov r5, #(CPSR_SVC|CPSR_FIQ_BIT|CPSR_IRQ_BIT) /* 充り哈み敦贿(システムモ〖ド) */ mov r4, #(CPSR_SVC|CPSR_FIQ_BIT) /* 充り哈み钓材(システムモ〖ド) */ b dispatcher_1dispatch_r: ldmfd sp!,{r4 - r11,lr} /* * タスク毋嘲借妄ル〖チンの弹瓢 * dispatch_r は dispatcher_1 から钙び叫されるため· * tcbのアドレスはr1に掐っている */ ldr 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 /* interrupt_countを0クリア */ mov r3, #0 str r3, [r6] /* * FIQは撅に敦贿するˉ */ mov r5, #(CPSR_SVC|CPSR_FIQ_BIT|CPSR_IRQ_BIT) /* 充り哈み敦贿(システムモ〖ド) */ mov r4, #(CPSR_SVC|CPSR_FIQ_BIT) /* 充り哈み钓材(システムモ〖ド) */ msr cpsr, r5 /* システムモ〖ド */dispatcher_1: /* * ここではシステムモ〖ドˇ充哈み敦贿觉轮でなければならないˉ */ ldr r0, =schedtsk /* schedtsk を粕み哈む */ ldr r1, [r0] cmp r1, #0 beq dispatcher_2#ifdef GHS_HOOK /* GHS */ stmfd sp!,{r0,r1} mov r0,r1 ldr r2,=dispatch_hook mov lr,pc mov pc,r2 ldmfd sp!,{r0,r1}#endif ldr r2, =runtsk /* 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 /* 充哈み略ち */ WAIT_INTERRUPT msr cpsr, r5 /* 充哈み敦贿 */ mov r3,#0 str r3, [r6] b dispatcher_1 /* * タスク弹瓢箕借妄 */ .text .globl activate_ractivate_r: mov r1,#(CPSR_SVC|CPSR_FIQ_BIT) /* 充り哈み钓材(システムモ〖ド) */ msr cpsr, r1 /* 充哈み钓材 */ ldr lr, =ext_tsk /* 提り戎孟肋年 */ ldmfd sp!, {r0,pc} /* 苞眶,PC肋年 */ /* * 充哈みハンドラ】CPU毋嘲ハンドラ叫庚借妄 * * ret_int はシステムモ〖ドˇIRQ充哈み敦贿觉轮で钙び叫すˉ */ .text .globl ret_int .globl ret_exc ret_int:ret_exc: /* * システムモ〖ドで丸ること */ ldr r2, =runtsk /* runtsk を粕み哈む */ ldr r1, [r2] ldr r2, =enadsp ldr r0, [r2] cmp r0, #0 beq ret_int_1 ldr r2, =schedtsk ldr r0, [r2] cmp r0, r1 /* schedtsk と runtskを孺秤 */ beq ret_int_1 stmfd sp!, {r4-r11} /* 荒りのレジスタを瘦赂 */ str sp, [r1,#TCB_sp] /* タスクスタックを瘦赂 */ adr r0, ret_int_r /* 悸乖浩倡戎孟を瘦赂 */ str r0, [r1,#TCB_pc] b dispatcher_1ret_int_r: ldmfd sp!, {r4-r11} /* レジスタの牲耽 */ret_int_1: /* * タスク毋嘲借妄ル〖チンの弹瓢 * dispatch_r は dispatcher_1 から钙び叫されるため· * tcbのアドレスはr1に掐っている * ret_int_1 は ret_exeから钙び叫される */ ldr 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} /* タスクへ提る */ /* * 腮警箕粗略ち */ .globl sil_dly_nsesil_dly_nse: sub r0, r0, #SIL_DLY_TIM1 cmp r0, #0 bgt _sil_dly_nse1 movle pc, lr_sil_dly_nse1: sub r0, r0, #SIL_DLY_TIM2 cmp r0, #0 bgt _sil_dly_nse1 movle pc, lr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -