1 | /*
|
---|
2 | * TOPPERS Software
|
---|
3 | * Toyohashi Open Platform for Embedded Real-Time Systems
|
---|
4 | *
|
---|
5 | * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
|
---|
6 | * Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
7 | *
|
---|
8 | * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
|
---|
9 | * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
---|
10 | * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
---|
11 | * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
---|
12 | * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
---|
13 | * スコード中に含まれていること.
|
---|
14 | * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
---|
15 | * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
---|
16 | * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
---|
17 | * の無保証規定を掲載すること.
|
---|
18 | * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
---|
19 | * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
---|
20 | * と.
|
---|
21 | * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
---|
22 | * 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
---|
23 | * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
---|
24 | * 報告すること.
|
---|
25 | * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
---|
26 | * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
---|
27 | * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
---|
28 | * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
---|
29 | * 免責すること.
|
---|
30 | *
|
---|
31 | * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
32 | * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
33 | * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
34 | * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
35 | * の責任を負わない.
|
---|
36 | *
|
---|
37 | * @(#) $Id$
|
---|
38 | */
|
---|
39 |
|
---|
40 | /*
|
---|
41 | * カーネル用のスタートアップモジュール(ARM-M用)
|
---|
42 | */
|
---|
43 | #define TOPPERS_MACRO_ONLY
|
---|
44 | #define UINT_C(val) (val) /* uint_t型の定数を作るマクロ */
|
---|
45 | #define ULONG_C(val) (val) /* ulong_t型の定数を作るマクロ */
|
---|
46 | #define CAST(type, val) (val) /* 型キャストを行うマクロ */
|
---|
47 |
|
---|
48 | #include "kernel_impl.h"
|
---|
49 | #include "arm_m.h"
|
---|
50 | #include "target_asm.inc"
|
---|
51 |
|
---|
52 | #if defined(TOPPERS_CORTEX_M0PLUS) || defined(TOPPERS_CORTEX_M0)
|
---|
53 | #define mov movs
|
---|
54 | #define add adds
|
---|
55 | #endif
|
---|
56 |
|
---|
57 | /*
|
---|
58 | * スタートアップルーチン
|
---|
59 | *
|
---|
60 | * Threadモードで呼び出されることを前提としてる.
|
---|
61 | */
|
---|
62 | ATEXT
|
---|
63 | ABALIGN(4)
|
---|
64 | ATHUMB(_start)
|
---|
65 | AGLOBAL(_start)
|
---|
66 | ALABEL(_start)
|
---|
67 | cpsid f /* 割込みロック状態へ */
|
---|
68 |
|
---|
69 | #ifdef INIT_MSP
|
---|
70 | /*
|
---|
71 | * MSPの設定
|
---|
72 | */
|
---|
73 | mov r0, #CONTROL_MSP /* MSPを有効に */
|
---|
74 | msr control, r0
|
---|
75 | isb /* control の操作後に必要 */
|
---|
76 | ldr r0,=_kernel_istkpt
|
---|
77 | ldr r1,[r0]
|
---|
78 | msr msp, r1
|
---|
79 | #endif /* INIT_MSP */
|
---|
80 |
|
---|
81 | #ifdef TOPPERS_FPU_ENABLE
|
---|
82 | /*
|
---|
83 | * FPUの有効化
|
---|
84 | */
|
---|
85 | ldr r0,=(CPACR)
|
---|
86 | ldr r1,=(CPACR_FPU_ENABLE)
|
---|
87 | ldr r2,[r0]
|
---|
88 | orr r2,r2,r1
|
---|
89 | str r2,[r0]
|
---|
90 |
|
---|
91 | /*
|
---|
92 | * FPCAを初期化
|
---|
93 | */
|
---|
94 | ldr r0, =(FPCCR_INIT)
|
---|
95 | ldr r1, =(FPCCR)
|
---|
96 | str r0, [r1]
|
---|
97 | #endif /* TOPPERS_FPU_ENABLE */
|
---|
98 |
|
---|
99 | /*
|
---|
100 | * hardware_init_hookの呼び出し (0でない場合)
|
---|
101 | *
|
---|
102 | * ターゲットハードウェアに依存して必要な初期化処理がある場合
|
---|
103 | * は,hardware_init_hook という関数を用意する
|
---|
104 | */
|
---|
105 | ldr r0, =hardware_init_hook
|
---|
106 | #if defined(TOPPERS_CORTEX_M0PLUS) || defined(TOPPERS_CORTEX_M0)
|
---|
107 | cmp r0, #0
|
---|
108 | beq.n start_1
|
---|
109 | #else
|
---|
110 | cbz r0, start_1
|
---|
111 | #endif
|
---|
112 | blx r0
|
---|
113 |
|
---|
114 | ALABEL(start_1)
|
---|
115 | #ifndef OMIT_BSS_INIT
|
---|
116 | /*
|
---|
117 | * BSSセクション初期化
|
---|
118 | */
|
---|
119 | mov r0, #0
|
---|
120 | ldr r1, =BSS_START
|
---|
121 | ldr r2, =BSS_END
|
---|
122 | cmp r1, r2
|
---|
123 | bhs start_3
|
---|
124 | ALABEL(start_2)
|
---|
125 | str r0, [r1]
|
---|
126 | add r1,r1, #4
|
---|
127 | cmp r1, r2
|
---|
128 | blo start_2
|
---|
129 | #endif /* OMIT_BSS_INIT */
|
---|
130 |
|
---|
131 |
|
---|
132 | ALABEL(start_3)
|
---|
133 | #ifndef OMIT_DATA_INIT
|
---|
134 | /*
|
---|
135 | * DATAセクション初期化
|
---|
136 | * __idata_start から __idata_end までを,__data_start 以降に
|
---|
137 | * コピーする
|
---|
138 | */
|
---|
139 | ldr r1, =IDATA_START
|
---|
140 | ldr r2, =IDATA_END
|
---|
141 | cmp r1, r2
|
---|
142 | bhs start_5
|
---|
143 | ldr r3, =DATA_START
|
---|
144 | ALABEL(start_4)
|
---|
145 | ldr r0, [r1]
|
---|
146 | str r0, [r3]
|
---|
147 | add r1, #4
|
---|
148 | add r3, #4
|
---|
149 | cmp r1, r2
|
---|
150 | blo start_4
|
---|
151 | #endif /* OMIT_DATA_INIT */
|
---|
152 |
|
---|
153 | /*
|
---|
154 | * software_init_hook を呼出し(0 でない場合)
|
---|
155 | *
|
---|
156 | * ソフトウェア環境(特にライブラリ)に依存して必要な初期化処
|
---|
157 | * 理がある場合は,software_init_hook という関数を用意すれば
|
---|
158 | * よい.
|
---|
159 | */
|
---|
160 | ALABEL(start_5)
|
---|
161 | ldr r0, =software_init_hook
|
---|
162 | #if defined(TOPPERS_CORTEX_M0PLUS) || defined(TOPPERS_CORTEX_M0)
|
---|
163 | cmp r0, #0
|
---|
164 | beq.n start_6
|
---|
165 | #else
|
---|
166 | cbz r0, start_6
|
---|
167 | #endif
|
---|
168 | blx r0
|
---|
169 |
|
---|
170 | ALABEL(start_6)
|
---|
171 | bl sta_ker
|
---|
172 |
|
---|
173 | ALABEL(l_end)
|
---|
174 | b l_end
|
---|