source: atk2-sc3-1.4.0-ntisr/kernel/counter.c@ 172

Last change on this file since 172 was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

  • Property svn:executable set to *
File size: 15.0 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2004-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
22 *
23 * 上記著作権者
24は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
25 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
26 * 変・再é…
27å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
28 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
29 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
30 * スコード中に含まれていること.
31 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
32 * 用できる形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
35 * 者
36マニュアルなど)に,上記の著作権表示,この利用条件および下記
37 * の無保証規定を掲載すること.
38 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
39 * 用できない形で再é…
40å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
41 * と.
42 * (a) 再é…
43å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
44マニュアルなど)に,上記の著
45 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
46 * (b) 再é…
47å¸ƒã®å½¢æ…
48‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
49 * 報告すること.
50 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
51 * 害からも,上記著作権者
52およびTOPPERSプロジェクトをå…
53è²¬ã™ã‚‹ã“と.
54 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
55 * 由に基づく請求からも,上記著作権者
56およびTOPPERSプロジェクトを
57 * å…
58è²¬ã™ã‚‹ã“と.
59 *
60 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
61 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
62 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
63 * 用する者
64に対して,AUTOSARパートナーになることを求めている.
65 *
66 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
67お
68 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
69 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
70 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
71 * の責任を負わない.
72 *
73 * $Id: counter.c 425 2015-12-07 08:06:19Z witz-itoyo $
74 */
75
76/*
77 * カウンタ制御モジュール
78 */
79
80#include "kernel_impl.h"
81#include "task.h"
82#include "counter.h"
83
84/*
85 * トレースログマクロのデフォルト定義
86 */
87#ifndef LOG_INCCNT_ENTER
88#define LOG_INCCNT_ENTER(cntid)
89#endif /* LOG_INCCNT_ENTER */
90
91#ifndef LOG_INCCNT_LEAVE
92#define LOG_INCCNT_LEAVE(ercd)
93#endif /* LOG_INCCNT_LEAVE */
94
95#ifndef LOG_GETCNT_ENTER
96#define LOG_GETCNT_ENTER(cntid, p_val)
97#endif /* LOG_GETCNT_ENTER */
98
99#ifndef LOG_GETCNT_LEAVE
100#define LOG_GETCNT_LEAVE(ercd, val)
101#endif /* LOG_GETCNT_LEAVE */
102
103#ifndef LOG_GETECT_ENTER
104#define LOG_GETECT_ENTER(cntid, val, p_eval)
105#endif /* LOG_GETECT_ENTER */
106
107#ifndef LOG_GETECT_LEAVE
108#define LOG_GETECT_LEAVE(ercd, val, eval)
109#endif /* LOG_GETECT_LEAVE */
110
111/*
112 * カウンタ満了キューへの挿å…
113¥
114 */
115#ifdef TOPPERS_insert_cnt_expr_que
116
117void
118insert_cnt_expr_que(CNTEXPINFO *p_cntexpinfo, CNTCB *p_cntcb)
119{
120 TickType enqval, curval;
121 QUEUE *next;
122 CounterType cntid;
123
124 enqval = p_cntexpinfo->expiretick;
125
126 /*
127 * カウンタ満了キューへの挿å…
128¥ä½ç½®ã‚’決定するための基準点
129 *
130 * ハードウェアカウンタの場合,カウンタ満了キューへの挿å…
131¥ä½ç½®ã‚’決める基準点は
132 * 満了処理時に更新している値を使用し,ハードウェアから現在値を取得はしない
133 * (ハードウェアカウンタ上のティック値は満了しているが,まだ満了処理を実行して
134 * いない場合に,挿å…
135¥å ´æ‰€ã®åŸºæº–がずれてしまうため)
136 */
137 curval = p_cntcb->curval;
138
139 /* 挿å…
140¥å ´æ‰€ã®ã‚µãƒ¼ãƒ */
141 next = p_cntcb->cntexpque.p_next;
142
143 if (curval < enqval) {
144 /* カウンタのオーバーフローが起こらない場合 */
145 while ((next != &(p_cntcb->cntexpque)) &&
146 (curval <= ((CNTEXPINFO *) next)->expiretick) &&
147 (((CNTEXPINFO *) next)->expiretick <= enqval)) {
148 next = next->p_next;
149 }
150 }
151 else {
152 /* カウンタのオーバーフローが起こる場合 */
153 while ((next != &(p_cntcb->cntexpque)) &&
154 ((curval <= ((CNTEXPINFO *) next)->expiretick)
155 || (((CNTEXPINFO *) next)->expiretick <= enqval))) {
156 next = next->p_next;
157 }
158 }
159
160 queue_insert_prev(next, &(p_cntexpinfo->cntexpque));
161
162 /*
163 * ハードウェアカウンタかつå…
164ˆé ­ã«æŒ¿å…
165¥ã—た場合,再度ハードウェアカウンタに
166 * 満了時間を設定し直す必
167要がある
168 */
169 cntid = CNTID(p_cntcb);
170 if (is_hwcnt(cntid) && (p_cntcb->cntexpque.p_next == &(p_cntexpinfo->cntexpque))) {
171
172 /* 現在設定されている時刻をキャンセル */
173 (hwcntinib_table[cntid].cancel)();
174
175 /* å…
176ˆé ­ã«æŒ¿å…
177¥ã—た時刻に再設定 */
178 (hwcntinib_table[cntid].set)(enqval);
179 p_cntcb->hwset = TRUE;
180
181 /*
182 * 再設定中に次の満了時間を過ぎてしまったかチェック
183 *
184 * 過ぎてしまった場合, 強制割込みにより満了処理を実行する
185 * またsetした時間とgetした時間が同じであった場合,
186 * ハードウェアで取りこぼしていると想定し, 強制割込みを発生させる
187 * ハードウェアで取りこぼしていない場合に強制割込みを起こしても問題ない
188 */
189 if (diff_tick((hwcntinib_table[cntid].get)(), enqval,
190 p_cntcb->p_cntinib->maxval2) <= p_cntcb->p_cntinib->maxval) {
191 /* 現在設定されている時刻をキャンセル */
192 (hwcntinib_table[cntid].cancel)();
193 /* 強制割込みを発生させる */
194 (hwcntinib_table[cntid].trigger)();
195 }
196 }
197}
198
199#endif /* TOPPERS_insert_cnt_expr_que */
200
201/*
202 * カウンタ満了キューから削除
203 */
204#ifdef TOPPERS_delete_cnt_expr_que
205
206void
207delete_cnt_expr_que(CNTEXPINFO *p_cntexpinfo, CNTCB *p_cntcb)
208{
209 CounterType cntid;
210 QUEUE *p_cntexpque;
211
212 /* カウンタキューから満了処理を削除する前のå…
213ˆé ­ã‚­ãƒ¥ãƒ¼ä¿æŒ */
214 p_cntexpque = p_cntcb->cntexpque.p_next;
215
216 queue_delete(&(p_cntexpinfo->cntexpque));
217 queue_initialize(&(p_cntexpinfo->cntexpque));
218
219 /*
220 * ハードウェアカウンタかつ削除する満了処理はカウンタ満了の
221 * å…
222ˆé ­ã®å ´åˆï¼Œã‚¿ã‚¤ãƒžã‚’キャンセルする
223 */
224 cntid = CNTID(p_cntcb);
225 if (is_hwcnt(cntid) && (p_cntcb->cntexpque.p_next != p_cntexpque)) {
226
227 /* 現在設定されている時刻をキャンセル */
228 (hwcntinib_table[cntid].cancel)();
229
230 /* ペンディング中の割込み要求をキャンセル */
231 (hwcntinib_table[cntid].intcancel)();
232
233 /*
234 * p_cntexpinfoで指定された満了処理削除後,カウンタ満了次の
235 * 満了処理の満了点を設定する
236 */
237 if (queue_empty(&(p_cntcb->cntexpque)) == FALSE) {
238
239 /* å…
240ˆé ­ã«æŒ¿å…
241¥ã—た時刻に再設定 */
242 (hwcntinib_table[cntid].set)(((CNTEXPINFO *) p_cntcb->cntexpque.p_next)->expiretick);
243 p_cntcb->hwset = TRUE;
244
245 /*
246 * 再設定中に次の満了時間を過ぎてしまったかチェック
247 *
248 * 過ぎてしまった場合, 強制割込みにより満了処理を実行する
249 * またsetした時間とgetした時間が同じであった場合,
250 * ハードウェアで取りこぼしていると想定し, 強制割込みを発生させる
251 * ハードウェアで取りこぼしていない場合に強制割込みを起こしても問題ない
252 */
253 if (diff_tick((hwcntinib_table[cntid].get)(),
254 ((CNTEXPINFO *) p_cntcb->cntexpque.p_next)->expiretick,
255 p_cntcb->p_cntinib->maxval2) <= p_cntcb->p_cntinib->maxval) {
256 /* 現在設定されている時刻をキャンセル */
257 (hwcntinib_table[cntid].cancel)();
258 /* 強制割込みを発生させる */
259 (hwcntinib_table[cntid].trigger)();
260 }
261 }
262 }
263
264}
265
266#endif /* TOPPERS_delete_cnt_expr_que */
267
268/*
269 * カウンタ機能の初期化
270 */
271#ifdef TOPPERS_counter_initialize
272
273void
274counter_initialize(void)
275{
276 CounterType i;
277 CNTCB *p_cntcb;
278
279 for (i = 0U; i < tnum_counter; i++) {
280 p_cntcb = &(cntcb_table[i]);
281 p_cntcb->p_cntinib = &(cntinib_table[i]);
282 p_cntcb->curval = 0U;
283 p_cntcb->p_prevcntcb = NULL;
284 queue_initialize(&(p_cntcb->cntexpque));
285 p_cntcb->cstat = CS_NULL;
286 }
287
288 for (i = 0U; i < tnum_hardcounter; i++) {
289 (hwcntinib_table[i].init)(cntinib_table[i].maxval2,
290 hwcntinib_table[i].nspertick);
291 (hwcntinib_table[i].start)();
292 }
293
294}
295
296#endif /* TOPPERS_counter_initialize */
297
298/*
299 * カウンタ機能の終了処理
300 */
301#ifdef TOPPERS_counter_terminate
302
303void
304counter_terminate(void)
305{
306 CounterType i;
307
308 for (i = 0U; i < tnum_hardcounter; i++) {
309 (hwcntinib_table[i].stop)();
310 }
311}
312
313#endif /* TOPPERS_counter_terminate */
314
315/*
316 * 指定した相対時間からのカウンタ値取得(APIからの取得)
317 *
318 * 指定したカウンタの現在値と, 渡された相対値を足しこみ更新値を
319 * 戻り値として返す
320 */
321#ifdef TOPPERS_get_reltick
322
323TickType
324get_reltick(const CNTCB *p_cntcb, TickType relval)
325{
326 CounterType cntid;
327 TickType result;
328 TickType curval;
329
330 cntid = CNTID(p_cntcb);
331
332 curval = get_curval(p_cntcb, cntid);
333
334 /* 現在時間から指定されたオフセット分過ぎた時間を算出する */
335 result = add_tick(curval, relval, p_cntcb->p_cntinib->maxval2);
336
337 return(result);
338}
339
340#endif /* TOPPERS_get_reltick */
341
342/*
343 * 指定した絶対時間からのカウンタ値取得(APIからの取得)
344 *
345 * 引数で渡された絶対値を指定したカウンタの現在値に変換し
346 * 更新値を戻り値として返す
347 */
348#ifdef TOPPERS_get_abstick
349
350TickType
351get_abstick(const CNTCB *p_cntcb, TickType absval)
352{
353 CounterType cntid;
354 TickType result;
355 TickType curval;
356 TickType nextval;
357
358 cntid = CNTID(p_cntcb);
359
360 curval = get_curval(p_cntcb, cntid);
361
362 /* maxval2を考æ…
363®ã—た絶対時間に変換 */
364 nextval = absval + p_cntcb->p_cntinib->maxval + 1U;
365
366 if (curval < (p_cntcb->p_cntinib->maxval + 1U)) {
367 /*
368 * カウンタの現在値が0〜maxvalの間の場合,
369 * 絶対時刻に未到達なので,絶対時刻を返す
370 */
371 if (absval > curval) {
372 result = absval;
373 }
374 else {
375 result = nextval;
376 }
377 }
378 else {
379 /*
380 * カウンタの現在値がmaxval〜maxval2の間の場合,
381 * maxval2考æ…
382®ã—た絶対も超
383えたので,絶対時刻を返す
384 */
385 if (nextval <= curval) {
386 result = absval;
387 }
388 else {
389 result = nextval;
390 }
391 }
392
393 return(result);
394}
395
396#endif /* TOPPERS_get_abstick */
397
398/*
399 * カウンタの満了処理
400 */
401#ifdef TOPPERS_expire_process
402
403void
404expire_process(CNTCB *p_cntcb, CounterType cntid)
405{
406 CNTEXPINFO *p_cntexpinfo;
407 TickType nowval;
408
409 p_cntcb->hwset = FALSE;
410 nowval = get_curval(p_cntcb, cntid);
411
412 /*
413 * カウンタの満了処理
414 *
415 * キューが空でなく, リアルタイムな現在時間から見てキューのå…
416ˆé ­ã®æº€äº†
417 * 時間が既に過ぎていれば, 満了処理を実行する
418 *
419 * リアルタイムな現在時間をその都度取得するため,キューのå…
420ˆé ­æº€äº†å‡¦ç†
421 * の満了時間を再設定する時に目的の満了時間を超
422えてしまってもカバー
423 * できる
424 */
425 while ((queue_empty(&(p_cntcb->cntexpque)) == FALSE) &&
426 (diff_tick(nowval, ((CNTEXPINFO *) p_cntcb->cntexpque.p_next)->expiretick,
427 p_cntcb->p_cntinib->maxval2) <= p_cntcb->p_cntinib->maxval)) {
428
429 /* カウンタ満了キューのå…
430ˆé ­ã®æº€äº†å‡¦ç†ã‚’,キューから外す */
431 p_cntexpinfo = (CNTEXPINFO *) p_cntcb->cntexpque.p_next;
432 queue_delete(&(p_cntexpinfo->cntexpque));
433 queue_initialize(&(p_cntexpinfo->cntexpque));
434
435 if (is_hwcnt(cntid)) {
436 /*
437 * カウンタ値を満了処理の満了点で更新し,満了処理キューに満了点を
438 * 挿å…
439¥ã™ã‚‹æ™‚,満了処理キューの挿å…
440¥ä½ç½®æ¯”較に使用
441 */
442 p_cntcb->curval = p_cntexpinfo->expiretick;
443
444 /*
445 * 次の満了点の設定
446 * 次の満了点が実時間を経過していない場合設定する
447 */
448 if ((queue_empty(&(p_cntcb->cntexpque)) == FALSE) && ((diff_tick((hwcntinib_table[cntid].get)(),
449 ((CNTEXPINFO *) p_cntcb->cntexpque.p_next)->expiretick, p_cntcb->p_cntinib->maxval2)) >
450 p_cntcb->p_cntinib->maxval)) {
451 (hwcntinib_table[cntid].set)(((CNTEXPINFO *) p_cntcb->cntexpque.p_next)->expiretick);
452 p_cntcb->hwset = TRUE;
453 }
454 }
455
456 /* カウンタ満了処理呼出し */
457 (p_cntexpinfo->expirefunc)(p_cntexpinfo, p_cntcb);
458
459 /*
460 * タスクからの呼び出し時,高優å…
461ˆåº¦ã‚¿ã‚¹ã‚¯ãƒ¬ãƒ‡ã‚£çŠ¶æ…
462‹ã«ãªã£ãŸå ´åˆã‚るので,
463 * チェックしてディスパッチする
464 */
465 if ((p_runtsk != p_schedtsk) && (callevel_stat == TCL_TASK)) {
466 dispatch();
467 }
468
469 /*
470 * 割込みレスポンス考æ…
471®ã—,1個の満了点処理後に
472 * 1回の割込許可/禁止を実施
473 */
474 x_nested_unlock_os_int();
475 x_nested_lock_os_int();
476
477 nowval = get_curval(p_cntcb, cntid);
478 }
479
480 if (is_hwcnt(cntid) && (queue_empty(&(p_cntcb->cntexpque)) == FALSE) && (p_cntcb->hwset == FALSE)) {
481 (hwcntinib_table[cntid].set)(((CNTEXPINFO *) p_cntcb->cntexpque.p_next)->expiretick);
482 }
483}
484#endif /* TOPPERS_expire_process */
485
486/*
487 * OSAP所属するカウンタの強制終了
488 */
489#ifdef TOPPERS_force_term_osap_counter
490
491void
492force_term_osap_counter(OSAPCB *p_osapcb)
493{
494 CounterType i;
495 CNTCB *p_cntcb;
496
497 /* 状æ…
498‹ã‚’クリアする */
499 /* 現在値を0に初期化する */
500 for (i = 0U; i < tnum_counter; i++) {
501 if (cntinib_table[i].p_osapcb == p_osapcb) {
502 p_cntcb = &cntcb_table[i];
503 p_cntcb->curval = 0U;
504 p_cntcb->cstat = CS_NULL;
505 }
506 }
507}
508
509#endif /* TOPPERS_force_term_osap_counter */
Note: See TracBrowser for help on using the repository browser.