source: atk2-sc3_fl850f1l/arch/v850_gcc/taua_timer.c@ 117

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

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 6.2 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2012-2014 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2012-2014 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2012-2013 by Spansion LLC, USA
10 * Copyright (C) 2012-2013 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2012-2014 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2012-2014 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2012-2014 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2012-2014 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2012-2014 by Witz Corporation, JAPAN
16 *
17 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
18 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
19 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
20 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
21 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22 * スコード中に含まれていること.
23 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
24 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
25 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
29 * と.
30 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
33 * 報告すること.
34 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
35 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
36 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
37 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
38 * 免責すること.
39 *
40 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
41 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
42 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
43 * 用する者に対して,AUTOSARパートナーになることを求めている.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
47 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
48 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
49 * の責任を負わない.
50 *
51 * $Id: taua_timer.c 117 2014-12-10 03:58:03Z t_ishikawa $
52 */
53
54/*
55 * タイマドライバ(TAUA0 Timer)
56 */
57
58#include "kernel_impl.h"
59#include "target_timer.h"
60#include "taua_timer.h"
61#include "Os_Lcfg.h"
62
63/*
64 * 現在のシステム時刻(単位: ミリ秒)
65 *
66 * 厳密には,前のタイムティックのシステム時刻
67 */
68SystemTimeMsType current_time;
69
70/*
71 * 内部関数プロトタイプ宣言
72 */
73ISR(target_timer_hdr);
74
75/*
76 * マイクロ秒単位での時刻を取得
77 */
78SystemTimeUsType
79get_tim_utime(void)
80{
81 SystemTimeUsType utime;
82 SystemTimeMsType mtime;
83 TickType clock1, clock2;
84 boolean ireq;
85 SIL_PRE_LOC;
86
87 SIL_LOC_INT();
88 mtime = current_time;
89 clock1 = target_timer_get_current();
90 ireq = target_timer_probe_int();
91 clock2 = target_timer_get_current();
92 SIL_UNL_INT();
93 utime = ((SystemTimeUsType) mtime) * 1000U;
94
95 if ((ireq != FALSE) && (clock2 >= clock1)) {
96 /*
97 * 割込みが入っており,clock2の方がclock1の方が大きいまたは等しい場合は,
98 * current_time が割込みにより更新されていないかつ,clock1はオーバフロー後
99 * の値であるため,utimeに1m追加する.clock1の読み込み,割込みのチェック,
100 * clock2の読み込みが1μs以下で実行可能なプロセッサも存在するため,等号付き
101 * で比較している.
102 */
103 utime += 1000U;
104 }
105 utime += TO_USEC(clock1);
106
107 return(utime);
108}
109
110SystemTime100NsType
111get_tim_100ntime(void)
112{
113 SystemTime100NsType ntime;
114 SystemTimeMsType mtime;
115 TickType clock1, clock2;
116 boolean ireq;
117 SIL_PRE_LOC;
118
119 SIL_LOC_INT();
120 mtime = current_time;
121 clock1 = target_timer_get_current();
122 ireq = target_timer_probe_int();
123 clock2 = target_timer_get_current();
124 SIL_UNL_INT();
125 ntime = ((SystemTime100NsType) mtime) * 10000U;
126
127 if ((ireq != FALSE) && (clock2 >= clock1)) {
128 /*
129 * 割込みが入っており,clock2の方がclock1の方が大きいまたは等しい場合は,
130 * current_time が割込みにより更新されていないかつ,clock1はオーバフロー後
131 * の値であるため,utimeに1m追加する.clock1の読み込み,割込みのチェック,
132 * clock2の読み込みが1μs以下で実行可能なプロセッサも存在するため,等号付き
133 * で比較している.
134 */
135 ntime += 10000U;
136 }
137 ntime += TO_100NSEC(clock1);
138
139 return(ntime);
140}
141
142/*
143 * タイマの起動処理
144 *
145 * タイマはタイマ0を使用
146 */
147void
148target_timer_initialize(void)
149{
150 uint16 wk;
151 current_time = 0U;
152
153 wk = sil_reh_mem((void *) TAUA0TPS);
154 wk &= ~MCU_TAUA0_MASK_CK0;
155 wk |= MCU_TAUA0_CK0;
156 sil_wrh_mem((void *) TAUA0TPS, wk); /* Set prescaler value for CK0 */
157
158 sil_wrh_mem((void *) TAUA0CMOR(0), MCU_TAUA00_CMOR); /* インターバルタイマとして使用 */
159 sil_wrb_mem((void *) TAUA0CMUR(0), MCU_TAUA00_CMUR);
160
161 sil_wrh_mem((void *) TAUA0CDR(0), TIMER_CLOCK); /* 1ms */
162
163 wk = sil_reh_mem((void *) TAUA0TE);
164 wk |= 0x0001; /* TAUT0チャンネル0許可 */
165 sil_wrh_mem((void *) TAUA0TS, wk); /* カウンタ動作を許可 */
166}
167
168/*
169 * タイマの停止処理
170 */
171void
172target_timer_terminate(void)
173{
174 uint16 wk;
175
176 /* タイマ停止 */
177 wk = sil_reh_mem((void *) TAUA0TE);
178 wk &= ~0x0001; /* チャンネル0停止 */
179 sil_wrh_mem((void *) TAUA0TT, wk); /* カウンタ動作停止 */
180
181 /* 割込みの禁止とクリア */
182 x_disable_int(TAUA0_IRQ);
183 x_clear_int(TAUA0_IRQ);
184}
185
186/*
187 * target_timer.arxmlを使用しない場合の対処
188 */
189#ifndef SysTimerCnt
190#define SysTimerCnt UINT_C(0)
191#endif /* SysTimerCnt */
192
193/*
194 * タイマ割込みハンドラ
195 */
196ISR(target_timer_hdr)
197{
198 StatusType ercd;
199
200 /* current_timeを更新する */
201 current_time++;
202
203 /*
204 * カウンタ加算通知処理実行
205 */
206 ercd = IncrementCounter(SysTimerCnt);
207 /* エラーリターンの場合はシャットダウン */
208 if (ercd != E_OK) {
209 ShutdownOS(ercd);
210 }
211}
Note: See TracBrowser for help on using the repository browser.