source: asp3_wo_tecs/trunk/extension/dcre/kernel/task_manage.c@ 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: 12.3 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) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * $Id: task_manage.c 470 2015-12-30 09:50:36Z ertl-hiro $
56 */
57
58/*
59 * タスク管理機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65#include "taskhook.h"
66#include "wait.h"
67
68/*
69 * トレースログマクロのデフォルト定義
70 */
71#ifndef LOG_ACRE_TSK_ENTER
72#define LOG_ACRE_TSK_ENTER(pk_ctsk)
73#endif /* LOG_ACRE_TSK_ENTER */
74
75#ifndef LOG_ACRE_TSK_LEAVE
76#define LOG_ACRE_TSK_LEAVE(ercd)
77#endif /* LOG_ACRE_TSK_LEAVE */
78
79#ifndef LOG_DEL_TSK_ENTER
80#define LOG_DEL_TSK_ENTER(tskid)
81#endif /* LOG_DEL_TSK_ENTER */
82
83#ifndef LOG_DEL_TSK_LEAVE
84#define LOG_DEL_TSK_LEAVE(ercd)
85#endif /* LOG_DEL_TSK_LEAVE */
86
87#ifndef LOG_ACT_TSK_ENTER
88#define LOG_ACT_TSK_ENTER(tskid)
89#endif /* LOG_ACT_TSK_ENTER */
90
91#ifndef LOG_ACT_TSK_LEAVE
92#define LOG_ACT_TSK_LEAVE(ercd)
93#endif /* LOG_ACT_TSK_LEAVE */
94
95#ifndef LOG_CAN_ACT_ENTER
96#define LOG_CAN_ACT_ENTER(tskid)
97#endif /* LOG_CAN_ACT_ENTER */
98
99#ifndef LOG_CAN_ACT_LEAVE
100#define LOG_CAN_ACT_LEAVE(ercd)
101#endif /* LOG_CAN_ACT_LEAVE */
102
103#ifndef LOG_GET_TST_ENTER
104#define LOG_GET_TST_ENTER(tskid, p_tskstat)
105#endif /* LOG_GET_TST_ENTER */
106
107#ifndef LOG_GET_TST_LEAVE
108#define LOG_GET_TST_LEAVE(ercd, p_tskstat)
109#endif /* LOG_GET_TST_LEAVE */
110
111#ifndef LOG_CHG_PRI_ENTER
112#define LOG_CHG_PRI_ENTER(tskid, tskpri)
113#endif /* LOG_CHG_PRI_ENTER */
114
115#ifndef LOG_CHG_PRI_LEAVE
116#define LOG_CHG_PRI_LEAVE(ercd)
117#endif /* LOG_CHG_PRI_LEAVE */
118
119#ifndef LOG_GET_PRI_ENTER
120#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
121#endif /* LOG_GET_PRI_ENTER */
122
123#ifndef LOG_GET_PRI_LEAVE
124#define LOG_GET_PRI_LEAVE(ercd, p_tskpri)
125#endif /* LOG_GET_PRI_LEAVE */
126
127#ifndef LOG_GET_INF_ENTER
128#define LOG_GET_INF_ENTER(p_exinf)
129#endif /* LOG_GET_INF_ENTER */
130
131#ifndef LOG_GET_INF_LEAVE
132#define LOG_GET_INF_LEAVE(ercd, p_exinf)
133#endif /* LOG_GET_INF_LEAVE */
134
135/*
136 * タスクの生成
137 */
138#ifdef TOPPERS_acre_tsk
139
140#ifndef TARGET_MIN_STKSZ
141#define TARGET_MIN_STKSZ 1U /* 未定義の場合は0でないことをチェック */
142#endif /* TARGET_MIN_STKSZ */
143
144ER_UINT
145acre_tsk(const T_CTSK *pk_ctsk)
146{
147 TCB *p_tcb;
148 TINIB *p_tinib;
149 ATR tskatr;
150 void *stk;
151 ER ercd;
152
153 LOG_ACRE_TSK_ENTER(pk_ctsk);
154 CHECK_TSKCTX_UNL();
155 CHECK_RSATR(pk_ctsk->tskatr, TA_ACT|TARGET_TSKATR);
156 CHECK_PAR(FUNC_ALIGN(pk_ctsk->task));
157 CHECK_PAR(FUNC_NONNULL(pk_ctsk->task));
158 CHECK_PAR(VALID_TPRI(pk_ctsk->itskpri));
159 CHECK_PAR(pk_ctsk->stksz >= TARGET_MIN_STKSZ);
160 if (pk_ctsk->stk != NULL) {
161 CHECK_PAR(STKSZ_ALIGN(pk_ctsk->stksz));
162 CHECK_PAR(STACK_ALIGN(pk_ctsk->stk));
163 }
164 tskatr = pk_ctsk->tskatr;
165 stk = pk_ctsk->stk;
166
167 lock_cpu();
168 if (queue_empty(&free_tcb)) {
169 ercd = E_NOID;
170 }
171 else {
172 if (stk == NULL) {
173 stk = kernel_malloc(ROUND_STK_T(pk_ctsk->stksz));
174 tskatr |= TA_MEMALLOC;
175 }
176 if (stk == NULL) {
177 ercd = E_NOMEM;
178 }
179 else {
180 p_tcb = ((TCB *) queue_delete_next(&free_tcb));
181 p_tinib = (TINIB *)(p_tcb->p_tinib);
182 p_tinib->tskatr = tskatr;
183 p_tinib->exinf = pk_ctsk->exinf;
184 p_tinib->task = pk_ctsk->task;
185 p_tinib->ipriority = INT_PRIORITY(pk_ctsk->itskpri);
186#ifdef USE_TSKINICTXB
187 init_tskinictxb(&(p_tinib->tskinictxb), stk, pk_ctsk);
188#else /* USE_TSKINICTXB */
189 p_tinib->stksz = pk_ctsk->stksz;
190 p_tinib->stk = stk;
191#endif /* USE_TSKINICTXB */
192
193 p_tcb->actque = false;
194 make_dormant(p_tcb);
195 if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
196 make_active(p_tcb);
197 }
198 ercd = TSKID(p_tcb);
199 }
200 }
201 unlock_cpu();
202
203 error_exit:
204 LOG_ACRE_TSK_LEAVE(ercd);
205 return(ercd);
206}
207
208#endif /* TOPPERS_acre_tsk */
209
210/*
211 * タスクの削除[NGKI1100]
212 */
213#ifdef TOPPERS_del_tsk
214
215ER
216del_tsk(ID tskid)
217{
218 TCB *p_tcb;
219 TINIB *p_tinib;
220 ER ercd;
221
222 LOG_DEL_TSK_ENTER(tskid);
223 CHECK_TSKCTX_UNL(); /*[NGKI1101][NGKI1102]*/
224 CHECK_ID(VALID_TSKID(tskid)); /*ï¼»NGKI1103ï¼½*/
225 p_tcb = get_tcb(tskid);
226
227 lock_cpu();
228 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
229 ercd = E_NOEXS; /*ï¼»NGKI1104ï¼½*/
230 }
231 else if (tskid <= tmax_stskid || !TSTAT_DORMANT(p_tcb->tstat)) {
232 ercd = E_OBJ; /*[NGKI1106][NGKI1107]*/
233 }
234 else {
235 p_tinib = (TINIB *)(p_tcb->p_tinib);
236#ifdef USE_TSKINICTXB
237 term_tskinictxb(&(p_tinib->tskinictxb));
238#else /* USE_TSKINICTXB */
239 if ((p_tinib->tskatr & TA_MEMALLOC) != 0U) { /*ï¼»NGKI1109ï¼½*/
240 kernel_free(p_tinib->stk);
241 }
242#endif /* USE_TSKINICTXB */
243 p_tinib->tskatr = TA_NOEXS; /*ï¼»NGKI1108ï¼½*/
244 queue_insert_prev(&free_tcb, &(p_tcb->task_queue));
245 ercd = E_OK;
246 }
247 unlock_cpu();
248
249 error_exit:
250 LOG_DEL_TSK_LEAVE(ercd);
251 return(ercd);
252}
253
254#endif /* TOPPERS_del_tsk */
255
256/*
257 * タスクの起動[NGKI3529]
258 */
259#ifdef TOPPERS_act_tsk
260
261ER
262act_tsk(ID tskid)
263{
264 TCB *p_tcb;
265 ER ercd;
266
267 LOG_ACT_TSK_ENTER(tskid);
268 CHECK_UNL(); /*ï¼»NGKI1114ï¼½*/
269 if (tskid == TSK_SELF && !sense_context()) {
270 p_tcb = p_runtsk; /*ï¼»NGKI1121ï¼½*/
271 }
272 else {
273 CHECK_ID(VALID_TSKID(tskid)); /*ï¼»NGKI1115ï¼½*/
274 p_tcb = get_tcb(tskid);
275 }
276
277 lock_cpu();
278 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
279 ercd = E_NOEXS; /*ï¼»NGKI1116ï¼½*/
280 }
281 else if (TSTAT_DORMANT(p_tcb->tstat)) {
282 make_active(p_tcb); /*ï¼»NGKI1118ï¼½*/
283 if (p_runtsk != p_schedtsk) {
284 if (!sense_context()) {
285 dispatch();
286 }
287 else {
288 request_dispatch();
289 }
290 }
291 ercd = E_OK;
292 }
293 else if ((p_tcb->p_tinib->tskatr & TA_NOACTQUE) != 0U || p_tcb->actque) {
294 ercd = E_QOVR; /*ï¼»NGKI3528ï¼½*/
295 }
296 else {
297 p_tcb->actque = true; /*ï¼»NGKI3527ï¼½*/
298 ercd = E_OK;
299 }
300 unlock_cpu();
301
302 error_exit:
303 LOG_ACT_TSK_LEAVE(ercd);
304 return(ercd);
305}
306
307#endif /* TOPPERS_act_tsk */
308
309/*
310 * タスク起動要求のキャンセル[NGKI1138]
311 */
312#ifdef TOPPERS_can_act
313
314ER_UINT
315can_act(ID tskid)
316{
317 TCB *p_tcb;
318 ER_UINT ercd;
319
320 LOG_CAN_ACT_ENTER(tskid);
321 CHECK_TSKCTX_UNL(); /*[NGKI1139][NGKI1140]*/
322 if (tskid == TSK_SELF) {
323 p_tcb = p_runtsk; /*ï¼»NGKI1146ï¼½*/
324 }
325 else {
326 CHECK_ID(VALID_TSKID(tskid)); /*ï¼»NGKI1141ï¼½*/
327 p_tcb = get_tcb(tskid);
328 }
329
330 lock_cpu();
331 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
332 ercd = E_NOEXS; /*ï¼»NGKI1142ï¼½*/
333 }
334 else {
335 ercd = p_tcb->actque ? 1 : 0; /*ï¼»NGKI1144ï¼½*/
336 p_tcb->actque = false; /*ï¼»NGKI1144ï¼½*/
337 }
338 unlock_cpu();
339
340 error_exit:
341 LOG_CAN_ACT_LEAVE(ercd);
342 return(ercd);
343}
344
345#endif /* TOPPERS_can_act */
346
347/*
348 * タスク状æ…
349‹ã®å‚ç…
350§ï¼»NGKI3613ï¼½
351 */
352#ifdef TOPPERS_get_tst
353
354ER
355get_tst(ID tskid, STAT *p_tskstat)
356{
357 TCB *p_tcb;
358 uint_t tstat;
359 ER ercd;
360
361 LOG_GET_TST_ENTER(tskid, p_tskstat);
362 CHECK_TSKCTX_UNL(); /*[NGKI3614][NGKI3615]*/
363 if (tskid == TSK_SELF) {
364 p_tcb = p_runtsk; /*ï¼»NGKI3621ï¼½*/
365 }
366 else {
367 CHECK_ID(VALID_TSKID(tskid)); /*ï¼»NGKI3616ï¼½*/
368 p_tcb = get_tcb(tskid);
369 }
370
371 lock_cpu();
372 tstat = p_tcb->tstat;
373 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
374 ercd = E_NOEXS; /*ï¼»NGKI3617ï¼½*/
375 }
376 else if (TSTAT_DORMANT(tstat)) { /*ï¼»NGKI3620ï¼½*/
377 *p_tskstat = TTS_DMT;
378 }
379 else if (TSTAT_SUSPENDED(tstat)) {
380 if (TSTAT_WAITING(tstat)) {
381 *p_tskstat = TTS_WAS;
382 }
383 else {
384 *p_tskstat = TTS_SUS;
385 }
386 }
387 else if (TSTAT_WAITING(tstat)) {
388 *p_tskstat = TTS_WAI;
389 }
390 else if (p_tcb == p_runtsk) {
391 *p_tskstat = TTS_RUN;
392 }
393 else {
394 *p_tskstat = TTS_RDY;
395 }
396 ercd = E_OK;
397 unlock_cpu();
398
399 error_exit:
400 LOG_GET_TST_LEAVE(ercd, p_tskstat);
401 return(ercd);
402}
403
404#endif /* TOPPERS_get_tst */
405
406/*
407 * タスクのベース優å…
408ˆåº¦ã®å¤‰æ›´ï¼»NGKI1183ï¼½
409 */
410#ifdef TOPPERS_chg_pri
411
412ER
413chg_pri(ID tskid, PRI tskpri)
414{
415 TCB *p_tcb;
416 uint_t newbpri;
417 ER ercd;
418
419 LOG_CHG_PRI_ENTER(tskid, tskpri);
420 CHECK_TSKCTX_UNL(); /*[NGKI1184][NGKI1185]*/
421 if (tskid == TSK_SELF) {
422 p_tcb = p_runtsk; /*ï¼»NGKI1198ï¼½*/
423 }
424 else {
425 CHECK_ID(VALID_TSKID(tskid)); /*ï¼»NGKI1187ï¼½*/
426 p_tcb = get_tcb(tskid);
427 }
428 if (tskpri == TPRI_INI) {
429 newbpri = p_tcb->p_tinib->ipriority; /*ï¼»NGKI1199ï¼½*/
430 }
431 else {
432 CHECK_PAR(VALID_TPRI(tskpri)); /*ï¼»NGKI1188ï¼½*/
433 newbpri = INT_PRIORITY(tskpri);
434 }
435
436 lock_cpu();
437 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
438 ercd = E_NOEXS; /*ï¼»NGKI1189ï¼½*/
439 }
440 else if (TSTAT_DORMANT(p_tcb->tstat)) {
441 ercd = E_OBJ; /*ï¼»NGKI1191ï¼½*/
442 }
443 else if ((p_tcb->p_lastmtx != NULL || TSTAT_WAIT_MTX(p_tcb->tstat))
444 && !((*mtxhook_check_ceilpri)(p_tcb, newbpri))) {
445 ercd = E_ILUSE; /*ï¼»NGKI1201ï¼½*/
446 }
447 else {
448 p_tcb->bpriority = newbpri; /*ï¼»NGKI1192ï¼½*/
449 if (p_tcb->p_lastmtx == NULL || !((*mtxhook_scan_ceilmtx)(p_tcb))) {
450 change_priority(p_tcb, newbpri, false); /*ï¼»NGKI1193ï¼½*/
451 if (p_runtsk != p_schedtsk) {
452 dispatch();
453 } /*ï¼»NGKI1197ï¼½*/
454 }
455 ercd = E_OK;
456 }
457 unlock_cpu();
458
459 error_exit:
460 LOG_CHG_PRI_LEAVE(ercd);
461 return(ercd);
462}
463
464#endif /* TOPPERS_chg_pri */
465
466/*
467 * タスク優å…
468ˆåº¦ã®å‚ç…
469§ï¼»NGKI1202ï¼½
470 */
471#ifdef TOPPERS_get_pri
472
473ER
474get_pri(ID tskid, PRI *p_tskpri)
475{
476 TCB *p_tcb;
477 ER ercd;
478
479 LOG_GET_PRI_ENTER(tskid, p_tskpri);
480 CHECK_TSKCTX_UNL(); /*[NGKI1203][NGKI1204]*/
481 if (tskid == TSK_SELF) {
482 p_tcb = p_runtsk; /*ï¼»NGKI1211ï¼½*/
483 }
484 else {
485 CHECK_ID(VALID_TSKID(tskid)); /*ï¼»NGKI1205ï¼½*/
486 p_tcb = get_tcb(tskid);
487 }
488
489 lock_cpu();
490 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
491 ercd = E_NOEXS; /*ï¼»NGKI1206ï¼½*/
492 }
493 else if (TSTAT_DORMANT(p_tcb->tstat)) {
494 ercd = E_OBJ; /*ï¼»NGKI1209ï¼½*/
495 }
496 else {
497 *p_tskpri = EXT_TSKPRI(p_tcb->priority); /*ï¼»NGKI1210ï¼½*/
498 ercd = E_OK;
499 }
500 unlock_cpu();
501
502 error_exit:
503 LOG_GET_PRI_LEAVE(ercd, p_tskpri);
504 return(ercd);
505}
506
507#endif /* TOPPERS_get_pri */
508
509/*
510 * 自タスクの拡張情
511報の参ç…
512§ï¼»NGKI1212ï¼½
513 */
514#ifdef TOPPERS_get_inf
515
516ER
517get_inf(intptr_t *p_exinf)
518{
519 ER ercd;
520
521 LOG_GET_INF_ENTER(p_exinf);
522 CHECK_TSKCTX_UNL(); /*[NGKI1213][NGKI1214]*/
523
524 lock_cpu();
525 *p_exinf = p_runtsk->p_tinib->exinf; /*ï¼»NGKI1216ï¼½*/
526 ercd = E_OK;
527 unlock_cpu();
528
529 error_exit:
530 LOG_GET_INF_LEAVE(ercd, p_exinf);
531 return(ercd);
532}
533
534#endif /* TOPPERS_get_inf */
Note: See TracBrowser for help on using the repository browser.