source: azure_iot_hub/trunk/asp3_dcre/kernel/time_manage.c@ 389

Last change on this file since 389 was 389, checked in by coas-nagasima, 5 years ago

ビルドが通るよう更新

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