source: asp3_wo_tecs/trunk/extension/dcre/kernel/time_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: 9.8 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: time_manage.c 463 2015-10-18 14:25:55Z ertl-hiro $
56 */
57
58/*
59 * システム時刻管理機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65#include "semaphore.h"
66#include "eventflag.h"
67#include "dataqueue.h"
68#include "time_event.h"
69#include "target_timer.h"
70
71/*
72 * トレースログマクロのデフォルト定義
73 */
74#ifndef LOG_SET_TIM_ENTER
75#define LOG_SET_TIM_ENTER(systim)
76#endif /* LOG_SET_TIM_ENTER */
77
78#ifndef LOG_SET_TIM_LEAVE
79#define LOG_SET_TIM_LEAVE(ercd)
80#endif /* LOG_SET_TIM_LEAVE */
81
82#ifndef LOG_GET_TIM_ENTER
83#define LOG_GET_TIM_ENTER(p_systim)
84#endif /* LOG_GET_TIM_ENTER */
85
86#ifndef LOG_GET_TIM_LEAVE
87#define LOG_GET_TIM_LEAVE(ercd, p_systim)
88#endif /* LOG_GET_TIM_LEAVE */
89
90#ifndef LOG_ADJ_TIM_ENTER
91#define LOG_ADJ_TIM_ENTER(adjtim)
92#endif /* LOG_ADJ_TIM_ENTER */
93
94#ifndef LOG_ADJ_TIM_LEAVE
95#define LOG_ADJ_TIM_LEAVE(ercd)
96#endif /* LOG_ADJ_TIM_LEAVE */
97
98#ifndef LOG_FCH_HRT_ENTER
99#define LOG_FCH_HRT_ENTER()
100#endif /* LOG_FCH_HRT_ENTER */
101
102#ifndef LOG_FCH_HRT_LEAVE
103#define LOG_FCH_HRT_LEAVE(hrtcnt)
104#endif /* LOG_FCH_HRT_LEAVE */
105
106/*
107 * システム時刻の設定[NGKI3563]
108 */
109#ifdef TOPPERS_set_tim
110
111ER
112set_tim(SYSTIM systim)
113{
114 ER ercd;
115
116 LOG_SET_TIM_ENTER(systim);
117 CHECK_TSKCTX_UNL(); /*[NGKI3564][NGKI3565]*/
118
119 lock_cpu();
120 update_current_evttim(); /*ï¼»ASPD1059ï¼½*/
121 systim_offset = systim - monotonic_evttim; /*ï¼»ASPD1060ï¼½*/
122 ercd = E_OK;
123 unlock_cpu();
124
125 error_exit:
126 LOG_SET_TIM_LEAVE(ercd);
127 return(ercd);
128}
129
130#endif /* TOPPERS_set_tim */
131
132/*
133 * システム時刻の参ç…
134§ï¼»NGKI2349ï¼½
135 */
136#ifdef TOPPERS_get_tim
137
138ER
139get_tim(SYSTIM *p_systim)
140{
141 ER ercd;
142
143 LOG_GET_TIM_ENTER(p_systim);
144 CHECK_TSKCTX_UNL(); /*[NGKI2350][NGKI2351]*/
145
146 lock_cpu();
147 update_current_evttim(); /*ï¼»ASPD1057ï¼½*/
148 *p_systim = systim_offset + monotonic_evttim; /*ï¼»ASPD1058ï¼½*/
149 ercd = E_OK;
150 unlock_cpu();
151
152 error_exit:
153 LOG_GET_TIM_LEAVE(ercd, p_systim);
154 return(ercd);
155}
156
157#endif /* TOPPERS_get_tim */
158
159/*
160 * システム時刻の調整[NGKI3581]
161 */
162#ifdef TOPPERS_adj_tim
163
164ER
165adj_tim(int32_t adjtim)
166{
167 EVTTIM previous_evttim;
168 ER ercd;
169
170 LOG_ADJ_TIM_ENTER(adjtim);
171 CHECK_UNL(); /*ï¼»NGKI3583ï¼½*/
172 CHECK_PAR(TMIN_ADJTIM <= adjtim && adjtim <= TMAX_ADJTIM);
173 /*ï¼»NGKI3584ï¼½*/
174 lock_cpu();
175 update_current_evttim(); /*ï¼»ASPD1051ï¼½*/
176 if (check_adjtim(adjtim)) { /*ï¼»ASPD1052ï¼½*/
177 ercd = E_OBJ;
178 }
179 else {
180 previous_evttim = current_evttim;
181 current_evttim += adjtim; /*ï¼»ASPD1053ï¼½*/
182 boundary_evttim = current_evttim - BOUNDARY_MARGIN; /*ï¼»ASPD1055ï¼½*/
183
184 if (adjtim > 0
185 && monotonic_evttim - previous_evttim < (EVTTIM) adjtim) {
186#ifdef UINT64_MAX
187 if (current_evttim < monotonic_evttim) {
188 systim_offset += 1LLU << 32;
189 }
190#endif /* UINT64_MAX */
191 monotonic_evttim = current_evttim; /*ï¼»ASPD1054ï¼½*/
192 }
193
194 set_hrt_event(); /*ï¼»ASPD1056ï¼½*/
195 ercd = E_OK;
196 }
197 unlock_cpu();
198
199 error_exit:
200 LOG_ADJ_TIM_LEAVE(ercd);
201 return(ercd);
202}
203
204#endif /* TOPPERS_adj_tim */
205
206/*
207 * 高分解能タイマの参ç…
208§ï¼»NGKI3569ï¼½
209 *
210 * 任意の状æ…
211‹ã‹ã‚‰å‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã«ã™ã‚‹ãŸã‚ã«ï¼ŒSILのå…
212¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
213‹ã®
214 * 制御機能を用いて,排他制御を実現している[NGKI3572].
215 */
216#ifdef TOPPERS_fch_hrt
217
218HRTCNT
219fch_hrt(void)
220{
221 HRTCNT hrtcnt;
222 SIL_PRE_LOC;
223
224 LOG_FCH_HRT_ENTER();
225
226 SIL_LOC_INT();
227 hrtcnt = target_hrt_get_current(); /*ï¼»NGKI3571ï¼½*/
228 SIL_UNL_INT();
229
230 LOG_FCH_HRT_LEAVE(hrtcnt);
231 return(hrtcnt);
232}
233
234#endif /* TOPPERS_fch_hrt */
235
236/*
237 * 通知方法のエラーチェック
238 */
239#ifdef TOPPERS_chknfy
240
241ER
242check_nfyinfo(const T_NFYINFO *p_nfyinfo)
243{
244 ER ercd;
245
246 if (p_nfyinfo->nfymode == TNFY_HANDLER) {
247 CHECK_PAR(FUNC_ALIGN(p_nfyinfo->nfy.handler.tmehdr));
248 CHECK_PAR(FUNC_NONNULL(p_nfyinfo->nfy.handler.tmehdr));
249 }
250 else {
251 switch (p_nfyinfo->nfymode & 0x0fU) {
252 case TNFY_SETVAR:
253 CHECK_PAR((p_nfyinfo->nfymode & ~0x0fU) == 0);
254 CHECK_PAR(INTPTR_ALIGN(p_nfyinfo->nfy.setvar.p_var));
255 CHECK_PAR(INTPTR_NONNULL(p_nfyinfo->nfy.setvar.p_var));
256 break;
257 case TNFY_INCVAR:
258 CHECK_PAR((p_nfyinfo->nfymode & ~0x0fU) == 0);
259 CHECK_PAR(INTPTR_ALIGN(p_nfyinfo->nfy.incvar.p_var));
260 CHECK_PAR(INTPTR_NONNULL(p_nfyinfo->nfy.incvar.p_var));
261 break;
262 case TNFY_ACTTSK:
263 CHECK_ID(VALID_TSKID(p_nfyinfo->nfy.acttsk.tskid));
264 break;
265 case TNFY_WUPTSK:
266 CHECK_ID(VALID_TSKID(p_nfyinfo->nfy.wuptsk.tskid));
267 break;
268 case TNFY_SIGSEM:
269 CHECK_ID(VALID_SEMID(p_nfyinfo->nfy.sigsem.semid));
270 break;
271 case TNFY_SETFLG:
272 CHECK_ID(VALID_FLGID(p_nfyinfo->nfy.setflg.flgid));
273 break;
274 case TNFY_SNDDTQ:
275 CHECK_ID(VALID_DTQID(p_nfyinfo->nfy.snddtq.dtqid));
276 break;
277 default:
278 CHECK_PAR(false);
279 break;
280 }
281 switch (p_nfyinfo->nfymode & ~0x0fU) {
282 case TENFY_SETVAR:
283 CHECK_PAR(INTPTR_ALIGN(p_nfyinfo->enfy.setvar.p_var));
284 CHECK_PAR(INTPTR_NONNULL(p_nfyinfo->enfy.setvar.p_var));
285 break;
286 case TENFY_INCVAR:
287 CHECK_PAR(INTPTR_ALIGN(p_nfyinfo->enfy.incvar.p_var));
288 CHECK_PAR(INTPTR_NONNULL(p_nfyinfo->enfy.incvar.p_var));
289 break;
290 case TENFY_ACTTSK:
291 CHECK_ID(VALID_TSKID(p_nfyinfo->enfy.acttsk.tskid));
292 break;
293 case TENFY_WUPTSK:
294 CHECK_ID(VALID_TSKID(p_nfyinfo->enfy.wuptsk.tskid));
295 break;
296 case TENFY_SIGSEM:
297 CHECK_ID(VALID_SEMID(p_nfyinfo->enfy.sigsem.semid));
298 break;
299 case TENFY_SETFLG:
300 CHECK_ID(VALID_FLGID(p_nfyinfo->enfy.setflg.flgid));
301 break;
302 case TENFY_SNDDTQ:
303 CHECK_ID(VALID_DTQID(p_nfyinfo->enfy.snddtq.dtqid));
304 break;
305 default:
306 CHECK_PAR(false);
307 break;
308 }
309 }
310 ercd = E_OK;
311
312 error_exit:
313 return(ercd);
314}
315
316#endif /* TOPPERS_chknfy */
317
318/*
319 * 通知ハンドラ
320 */
321#ifdef TOPPERS_nfyhdr
322
323void
324notify_handler(intptr_t exinf)
325{
326 T_NFYINFO *p_nfyinfo = (T_NFYINFO *) exinf;
327 ER ercd;
328
329 switch (p_nfyinfo->nfymode & 0x0fU) {
330 case TNFY_SETVAR:
331 *(p_nfyinfo->nfy.setvar.p_var) = p_nfyinfo->nfy.setvar.value;
332 ercd = E_OK;
333 break;
334 case TNFY_INCVAR:
335 *(p_nfyinfo->nfy.incvar.p_var) += 1;
336 ercd = E_OK;
337 break;
338 case TNFY_ACTTSK:
339 ercd = act_tsk(p_nfyinfo->nfy.acttsk.tskid);
340 break;
341 case TNFY_WUPTSK:
342 ercd = wup_tsk(p_nfyinfo->nfy.wuptsk.tskid);
343 break;
344 case TNFY_SIGSEM:
345 ercd = sig_sem(p_nfyinfo->nfy.sigsem.semid);
346 break;
347 case TNFY_SETFLG:
348 ercd = set_flg(p_nfyinfo->nfy.setflg.flgid,
349 p_nfyinfo->nfy.setflg.flgptn);
350 break;
351 case TNFY_SNDDTQ:
352 ercd = snd_dtq(p_nfyinfo->nfy.snddtq.dtqid,
353 p_nfyinfo->nfy.snddtq.data);
354 break;
355 default:
356 ercd = E_SYS;
357 break;
358 }
359
360 if (ercd != E_OK) {
361 switch (p_nfyinfo->nfymode & ~0x0fU) {
362 case TENFY_SETVAR:
363 *(p_nfyinfo->enfy.setvar.p_var) = (intptr_t) ercd;
364 break;
365 case TENFY_INCVAR:
366 *(p_nfyinfo->enfy.incvar.p_var) += 1;
367 break;
368 case TENFY_ACTTSK:
369 (void) act_tsk(p_nfyinfo->enfy.acttsk.tskid);
370 break;
371 case TENFY_WUPTSK:
372 (void) wup_tsk(p_nfyinfo->enfy.wuptsk.tskid);
373 break;
374 case TENFY_SIGSEM:
375 (void) sig_sem(p_nfyinfo->enfy.sigsem.semid);
376 break;
377 case TENFY_SETFLG:
378 (void) set_flg(p_nfyinfo->enfy.setflg.flgid,
379 p_nfyinfo->enfy.setflg.flgptn);
380 break;
381 case TENFY_SNDDTQ:
382 (void) snd_dtq(p_nfyinfo->enfy.snddtq.dtqid, (intptr_t) ercd);
383 break;
384 default:
385 break;
386 }
387 }
388}
389
390#endif /* TOPPERS_nfyhdr */
Note: See TracBrowser for help on using the repository browser.