source: asp3_wo_tecs/trunk/kernel/cyclic.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: 6.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: cyclic.c 451 2015-08-14 15:29:07Z ertl-hiro $
56 */
57
58/*
59 * 周期通知機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "cyclic.h"
65
66/*
67 * トレースログマクロのデフォルト定義
68 */
69#ifndef LOG_CYC_ENTER
70#define LOG_CYC_ENTER(p_cyccb)
71#endif /* LOG_CYC_ENTER */
72
73#ifndef LOG_CYC_LEAVE
74#define LOG_CYC_LEAVE(p_cyccb)
75#endif /* LOG_CYC_LEAVE */
76
77#ifndef LOG_STA_CYC_ENTER
78#define LOG_STA_CYC_ENTER(cycid)
79#endif /* LOG_STA_CYC_ENTER */
80
81#ifndef LOG_STA_CYC_LEAVE
82#define LOG_STA_CYC_LEAVE(ercd)
83#endif /* LOG_STA_CYC_LEAVE */
84
85#ifndef LOG_STP_CYC_ENTER
86#define LOG_STP_CYC_ENTER(cycid)
87#endif /* LOG_STP_CYC_ENTER */
88
89#ifndef LOG_STP_CYC_LEAVE
90#define LOG_STP_CYC_LEAVE(ercd)
91#endif /* LOG_STP_CYC_LEAVE */
92
93#ifndef LOG_REF_CYC_ENTER
94#define LOG_REF_CYC_ENTER(cycid, pk_rcyc)
95#endif /* LOG_REF_CYC_ENTER */
96
97#ifndef LOG_REF_CYC_LEAVE
98#define LOG_REF_CYC_LEAVE(ercd, pk_rcyc)
99#endif /* LOG_REF_CYC_LEAVE */
100
101/*
102 * 周期通知の数
103 */
104#define tnum_cyc ((uint_t)(tmax_cycid - TMIN_CYCID + 1))
105
106/*
107 * 周期通知IDから周期通知管理ブロックを取り出すためのマクロ
108 */
109#define INDEX_CYC(cycid) ((uint_t)((cycid) - TMIN_CYCID))
110#define get_cyccb(cycid) (&(cyccb_table[INDEX_CYC(cycid)]))
111
112/*
113 * 周期通知機能の初期化
114 */
115#ifdef TOPPERS_cycini
116
117void
118initialize_cyclic(void)
119{
120 uint_t i;
121 CYCCB *p_cyccb;
122
123 for (i = 0; i < tnum_cyc; i++) {
124 p_cyccb = &(cyccb_table[i]);
125 p_cyccb->p_cycinib = &(cycinib_table[i]);
126 p_cyccb->tmevtb.callback = (CBACK) call_cyclic;
127 p_cyccb->tmevtb.arg = (void *) p_cyccb;
128 if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) {
129 /*
130 * 初回の起動のためのタイムイベントを登録する[ASPD1035]
131 * [ASPD1062].
132 */
133 p_cyccb->cycsta = true;
134 p_cyccb->tmevtb.evttim = (EVTTIM)(p_cyccb->p_cycinib->cycphs);
135 tmevtb_register(&(p_cyccb->tmevtb));
136 }
137 else {
138 p_cyccb->cycsta = false;
139 }
140 }
141}
142
143#endif /* TOPPERS_cycini */
144
145/*
146 * 周期通知の動作開始
147 */
148#ifdef TOPPERS_sta_cyc
149
150ER
151sta_cyc(ID cycid)
152{
153 CYCCB *p_cyccb;
154 ER ercd;
155
156 LOG_STA_CYC_ENTER(cycid);
157 CHECK_TSKCTX_UNL();
158 CHECK_ID(VALID_CYCID(cycid));
159 p_cyccb = get_cyccb(cycid);
160
161 lock_cpu();
162 if (p_cyccb->cycsta) {
163 tmevtb_dequeue(&(p_cyccb->tmevtb));
164 }
165 else {
166 p_cyccb->cycsta = true;
167 }
168 /*
169 * 初回の起動のためのタイムイベントを登録する[ASPD1036].
170 */
171 tmevtb_enqueue(&(p_cyccb->tmevtb), p_cyccb->p_cycinib->cycphs);
172 ercd = E_OK;
173 unlock_cpu();
174
175 error_exit:
176 LOG_STA_CYC_LEAVE(ercd);
177 return(ercd);
178}
179
180#endif /* TOPPERS_sta_cyc */
181
182/*
183 * 周期通知の動作停止
184 */
185#ifdef TOPPERS_stp_cyc
186
187ER
188stp_cyc(ID cycid)
189{
190 CYCCB *p_cyccb;
191 ER ercd;
192
193 LOG_STP_CYC_ENTER(cycid);
194 CHECK_TSKCTX_UNL();
195 CHECK_ID(VALID_CYCID(cycid));
196 p_cyccb = get_cyccb(cycid);
197
198 lock_cpu();
199 if (p_cyccb->cycsta) {
200 p_cyccb->cycsta = false;
201 tmevtb_dequeue(&(p_cyccb->tmevtb));
202 }
203 ercd = E_OK;
204 unlock_cpu();
205
206 error_exit:
207 LOG_STP_CYC_LEAVE(ercd);
208 return(ercd);
209}
210
211#endif /* TOPPERS_stp_cyc */
212
213/*
214 * 周期通知の状æ…
215‹å‚ç…
216§
217 */
218#ifdef TOPPERS_ref_cyc
219
220ER
221ref_cyc(ID cycid, T_RCYC *pk_rcyc)
222{
223 CYCCB *p_cyccb;
224 ER ercd;
225
226 LOG_REF_CYC_ENTER(cycid, pk_rcyc);
227 CHECK_TSKCTX_UNL();
228 CHECK_ID(VALID_CYCID(cycid));
229 p_cyccb = get_cyccb(cycid);
230
231 lock_cpu();
232 if (p_cyccb->cycsta) {
233 pk_rcyc->cycstat = TCYC_STA;
234 pk_rcyc->lefttim = tmevt_lefttim(&(p_cyccb->tmevtb));
235 }
236 else {
237 pk_rcyc->cycstat = TCYC_STP;
238 }
239 ercd = E_OK;
240 unlock_cpu();
241
242 error_exit:
243 LOG_REF_CYC_LEAVE(ercd, pk_rcyc);
244 return(ercd);
245}
246
247#endif /* TOPPERS_ref_cyc */
248
249/*
250 * 周期通知起動ルーチン
251 */
252#ifdef TOPPERS_cyccal
253
254void
255call_cyclic(CYCCB *p_cyccb)
256{
257 /*
258 * 次回の起動のためのタイムイベントを登録する[ASPD1037].
259 */
260 p_cyccb->tmevtb.evttim += p_cyccb->p_cycinib->cyctim; /*ï¼»ASPD1038ï¼½*/
261 tmevtb_register(&(p_cyccb->tmevtb));
262
263 /*
264 * 通知ハンドラを,CPUロック解除状æ…
265‹ã§å‘¼ã³å‡ºã™ï¼Ž
266 */
267 unlock_cpu();
268
269 LOG_CYC_ENTER(p_cyccb);
270 (*(p_cyccb->p_cycinib->nfyhdr))(p_cyccb->p_cycinib->exinf);
271 LOG_CYC_LEAVE(p_cyccb);
272
273 if (!sense_lock()) {
274 lock_cpu();
275 }
276}
277
278#endif /* TOPPERS_cyccal */
Note: See TracBrowser for help on using the repository browser.