source: rubycfg_asp/trunk/asp_dcre/arch/rx630_gcc/makeoffset.c@ 313

Last change on this file since 313 was 313, checked in by coas-nagasima, 7 years ago

ソースを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 10.4 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2003-2004 by Naoki Saito
7 * Nagoya Municipal Industrial Research Institute, JAPAN
8 * Copyright (C) 2008-2010 by Witz Corporation, JAPAN
9 *
10 * 上記著作権者
11は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22 * 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 * の無保証規定を掲載すること.
25 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26 * 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28 * と.
29 * (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
33 * (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44 * å…
45è²¬ã™ã‚‹ã“と.
46 *
47 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * @(#) $Id: makeoffset.c 313 2017-07-23 04:50:32Z coas-nagasima $
55 */
56
57
58/*
59 * offset.inc (もしくは offset.h) について
60 *
61 * offset.inc は構造体の特定の要素が構造体のå…
62ˆé ­ã‹ã‚‰ä½•ãƒã‚¤ãƒˆç›®ã«
63 * 存在するかということや, 特定のビットフィールドがå…
64ˆé ­ã‹ã‚‰
65 * 何バイトå…
66ˆã®ä½•ãƒ“ット目に存在するか, という情
67報を
68 * アセンブリ言語ファイルに与えるために存在している.
69 *
70 * offset.inc ファイルの中身は, 単なるシンボル定義ファイルである.
71 * シンボルといっても定義するシンボルの名称にはパターンがあり,
72 * 大きく分けて次の3種類に分類できる.
73 *
74 * <構造体名>_<要素名> (例) TCB_sp, TCB_pc, TCB_enatex など
75 * <構造体名>_<要素名>_bit (例) TCB_enatex_bit など
76 * <構造体名>_<要素名>_mask (例) TCB_enatex_mask など
77 *
78 * (例)
79 * TCB_texptn .equ 14
80 * TCB_sp .equ 20
81 * TCB_pc .equ 24
82 * TCB_enatex .equ 13
83 * TCB_enatex_bit .equ 6
84 * TCB_enatex_mask .equ 0040H
85 *
86 * 一番はじめは特定の要素が構造体のå…
87ˆé ­ã‹ã‚‰ä½•ãƒã‚¤ãƒˆå…
88ˆã«ã‚るか
89 * ということを示す数値につけるラベルの名称.
90 * 二番目は特定のビットフィールド中のビットが, 下位から数えて
91 * 何ビット目にあるかということを示す数値につけるラベルの名称.
92 * 0から始まる数値で表現する. 最も下位のビットは第0ビットである.
93 * 三番目はå…
94ˆã»ã©ã® <構造体名>_<要素名>_bit とも関連するが,
95 * 特定のビットフィールド中のビットのマスク値の名称.
96 * _bit と *_mask の値の間には次の関係がある.
97 * (*_mask) == (1 << *_bit)
98 * * (例) TCB_enatex_bit が 6 の時, TCB_enatex_mask は 40H
99 *
100 * ちなみにM32C依存部の実装
101では, 特定ビットのチェックなどに
102 * ビット命令アドレッシングを使用しているので *_mask というラベルは
103 * 使用していない.
104 */
105
106/*
107 * offset.inc の作り方(M32Cターゲット依存部向け)
108 *
109 * GNU Cコンパイラを用いているターゲット依存部については,
110 * カーネルのトップディレクトリの下にある util というディレクトリの
111 * 下に genoffset という perl スクリプトが用意されているので,
112 * 特に手動で offset.h を作成する必
113要はない.
114 * genoffset は GNU 開発環境を想定して作成されているので,
115 * 生成されるアセンブリ言語疑似命令や生成規則の異なる他の
116 * Cコンパイラにはそのまま適用できない可能性がある.
117 * そこで, ここではWindows環境 向けの genoffset を用意せず,
118 * 作り方をここに記し, 手作業で offset.inc を作成してもらうことと
119 * する. 以下にその方法を示す. なお, この方法はM32Cの開発環境や
120 * 命令セットに依存しているため, 他のターゲットを使用している場合は
121 * そのまま適用できない.
122 *
123 * 1. makeoffset.c というファイルからCコンパイラを使用して
124 * アセンブリ言語ファイル makeoffset.a30 を生成する.
125 * コンパイルオプションはカーネルコードに与えるものと同じ
126 * ものを与える.
127 * ルネサス製ツール TM を使用している場合は, プロジェクトエディタの
128 * 生成手順ビューから makeoffset.a30 を選び, 右クリックメニューの
129 * 「部分ビルド」を選択することで生成できる.
130 * もしくはコマンドプロンプトでメイクファイルと同じディレクトリに
131 * 移動し, "make -f メイクファイル名 makeoffset.a30" を
132 * 実行しても同様の結果が得られる. (メイクファイルはTMが使用して
133 * いるものと同じファイルを指定可能)
134 *
135 * 2. å…
136ˆã»ã©ã® 1. の作業で得られた, makeoffset.a30 ファイルから
137 * "! BEGIN XXXX" ではじまり "! END" で終わっている部分を探す.
138 *
139 * 4箇所あり, それぞれ少しずつ異なるので順に説明する.
140 * (以下, 説明中ではアセンブリ言語ファイルのコメント行は省く)
141 *
142 * (1) 構造体のå…
143ˆé ­ã‹ã‚‰ãƒ¡ãƒ³ãƒã¸ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ
144 *
145 * ! BEGIN TCB_texptn
146 * bset 00H,0000000eH
147 * ! END
148 *
149 * 上記"! BEGIN"の後ろの文字列がoffset.incで定義するシンボル名となる.
150 * そのシンボルの値は, 次行のbset命令の第2オペランドの値である
151 * 0000000eHがそれに相当する. これが構造体のå…
152ˆé ­ã‹ã‚‰texptnまでの
153 * オフセット値となる. したがってこの場合, offset.inc には
154 * TCB_texptn .equ 14
155 * という行を記述する.
156 *
157 * (2) 構造体のメンバが構造体で, その中のメンバに対するオフセット
158 *
159 * TCB_sp についてもほぼ同様だが, sp はTCB構造体の直接の
160 * メンバでなくTCB構造体のメンバであるTSKCTXB構造体のメンバで
161 * ある点が異なる. それでも定義するシンボル名としては
162 * TCB_sp のように表現する. アセンブリ言語ファイルでは
163 *
164 * ! BEGIN TCB_sp
165 * mov.l 00000014H,A0
166 * extz [A0],R0
167 * bset 0,R0L
168 * mov.l #00000014H,A0
169 * mov.b R0L,[[A0]]
170 * ! END *
171 *
172 * のようになり,14H(=20) が求める値なのでoffset.inc には次のように
173 * 記述する.
174 *
175 * TCB_sp .equ 20
176 *
177 * (3) メンバが関数へのポインタであった場合
178 *
179 * 次は TCB_pc の場合.
180 *
181 * ! BEGIN TCB_pc
182 * mov.l #00000018H,A0
183 * jsri.a [A0]
184 * ! END
185 *
186 * pc も sp と同じく, TCB構造体の直接のメンバではないが
187 * TCB_pc と表現している. これは関数のアドレスを格納する変数なので,
188 * (((TCB *)0)->tskctxb.pc)();
189 * として関数呼び出しのように記述すると上記のようなアセンブリ言語
190 * コードを出力する. シンボル定義する際のシンボル名は今までと
191 * 同じく, TCB_pc とする.
192 * 求める値は構造体から関数ポインタまでのオフセットであり, 上のmov.l
193 * 命令の結果から 00000018H(=24) となる.
194 * したがって, offset.inc には次のように記述する.
195 *
196 * TCB_pc .equ 24
197 *
198 * (4) 構造体のメンバがビットフィールドでそのビット位置も知りたい場合
199 *
200 * ! BEGIN TCB_enatex
201 * bset 6,0000000cH+1
202 * ! END
203 *
204 * 今までと同様, BEGIN の後の文字列をシンボル名とする.
205 * ここでのTCB_enatexの値は構造体のå…
206ˆé ­ã‹ã‚‰ãƒ“ットフィールドを含むバ
207 * イトまでのオフセットで, M32Cのビット命令アドレッシングは指定でき
208 * るビット位置が0から7の間に収まるようにアクセスするアドレスに適当
209 * 数が加えられるので cH+1(=13) となっている. また, ビットフィールド
210 * 中の最下位ビットからのビット位置は 6となる.
211 * 以上より次のように書くことができる.
212 *
213 * TCB_enatex .equ 13
214 * TCB_enatex_bit .equ 6
215 * TCB_enatex_mask .equ 40H
216 */
217
218#include "kernel_impl.h"
219#include "task.h"
220#include "sil.h"
221
222const TCB ____BEGIN_OFF_TCB_tstat = {
223 { NULL, NULL }, NULL , 1, 0,
224 0, 0 , 0 , 0 , NULL , { NULL , NULL }
225 };
226
227const TCB ____BEGIN_OFF_TCB_tinib = {
228 { NULL, NULL }, (TINIB *)1 , 0 , 0,
229 0, 0 , 0 , 0 , NULL , { NULL , NULL }
230 };
231
232const TCB ____BEGIN_OFF_TCB_pc = {
233 { NULL, NULL }, NULL, 0, 0,
234 0, 0 , 0 , 0 , NULL , { NULL , (FP)1 }
235 };
236const TCB ____BEGIN_OFF_TCB_sp = {
237 { NULL, NULL }, NULL, 0, 0,
238 0, 0 , 0 , 0 , NULL , { (void *)1 , NULL }
239 };
240
241const TCB ____BEGIN_BIT_TCB_enatex = {
242 { NULL, NULL }, NULL, 0, 0,
243 0, 0 , 1 , 0 , NULL , { NULL , NULL }
244 };
245
246const TCB ____BEGIN_OFF_TCB_texptn = {
247 { NULL, NULL }, NULL, 0, 0,
248 0 , 0 , 0 , 1 , NULL , { NULL , NULL }
249 };
250
251const TINIB ____BEGIN_OFF_TINIB_exinf = {
252 0 , (intptr_t)1 , NULL , 0 , 0 , NULL , 0 , NULL
253 };
254
255const TINIB ____BEGIN_OFF_TINIB_task = {
256 0 , NULL , (TASK)1 , 0 , 0 , NULL , 0 , NULL
257 };
258
Note: See TracBrowser for help on using the repository browser.