source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/armv4-ghs/cpu_support.arm@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 8.5 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * 2003 by Advanced Data Controls, Corp
9 *
10 * 上記著作権者
11は,以下の (1)〜(4) の条件か,Free Software Foundation
12 * によってå…
13¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
14 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
15 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
16å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
17 * 利用と呼ぶ)することを無償で許諾する.
18 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
19 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
20 * スコード中に含まれていること.
21 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
22 * 用できる形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
24å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
25 * 者
26マニュアルなど)に,上記の著作権表示,この利用条件および下記
27 * の無保証規定を掲載すること.
28 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
29 * 用できない形で再é…
30å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
31 * と.
32 * (a) 再é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
34マニュアルなど)に,上記の著
35 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
36 * (b) 再é…
37å¸ƒã®å½¢æ…
38‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
39 * 報告すること.
40 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41 * 害からも,上記著作権者
42およびTOPPERSプロジェクトをå…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
48 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
49 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
50 *
51 * @(#) $Id: cpu_support.arm,v 1.4 2003/12/24 06:51:28 honda Exp $
52 */
53
54/*
55 * プロセッサ依存モジュール アセンブリ言語部(ARMv4用)
56 */
57#define _MACRO_ONLY
58#include "jsp_kernel.h"
59#include "offset.h"
60#include <armv4.h>
61#include <t_config.h>
62
63/*
64 * タスクディスパッチャ
65 *
66 * dispatchは,
67 * dispatch は,システムモード・割込み禁止状æ…
68‹ã§å‘¼ã³å‡ºã•ãªã‘ればならな
69 * い._exit_and_dispatch も,システムモード・割込み禁止状æ…
70‹ã§å‘¼ã³å‡ºã™
71 * のが原則であるが,カーネル起動時に対応するため,IRQモードで呼び出した
72 * 場合にも対応している.
73 */
74
75 .text
76 .align 4
77 .globl dispatch
78 .globl exit_and_dispatch
79dispatch:
80 stmfd sp!, {r4 - r11,lr} /* レジスタの保存 */
81 ldr r0, =runtsk /* runtskを読み込む */
82 ldr r1, [r0]
83 str sp, [r1,#TCB_sp] /* タスクスタックを保存 */
84 adr r2, dispatch_r
85 str r2, [r1,#TCB_pc] /* 実行再開番地を保存 */
86 ldr r6, =interrupt_count /* r6 <-interrupt_count */
87 mov r5, #(CPSR_SVC|CPSR_FIQ_BIT|CPSR_IRQ_BIT) /* 割り込み禁止(システムモード) */
88 mov r4, #(CPSR_SVC|CPSR_FIQ_BIT) /* 割り込み許可(システムモード) */
89 b dispatcher_1
90
91dispatch_r:
92 ldmfd sp!,{r4 - r11,lr}
93 /*
94 * タスク例外処理ルーチンの起動
95 * dispatch_r は dispatcher_1 から呼び出されるため,
96 * tcbのアドレスはr1にå…
97¥ã£ã¦ã„ã‚‹
98 */
99 ldr r0,[r1,#TCB_enatex]
100 tst r0,#TCB_enatex_mask
101 beq dispatch_r_1 /* enatex が FALSE ならリターン */
102 ldr r0,[r1,#TCB_texptn] /* texptnをロード */
103 tst r0,r0 /* texptn が0で無ければ */
104 bne call_texrtn /* タスク例外ルーチンの呼び出し */
105dispatch_r_1:
106 mov pc,lr
107
108
109
110exit_and_dispatch:
111 ldr r6, =interrupt_count /* interrupt_countを0クリア */
112 mov r3, #0
113 str r3, [r6]
114 /*
115 * FIQは常に禁止する.
116 */
117 mov r5, #(CPSR_SVC|CPSR_FIQ_BIT|CPSR_IRQ_BIT) /* 割り込み禁止(システムモード) */
118 mov r4, #(CPSR_SVC|CPSR_FIQ_BIT) /* 割り込み許可(システムモード) */
119 msr cpsr, r5 /* システムモード */
120dispatcher_1:
121 /*
122 * ここではシステムモード・割込み禁止状æ…
123‹ã§ãªã‘ればならない.
124 */
125 ldr r0, =schedtsk /* schedtsk を読み込む */
126 ldr r1, [r0]
127 cmp r1, #0
128 beq dispatcher_2
129#ifdef GHS_HOOK /* GHS */
130 stmfd sp!,{r0,r1}
131 mov r0,r1
132 ldr r2,=dispatch_hook
133 mov lr,pc
134 mov pc,r2
135 ldmfd sp!,{r0,r1}
136#endif
137 ldr r2, =runtsk /* schedtsk を runtskに */
138 str r1, [r2]
139dispatcher_3:
140 ldr sp, [r1,#TCB_sp] /* タスクスタックを復帰 */
141 ldr pc, [r1,#TCB_pc] /* 実行再開番地を復帰 */
142dispatcher_2:
143 mov r3,#1
144 str r3, [r6]
145 /* sleepモードを持つCPUなら書き換える */
146 msr cpsr, r4 /* 割込み待
147ち */
148 WAIT_INTERRUPT
149 msr cpsr, r5 /* 割込み禁止 */
150 mov r3,#0
151 str r3, [r6]
152 b dispatcher_1
153
154
155
156/*
157 * タスク起動時処理
158 */
159 .text
160 .globl activate_r
161activate_r:
162 mov r1,#(CPSR_SVC|CPSR_FIQ_BIT) /* 割り込み許可(システムモード) */
163 msr cpsr, r1 /* 割込み許可 */
164 ldr lr, =ext_tsk /* 戻り番地設定 */
165 ldmfd sp!, {r0,pc} /* 引数,PC設定 */
166
167
168
169/*
170 * 割込みハンドラ/CPU例外ハンドラ出口処理
171 *
172 * ret_int はシステムモード・IRQ割込み禁止状æ…
173‹ã§å‘¼ã³å‡ºã™ï¼Ž
174 */
175 .text
176 .globl ret_int
177 .globl ret_exc
178ret_int:
179ret_exc:
180 /*
181 * システムモードで来ること
182 */
183 ldr r2, =runtsk /* runtsk を読み込む */
184 ldr r1, [r2]
185 ldr r2, =enadsp
186 ldr r0, [r2]
187 cmp r0, #0
188 beq ret_int_1
189 ldr r2, =schedtsk
190 ldr r0, [r2]
191 cmp r0, r1 /* schedtsk と runtskを比較 */
192 beq ret_int_1
193 stmfd sp!, {r4-r11} /* 残りのレジスタを保存 */
194 str sp, [r1,#TCB_sp] /* タスクスタックを保存 */
195 adr r0, ret_int_r /* 実行再開番地を保存 */
196 str r0, [r1,#TCB_pc]
197 b dispatcher_1
198ret_int_r:
199 ldmfd sp!, {r4-r11} /* レジスタの復帰 */
200ret_int_1:
201 /*
202 * タスク例外処理ルーチンの起動
203 * dispatch_r は dispatcher_1 から呼び出されるため,
204 * tcbのアドレスはr1にå…
205¥ã£ã¦ã„ã‚‹
206 * ret_int_1 は ret_exeから呼び出される
207 */
208 ldr r0, [r1,#TCB_enatex]
209 tst r0, #TCB_enatex_mask
210 beq ret_int_2 /* enatex が FALSE ならリターン */
211 ldr r0, [r1,#TCB_texptn] /* texptnをロード */
212 tst r0, r0 /* texptn が0で無ければ */
213 blne call_texrtn /* タスク例外ルーチンの呼び出し */
214ret_int_2:
215 ldmfd sp!, {r0} /* spsr を復帰 */
216 msr cpsr,r0
217 ldmfd sp!, {r0 - r3,ip,lr,pc} /* タスクへ戻る */
218
219
220
221 /*
222 * 微少時間待
223ち
224 */
225 .globl sil_dly_nse
226sil_dly_nse:
227 sub r0, r0, #SIL_DLY_TIM1
228 cmp r0, #0
229 bgt _sil_dly_nse1
230 movle pc, lr
231_sil_dly_nse1:
232 sub r0, r0, #SIL_DLY_TIM2
233 cmp r0, #0
234 bgt _sil_dly_nse1
235 movle pc, lr
Note: See TracBrowser for help on using the repository browser.