source: asp3_wo_tecs/trunk/kernel/task.tf@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 6.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) 2007 by TAKAGI Nobuhisa
7$ Copyright (C) 2007-2014 by Embedded and Real-Time Systems Laboratory
8$ Graduate School of Information Science, Nagoya Univ., 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: task.tf 480 2016-01-03 07:37:12Z ertl-hiro $
55$
56
57$
58$ タスク管理モジュールのテンプレートファイル
59$
60
61$
62$ kernel_cfg.hの生成
63$
64$FILE "kernel_cfg.h.new"$
65
66#define TNUM_TSKID $LENGTH(TSK.ID_LIST)$$NL$
67$FOREACH id TSK.ID_LIST$
68 #define $id$ $+id$$NL$
69$END$
70
71$
72$ kernel_cfg.cの生成
73$
74$FILE "kernel_cfg.c"$
75
76/*$NL$
77$SPC$* Task Management Functions$NL$
78$SPC$*/$NL$
79$NL$
80
81$
82$ タスクのID番号を保持する変数
83$
84$IF USE_EXTERNAL_ID$
85 $FOREACH id TSK.ID_LIST$
86 const ID $id$_id = $+id$;$NL$
87 $END$$NL$
88$END$
89
90$
91$ タスクが1つも登録されていない場合[NGKI0033]
92$
93$IF !LENGTH(TSK.ID_LIST)$
94 $ERROR$$FORMAT(_("no task is registered"))$$END$
95$END$
96
97$
98$ タスクID番号の最大値
99$
100const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);$NL$
101$NL$
102
103$
104$ エラーチェック
105$
106$FOREACH tskid TSK.ID_LIST$
107$ // tskatrが無効の場合(E_RSATR)[NGKI1028]
108$ //(TA_ACT,TA_NOACTQUE,TARGET_TSKATR以外のビットがセットされている場合)
109 $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TA_NOACTQUE|TARGET_TSKATR)) != 0$
110 $ERROR TSK.TEXT_LINE[tskid]$E_RSATR:$SPC$
111 $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"),
112 "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$
113 $END$
114 $END$
115
116$ // (TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合[NGKI1034]
117 $IF !(TMIN_TPRI <= TSK.ITSKPRI[tskid] && TSK.ITSKPRI[tskid] <= TMAX_TPRI)$
118 $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$
119 $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"),
120 "itskpri", TSK.ITSKPRI[tskid], tskid, "CRE_TSK")$
121 $END$
122 $END$
123$END$
124
125$
126$ スタック領域の生成とそれに関するエラーチェック
127$
128$FOREACH tskid TSK.ID_LIST$
129$ // stkszが0以下か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも
130$ // 小さい場合[NGKI1042]
131 $IF TSK.STKSZ[tskid] <= 0 || (TARGET_MIN_STKSZ
132 && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
133 $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$
134 $FORMAT(_("too small %1% `%2%\' of `%3%\' in %4%"),
135 "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$
136 $END$
137 $END$
138
139$ // stkszがスタック領域のサイズとして正しくない場合[NGKI1056]
140 $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
141 && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
142 $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$
143 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
144 "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$
145 $END$
146 $END$
147
148$ // スタック領域の設定[NGKI1041]
149 $IF EQ(TSK.STK[tskid],"NULL")$
150$ // スタック領域の生成[NGKI1049]
151 $TSK.TINIB_STKSZ[tskid] = ALLOC_STACK(CONCAT("_kernel_stack_",
152 tskid), TSK.STKSZ[tskid])$
153 $TSK.TINIB_STK[tskid] = CONCAT("_kernel_stack_", tskid)$
154 $ELSE$
155 $TSK.TINIB_STKSZ[tskid] = FORMAT("(%1%)", TSK.STKSZ[tskid])$
156 $TSK.TINIB_STK[tskid] = FORMAT("(void *)(%1%)", TSK.STK[tskid])$
157 $END$
158$END$
159$NL$
160
161$
162$ タスク初期化ブロックの生成(タスクは1個以上存在する)
163$
164const TINIB _kernel_tinib_table[TNUM_TSKID] = {$NL$
165$JOINEACH tskid TSK.ID_LIST ",\n"$
166 $TAB${$SPC$
167$ // タスク属性,拡張情
168報,起動番地,起動時優å…
169ˆåº¦
170 ($TSK.TSKATR[tskid]$),$SPC$
171 (intptr_t)($TSK.EXINF[tskid]$),$SPC$
172 (TASK)($TSK.TASK[tskid]$),$SPC$
173 INT_PRIORITY($TSK.ITSKPRI[tskid]$),$SPC$
174
175$ // タスク初期化コンテキストブロック,スタック領域
176 $IF USE_TSKINICTXB$
177 $GENERATE_TSKINICTXB(tskid)$
178 $ELSE$
179 $TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$
180 $END$$SPC$
181 }$END$$NL$
182};$NL$
183$NL$
184
185$
186$ タスク生成順序テーブルの生成
187$
188const ID _kernel_torder_table[TNUM_TSKID] = {$NL$
189$TAB$$JOINEACH tskid TSK.ORDER_LIST ", "$$tskid$$END$$NL$
190};$NL$
191$NL$
192
193$
194$ タスク管理ブロックの生成
195$
196TCB _kernel_tcb_table[TNUM_TSKID];$NL$
197$NL$
198
199$
200$ タスク管理モジュール初期化関数
201$
202$initfuncs = "_kernel_initialize_task();"$
Note: See TracBrowser for help on using the repository browser.