source: EcnlProtoTool/trunk/asp3_dcre/kernel/time_manage.c

Last change on this file was 429, checked in by coas-nagasima, 4 years ago

ASP3, TINET, mbed を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 10.0 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-2017 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * $Id$
41 */
42
43/*
44 * システム時刻管理機能
45 */
46
47#include "kernel_impl.h"
48#include "check.h"
49#include "task.h"
50#include "semaphore.h"
51#include "eventflag.h"
52#include "dataqueue.h"
53#include "time_event.h"
54#include "target_timer.h"
55#include <sil.h>
56
57/*
58 * トレースログマクロのデフォルト定義
59 */
60#ifndef LOG_SET_TIM_ENTER
61#define LOG_SET_TIM_ENTER(systim)
62#endif /* LOG_SET_TIM_ENTER */
63
64#ifndef LOG_SET_TIM_LEAVE
65#define LOG_SET_TIM_LEAVE(ercd)
66#endif /* LOG_SET_TIM_LEAVE */
67
68#ifndef LOG_GET_TIM_ENTER
69#define LOG_GET_TIM_ENTER(p_systim)
70#endif /* LOG_GET_TIM_ENTER */
71
72#ifndef LOG_GET_TIM_LEAVE
73#define LOG_GET_TIM_LEAVE(ercd, p_systim)
74#endif /* LOG_GET_TIM_LEAVE */
75
76#ifndef LOG_ADJ_TIM_ENTER
77#define LOG_ADJ_TIM_ENTER(adjtim)
78#endif /* LOG_ADJ_TIM_ENTER */
79
80#ifndef LOG_ADJ_TIM_LEAVE
81#define LOG_ADJ_TIM_LEAVE(ercd)
82#endif /* LOG_ADJ_TIM_LEAVE */
83
84#ifndef LOG_FCH_HRT_ENTER
85#define LOG_FCH_HRT_ENTER()
86#endif /* LOG_FCH_HRT_ENTER */
87
88#ifndef LOG_FCH_HRT_LEAVE
89#define LOG_FCH_HRT_LEAVE(hrtcnt)
90#endif /* LOG_FCH_HRT_LEAVE */
91
92/*
93 * システム時刻の設定[NGKI3563]
94 */
95#ifdef TOPPERS_set_tim
96
97ER
98set_tim(SYSTIM systim)
99{
100 ER ercd;
101 bool_t lock;
102
103 LOG_SET_TIM_ENTER(systim);
104 //CHECK_TSKCTX_UNL(); /*[NGKI3564][NGKI3565]*/
105 CHECK_TSKCTX();
106 lock = sense_lock();
107
108 if (!lock)
109 lock_cpu();
110 update_current_evttim(); /*[ASPD1059]*/
111 systim_offset = systim - monotonic_evttim; /*[ASPD1060]*/
112 ercd = E_OK;
113 if (!lock)
114 unlock_cpu();
115
116 error_exit:
117 LOG_SET_TIM_LEAVE(ercd);
118 return(ercd);
119}
120
121#endif /* TOPPERS_set_tim */
122
123/*
124 * システム時刻の参照[NGKI2349]
125 */
126#ifdef TOPPERS_get_tim
127
128ER
129get_tim(SYSTIM *p_systim)
130{
131 ER ercd;
132 bool_t lock;
133
134 LOG_GET_TIM_ENTER(p_systim);
135 //CHECK_TSKCTX_UNL(); /*[NGKI2350][NGKI2351]*/
136 CHECK_TSKCTX();
137 lock = sense_lock();
138
139 if (!lock)
140 lock_cpu();
141 update_current_evttim(); /*[ASPD1057]*/
142 *p_systim = systim_offset + monotonic_evttim; /*[ASPD1058]*/
143 ercd = E_OK;
144 if (!lock)
145 unlock_cpu();
146
147 error_exit:
148 LOG_GET_TIM_LEAVE(ercd, p_systim);
149 return(ercd);
150}
151
152#endif /* TOPPERS_get_tim */
153
154/*
155 * システム時刻の調整[NGKI3581]
156 */
157#ifdef TOPPERS_adj_tim
158
159ER
160adj_tim(int32_t adjtim)
161{
162 EVTTIM previous_evttim;
163 ER ercd;
164
165 LOG_ADJ_TIM_ENTER(adjtim);
166 CHECK_UNL(); /*[NGKI3583]*/
167 CHECK_PAR(TMIN_ADJTIM <= adjtim && adjtim <= TMAX_ADJTIM);
168 /*[NGKI3584]*/
169 lock_cpu();
170 update_current_evttim(); /*[ASPD1051]*/
171 if (check_adjtim(adjtim)) { /*[ASPD1052]*/
172 ercd = E_OBJ;
173 }
174 else {
175 previous_evttim = current_evttim;
176 current_evttim += adjtim; /*[ASPD1053]*/
177 boundary_evttim = current_evttim - BOUNDARY_MARGIN; /*[ASPD1055]*/
178
179 if (adjtim > 0
180 && monotonic_evttim - previous_evttim < (EVTTIM) adjtim) {
181#ifdef UINT64_MAX
182 if (current_evttim < monotonic_evttim) {
183 systim_offset += 1LLU << 32;
184 }
185#endif /* UINT64_MAX */
186 monotonic_evttim = current_evttim; /*[ASPD1054]*/
187 }
188
189 if (!in_signal_time) {
190 set_hrt_event(); /*[ASPD1056]*/
191 }
192 ercd = E_OK;
193 }
194 unlock_cpu();
195
196 error_exit:
197 LOG_ADJ_TIM_LEAVE(ercd);
198 return(ercd);
199}
200
201#endif /* TOPPERS_adj_tim */
202
203/*
204 * 高分解能タイマの参照[NGKI3569]
205 *
206 * 任意の状態から呼び出せるようにするために,SILの全割込みロック状態の
207 * 制御機能を用いて,排他制御を実現している[NGKI3572].
208 */
209#ifdef TOPPERS_fch_hrt
210
211HRTCNT
212fch_hrt(void)
213{
214 HRTCNT hrtcnt;
215 SIL_PRE_LOC;
216
217 LOG_FCH_HRT_ENTER();
218
219 SIL_LOC_INT();
220 hrtcnt = target_hrt_get_current(); /*[NGKI3571]*/
221 SIL_UNL_INT();
222
223 LOG_FCH_HRT_LEAVE(hrtcnt);
224 return(hrtcnt);
225}
226
227#endif /* TOPPERS_fch_hrt */
228
229/*
230 * 通知方法のエラーチェック
231 */
232#ifdef TOPPERS_chknfy
233
234ER
235check_nfyinfo(const T_NFYINFO *p_nfyinfo)
236{
237 ER ercd;
238
239 if (p_nfyinfo->nfymode == TNFY_HANDLER) {
240 CHECK_PAR(FUNC_ALIGN(p_nfyinfo->nfy.handler.tmehdr));
241 CHECK_PAR(FUNC_NONNULL(p_nfyinfo->nfy.handler.tmehdr));
242 }
243 else {
244 switch (p_nfyinfo->nfymode & 0x0fU) {
245 case TNFY_SETVAR:
246 CHECK_PAR((p_nfyinfo->nfymode & ~0x0fU) == 0);
247 CHECK_PAR(INTPTR_ALIGN(p_nfyinfo->nfy.setvar.p_var));
248 CHECK_PAR(INTPTR_NONNULL(p_nfyinfo->nfy.setvar.p_var));
249 break;
250 case TNFY_INCVAR:
251 CHECK_PAR((p_nfyinfo->nfymode & ~0x0fU) == 0);
252 CHECK_PAR(INTPTR_ALIGN(p_nfyinfo->nfy.incvar.p_var));
253 CHECK_PAR(INTPTR_NONNULL(p_nfyinfo->nfy.incvar.p_var));
254 break;
255 case TNFY_ACTTSK:
256 CHECK_ID(VALID_TSKID(p_nfyinfo->nfy.acttsk.tskid));
257 break;
258 case TNFY_WUPTSK:
259 CHECK_ID(VALID_TSKID(p_nfyinfo->nfy.wuptsk.tskid));
260 break;
261 case TNFY_SIGSEM:
262 CHECK_ID(VALID_SEMID(p_nfyinfo->nfy.sigsem.semid));
263 break;
264 case TNFY_SETFLG:
265 CHECK_ID(VALID_FLGID(p_nfyinfo->nfy.setflg.flgid));
266 break;
267 case TNFY_SNDDTQ:
268 CHECK_ID(VALID_DTQID(p_nfyinfo->nfy.snddtq.dtqid));
269 break;
270 default:
271 CHECK_PAR(false);
272 break;
273 }
274 switch (p_nfyinfo->nfymode & ~0x0fU) {
275 case 0:
276 break;
277 case TENFY_SETVAR:
278 CHECK_PAR(INTPTR_ALIGN(p_nfyinfo->enfy.setvar.p_var));
279 CHECK_PAR(INTPTR_NONNULL(p_nfyinfo->enfy.setvar.p_var));
280 break;
281 case TENFY_INCVAR:
282 CHECK_PAR(INTPTR_ALIGN(p_nfyinfo->enfy.incvar.p_var));
283 CHECK_PAR(INTPTR_NONNULL(p_nfyinfo->enfy.incvar.p_var));
284 break;
285 case TENFY_ACTTSK:
286 CHECK_ID(VALID_TSKID(p_nfyinfo->enfy.acttsk.tskid));
287 break;
288 case TENFY_WUPTSK:
289 CHECK_ID(VALID_TSKID(p_nfyinfo->enfy.wuptsk.tskid));
290 break;
291 case TENFY_SIGSEM:
292 CHECK_ID(VALID_SEMID(p_nfyinfo->enfy.sigsem.semid));
293 break;
294 case TENFY_SETFLG:
295 CHECK_ID(VALID_FLGID(p_nfyinfo->enfy.setflg.flgid));
296 break;
297 case TENFY_SNDDTQ:
298 CHECK_ID(VALID_DTQID(p_nfyinfo->enfy.snddtq.dtqid));
299 break;
300 default:
301 CHECK_PAR(false);
302 break;
303 }
304 }
305 ercd = E_OK;
306
307 error_exit:
308 return(ercd);
309}
310
311#endif /* TOPPERS_chknfy */
312
313/*
314 * 通知ハンドラ
315 */
316#ifdef TOPPERS_nfyhdr
317
318void
319notify_handler(intptr_t exinf)
320{
321 T_NFYINFO *p_nfyinfo = (T_NFYINFO *) exinf;
322 ER ercd;
323
324 switch (p_nfyinfo->nfymode & 0x0fU) {
325 case TNFY_SETVAR:
326 *(p_nfyinfo->nfy.setvar.p_var) = p_nfyinfo->nfy.setvar.value;
327 ercd = E_OK;
328 break;
329 case TNFY_INCVAR:
330 (void) loc_cpu();
331 *(p_nfyinfo->nfy.incvar.p_var) += 1;
332 (void) unl_cpu();
333 ercd = E_OK;
334 break;
335 case TNFY_ACTTSK:
336 ercd = act_tsk(p_nfyinfo->nfy.acttsk.tskid);
337 break;
338 case TNFY_WUPTSK:
339 ercd = wup_tsk(p_nfyinfo->nfy.wuptsk.tskid);
340 break;
341 case TNFY_SIGSEM:
342 ercd = sig_sem(p_nfyinfo->nfy.sigsem.semid);
343 break;
344 case TNFY_SETFLG:
345 ercd = set_flg(p_nfyinfo->nfy.setflg.flgid,
346 p_nfyinfo->nfy.setflg.flgptn);
347 break;
348 case TNFY_SNDDTQ:
349 ercd = psnd_dtq(p_nfyinfo->nfy.snddtq.dtqid,
350 p_nfyinfo->nfy.snddtq.data);
351 break;
352 default:
353 ercd = E_SYS;
354 break;
355 }
356
357 if (ercd != E_OK) {
358 switch (p_nfyinfo->nfymode & ~0x0fU) {
359 case TENFY_SETVAR:
360 *(p_nfyinfo->enfy.setvar.p_var) = (intptr_t) ercd;
361 break;
362 case TENFY_INCVAR:
363 (void) loc_cpu();
364 *(p_nfyinfo->enfy.incvar.p_var) += 1;
365 (void) unl_cpu();
366 break;
367 case TENFY_ACTTSK:
368 (void) act_tsk(p_nfyinfo->enfy.acttsk.tskid);
369 break;
370 case TENFY_WUPTSK:
371 (void) wup_tsk(p_nfyinfo->enfy.wuptsk.tskid);
372 break;
373 case TENFY_SIGSEM:
374 (void) sig_sem(p_nfyinfo->enfy.sigsem.semid);
375 break;
376 case TENFY_SETFLG:
377 (void) set_flg(p_nfyinfo->enfy.setflg.flgid,
378 p_nfyinfo->enfy.setflg.flgptn);
379 break;
380 case TENFY_SNDDTQ:
381 (void) psnd_dtq(p_nfyinfo->enfy.snddtq.dtqid, (intptr_t) ercd);
382 break;
383 default:
384 break;
385 }
386 }
387}
388
389#endif /* TOPPERS_nfyhdr */
Note: See TracBrowser for help on using the repository browser.