source: atk2-sc3-1.4.0-ntisr/kernel/counter_manage.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対応を追加

File size: 12.3 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_manage.c 425 2015-12-07 08:06:19Z witz-itoyo $
74 */
75
76/*
77 * カウンタ管理モジュール
78 */
79
80#include "kernel_impl.h"
81#include "check.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)
97#endif /* LOG_GETCNT_ENTER */
98
99#ifndef LOG_GETCNT_LEAVE
100#define LOG_GETCNT_LEAVE(ercd, p_val)
101#endif /* LOG_GETCNT_LEAVE */
102
103#ifndef LOG_GETEPS_ENTER
104#define LOG_GETEPS_ENTER(cntid, p_val)
105#endif /* LOG_GETEPS_ENTER */
106
107#ifndef LOG_GETEPS_LEAVE
108#define LOG_GETEPS_LEAVE(ercd, p_val, p_eval)
109#endif /* LOG_GETEPS_LEAVE */
110
111/*
112 * カウンタのインクリメント
113 */
114#ifdef TOPPERS_IncrementCounter
115
116StatusType
117IncrementCounter(CounterType CounterID)
118{
119 StatusType ercd = E_OK;
120 CNTCB *p_cntcb;
121 OSAPCB *p_osapcb;
122
123 CHECK_DISABLEDINT();
124 CHECK_CALLEVEL(CALLEVEL_INCREMENTCOUNTER);
125 CHECK_ID(CounterID < tnum_counter);
126 CHECK_ID(CounterID >= tnum_hardcounter);
127
128 p_cntcb = get_cntcb(CounterID);
129 CHECK_RIGHT(p_cntcb->p_cntinib->acsbtmp);
130
131 p_osapcb = p_cntcb->p_cntinib->p_osapcb;
132 x_nested_lock_os_int();
133
134 /* カウンタ所属のOSAPの状æ…
135‹ã‚’チェック */
136 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
137 (p_osapcb == p_runosap));
138
139 /*
140 * カウンタのインクリメント
141 * エラーの場合はincr_counter_processでエラーフック呼び出しているので,
142 * ここでは,エラーフックを呼び出さない
143 */
144 ercd = incr_counter_process(p_cntcb, CounterID);
145
146 d_exit_no_errorhook:
147 x_nested_unlock_os_int();
148 exit_no_errorhook:
149 return(ercd);
150
151#ifdef CFG_USE_ERRORHOOK
152 exit_errorhook:
153 x_nested_lock_os_int();
154 d_exit_errorhook:
155#ifdef CFG_USE_PARAMETERACCESS
156 _errorhook_par1.cntid = CounterID;
157#endif /* CFG_USE_PARAMETERACCESS */
158 call_errorhook(ercd, OSServiceId_IncrementCounter);
159 goto d_exit_no_errorhook;
160#endif /* CFG_USE_ERRORHOOK */
161}
162
163#endif /* TOPPERS_IncrementCounter */
164
165/*
166 * カウンタ値の参ç…
167§
168 */
169#ifdef TOPPERS_GetCounterValue
170
171StatusType
172GetCounterValue(CounterType CounterID, TickRefType Value)
173{
174 StatusType ercd = E_OK;
175 CNTCB *p_cntcb;
176 TickType curval;
177 OSAPCB *p_osapcb;
178
179 LOG_GETCNT_ENTER(CounterID);
180 CHECK_DISABLEDINT();
181 CHECK_CALLEVEL(CALLEVEL_GETCOUNTERVALUE);
182 CHECK_ID(CounterID < tnum_counter);
183 CHECK_PARAM_POINTER(Value);
184 CHECK_MEM_WRITE(Value, TickType);
185 p_cntcb = get_cntcb(CounterID);
186 CHECK_RIGHT(p_cntcb->p_cntinib->acsbtmp);
187
188 /*
189 * 内
190部処理のため,コンフィギュレーション設定値の2倍+1までカウント
191 * アップするのでカウンタ値が設定値よりも大きい場合は設定値を減算する
192 *
193 * *Value を直接操作してもよいが,局所変数がレジスタに割当てられること
194 * による速度を期待
195している
196 */
197 p_osapcb = p_cntcb->p_cntinib->p_osapcb;
198 x_nested_lock_os_int();
199
200 /* カウンタ所属のOSAPの状æ…
201‹ã‚’チェック */
202 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
203 (p_osapcb == p_runosap));
204
205 curval = get_curval(p_cntcb, CounterID);
206 x_nested_unlock_os_int();
207
208 if (curval > p_cntcb->p_cntinib->maxval) {
209 curval -= (p_cntcb->p_cntinib->maxval + 1U);
210 }
211 *Value = curval;
212
213 exit_no_errorhook:
214 LOG_GETCNT_LEAVE(ercd, Value);
215 return(ercd);
216
217#ifdef CFG_USE_ERRORHOOK
218 exit_errorhook:
219 x_nested_lock_os_int();
220 d_exit_errorhook:
221#ifdef CFG_USE_PARAMETERACCESS
222 _errorhook_par1.cntid = CounterID;
223 _errorhook_par2.p_val = Value;
224#endif /* CFG_USE_PARAMETERACCESS */
225 call_errorhook(ercd, OSServiceId_GetCounterValue);
226#endif /* CFG_USE_ERRORHOOK */
227 d_exit_no_errorhook:
228 x_nested_unlock_os_int();
229 goto exit_no_errorhook;
230}
231
232#endif /* TOPPERS_GetCounterValue */
233
234/*
235 * 経過カウンタ値の参ç…
236§
237 */
238#ifdef TOPPERS_GetElapsedValue
239
240StatusType
241GetElapsedValue(CounterType CounterID, TickRefType Value, TickRefType ElapsedValue)
242{
243 StatusType ercd = E_OK;
244 CNTCB *p_cntcb;
245 TickType curval;
246 OSAPCB *p_osapcb;
247
248 LOG_GETEPS_ENTER(CounterID, Value);
249 CHECK_DISABLEDINT();
250 CHECK_CALLEVEL(CALLEVEL_GETELAPSEDVALUE);
251 CHECK_ID(CounterID < tnum_counter);
252 CHECK_PARAM_POINTER(Value);
253 CHECK_PARAM_POINTER(ElapsedValue);
254 CHECK_MEM_RW(Value, TickType);
255 CHECK_MEM_WRITE(ElapsedValue, TickType);
256 p_cntcb = get_cntcb(CounterID);
257 CHECK_RIGHT(p_cntcb->p_cntinib->acsbtmp);
258
259 CHECK_VALUE(*Value <= p_cntcb->p_cntinib->maxval);
260
261 /*
262 * 内
263部処理のため,コンフィギュレーション設定値の2倍+1までカウント
264 * アップするのでカウンタ値が設定値よりも大きい場合は設定値を減算する
265 */
266 p_osapcb = p_cntcb->p_cntinib->p_osapcb;
267 x_nested_lock_os_int();
268
269 /* カウンタ所属のOSAPの状æ…
270‹ã‚’チェック */
271 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
272 (p_osapcb == p_runosap));
273
274 curval = get_curval(p_cntcb, CounterID);
275 x_nested_unlock_os_int();
276
277 if (curval > p_cntcb->p_cntinib->maxval) {
278 curval -= (p_cntcb->p_cntinib->maxval + 1U);
279 }
280 *ElapsedValue = diff_tick(curval, *Value, p_cntcb->p_cntinib->maxval);
281 *Value = curval;
282
283 exit_no_errorhook:
284 LOG_GETEPS_LEAVE(ercd, Value, ElapsedValue);
285 return(ercd);
286
287#ifdef CFG_USE_ERRORHOOK
288 exit_errorhook:
289 x_nested_lock_os_int();
290 d_exit_errorhook:
291#ifdef CFG_USE_PARAMETERACCESS
292 _errorhook_par1.cntid = CounterID;
293 _errorhook_par2.p_val = Value;
294 _errorhook_par3.p_eval = ElapsedValue;
295#endif /* CFG_USE_PARAMETERACCESS */
296 call_errorhook(ercd, OSServiceId_GetElapsedValue);
297#endif /* CFG_USE_ERRORHOOK */
298 d_exit_no_errorhook:
299 x_nested_unlock_os_int();
300 goto exit_no_errorhook;
301}
302
303#endif /* TOPPERS_GetElapsedValue */
304
305/*
306 * ハードウェアカウンタ満了処理
307 *
308 * 割込みルーチンより実行される
309 */
310#ifdef TOPPERS_notify_hardware_counter
311
312void
313notify_hardware_counter(CounterType cntid)
314{
315 CNTCB *p_cntcb;
316
317 p_cntcb = get_cntcb(cntid);
318
319 /* カウンタ満了処理中はOS割込みを禁止 */
320 x_nested_lock_os_int();
321
322 /*
323 * ハードウェアカウンタに対応するC2ISRが起動した際に,
324 * 割込み要求のクリア処理を実行する
325 */
326 (hwcntinib_table[cntid].intclear)();
327
328 expire_process(p_cntcb, cntid);
329
330 x_nested_unlock_os_int();
331}
332
333#endif /* TOPPERS_notify_hardware_counter */
334
335/*
336 * カウンタのインクリメント
337 *
338 * 条件:割込み禁止状æ…
339‹ã§å‘¼ã°ã‚Œã‚‹
340 */
341#ifdef TOPPERS_incr_counter_process
342
343StatusType
344incr_counter_process(CNTCB *p_cntcb, CounterType CounterID)
345{
346 StatusType ercd = E_OK;
347 TickType newval;
348
349 LOG_INCCNT_ENTER(CounterID);
350
351 /*
352 * カウンタが操作中(IncrementCounterのネスト)の場合エラー
353 * ※独自仕様
354 */
355 D_CHECK_STATE(p_cntcb->cstat == CS_NULL);
356
357 p_cntcb->cstat = CS_DOING;
358
359 newval = add_tick(p_cntcb->curval, 1U, p_cntcb->p_cntinib->maxval2);
360
361 p_cntcb->curval = newval;
362
363 if (p_runisr == NULL) {
364 p_cntcb->p_prevcntcb = p_runtsk->p_lastcntcb;
365 p_runtsk->p_lastcntcb = p_cntcb;
366 }
367 else {
368 p_cntcb->p_prevcntcb = p_runisr->p_lastcntcb;
369 p_runisr->p_lastcntcb = p_cntcb->p_prevcntcb;
370 }
371
372 expire_process(p_cntcb, CounterID);
373
374 if (p_runisr == NULL) {
375 p_runtsk->p_lastcntcb = p_cntcb->p_prevcntcb;
376 }
377 else {
378 p_runisr->p_lastcntcb = p_cntcb->p_prevcntcb;
379 }
380
381 p_cntcb->cstat = CS_NULL;
382
383 d_exit_no_errorhook:
384 LOG_INCCNT_LEAVE(ercd);
385 return(ercd);
386
387#ifdef CFG_USE_ERRORHOOK
388 d_exit_errorhook:
389#ifdef CFG_USE_PARAMETERACCESS
390 _errorhook_par1.cntid = CounterID;
391#endif /* CFG_USE_PARAMETERACCESS */
392 call_errorhook(ercd, OSServiceId_IncrementCounter);
393 goto d_exit_no_errorhook;
394#endif /* CFG_USE_ERRORHOOK */
395}
396
397#endif /* TOPPERS_incr_counter_process */
398
399/*
400 * アラーム満了によるカウンタのインクリメント
401 *
402 * 条件:割込み禁止状æ…
403‹ã§å‘¼ã°ã‚Œã‚‹
404 */
405#ifdef TOPPERS_incr_counter_action
406
407StatusType
408incr_counter_action(OSAPCB *p_expire_osapcb, CounterType CounterID)
409{
410 StatusType ercd = E_OK;
411 CNTCB *p_cntcb;
412 OSAPCB *p_osapcb;
413
414 p_cntcb = get_cntcb(CounterID);
415 p_osapcb = p_cntcb->p_cntinib->p_osapcb;
416 /* 満了点所属のOSAP及びインクリメントカウンタ所属のOSAPの状æ…
417‹ã‚’チェック */
418 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) || (p_expire_osapcb == p_osapcb));
419
420 ercd = incr_counter_process(p_cntcb, CounterID);
421
422 d_exit_no_errorhook:
423 return(ercd);
424
425#ifdef CFG_USE_ERRORHOOK
426 d_exit_errorhook:
427#ifdef CFG_USE_PARAMETERACCESS
428 _errorhook_par1.cntid = CounterID;
429#endif /* CFG_USE_PARAMETERACCESS */
430 call_errorhook(ercd, OSServiceId_IncrementCounter);
431 goto d_exit_no_errorhook;
432#endif /* CFG_USE_ERRORHOOK */
433}
434
435#endif /* TOPPERS_incr_counter_action */
Note: See TracBrowser for help on using the repository browser.