source: anotherchoice/tags/jsp-1.4.4-full-UTF8/kernel/cyclic.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 5.8 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just 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) 2006 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 *
52 * @(#) $Id: cyclic.c,v 1.11 2006/02/12 05:29:32 hiro Exp $
53 */
54
55/*
56 * 周期ハンドラ機能
57 */
58
59#include "jsp_kernel.h"
60#include "check.h"
61#include "cyclic.h"
62
63/*
64 * 周期ハンドラIDの最大値(kernel_cfg.c)
65 */
66extern const ID tmax_cycid;
67
68/*
69 * 周期ハンドラ初期化ブロックのエリア(kernel_cfg.c)
70 */
71extern const CYCINIB cycinib_table[];
72
73/*
74 * 周期ハンドラ管理ブロックのエリア(kernel_cfg.c)
75 */
76extern CYCCB cyccb_table[];
77
78/*
79 * 周期ハンドラの数
80 */
81#define TNUM_CYC ((UINT)(tmax_cycid - TMIN_CYCID + 1))
82
83/*
84 * 周期ハンドラIDから周期ハンドラ管理ブロックを取り出すためのマクロ
85 */
86#define INDEX_CYC(cycid) ((UINT)((cycid) - TMIN_CYCID))
87#define get_cyccb(cycid) (&(cyccb_table[INDEX_CYC(cycid)]))
88
89/*
90 * 引数まで定義した周期ハンドラの型
91 */
92typedef void (*CYCHDR)(VP_INT exinf);
93
94/*
95 * 周期ハンドラ機能の初期化
96 */
97#ifdef __cycini
98
99void
100cyclic_initialize()
101{
102 UINT i;
103 CYCCB *cyccb;
104
105 for (cyccb = cyccb_table, i = 0; i < TNUM_CYC; cyccb++, i++) {
106 cyccb->cycinib = &(cycinib_table[i]);
107 if ((cyccb->cycinib->cycatr & TA_STA) != 0) {
108 cyccb->cycsta = TRUE;
109 tmevtb_enqueue_cyc(cyccb,
110 (EVTTIM)(cyccb->cycinib->cycphs));
111 }
112 else {
113 cyccb->cycsta = FALSE;
114 }
115 }
116}
117
118#endif /* __cycini */
119
120/*
121 * 周期ハンドラ起動のためのタイムイベントブロックの登録
122 */
123#ifdef __cycenq
124
125void
126tmevtb_enqueue_cyc(CYCCB *cyccb, EVTTIM evttim)
127{
128 tmevtb_enqueue_evttim(&(cyccb->tmevtb), evttim,
129 (CBACK) call_cychdr, (VP) cyccb);
130 cyccb->evttim = evttim;
131}
132
133#endif /* __cycenq */
134
135/*
136 * 周期ハンドラの動作開始
137 */
138#ifdef __sta_cyc
139
140SYSCALL ER
141sta_cyc(ID cycid)
142{
143 CYCCB *cyccb;
144 ER ercd;
145
146 LOG_STA_CYC_ENTER(cycid);
147 CHECK_TSKCTX_UNL();
148 CHECK_CYCID(cycid);
149 cyccb = get_cyccb(cycid);
150
151 t_lock_cpu();
152 if (cyccb->cycsta) {
153 tmevtb_dequeue(&(cyccb->tmevtb));
154 }
155 else {
156 cyccb->cycsta = TRUE;
157 }
158 tmevtb_enqueue_cyc(cyccb, base_time + cyccb->cycinib->cyctim);
159 ercd = E_OK;
160 t_unlock_cpu();
161
162 exit:
163 LOG_STA_CYC_LEAVE(ercd);
164 return(ercd);
165}
166
167#endif /* __sta_cyc */
168
169/*
170 * 周期ハンドラの動作停止
171 */
172#ifdef __stp_cyc
173
174SYSCALL ER
175stp_cyc(ID cycid)
176{
177 CYCCB *cyccb;
178 ER ercd;
179
180 LOG_STP_CYC_ENTER(cycid);
181 CHECK_TSKCTX_UNL();
182 CHECK_CYCID(cycid);
183 cyccb = get_cyccb(cycid);
184
185 t_lock_cpu();
186 if (cyccb->cycsta) {
187 cyccb->cycsta = FALSE;
188 tmevtb_dequeue(&(cyccb->tmevtb));
189 }
190 ercd = E_OK;
191 t_unlock_cpu();
192
193 exit:
194 LOG_STP_CYC_LEAVE(ercd);
195 return(ercd);
196}
197
198#endif /* __stp_cyc */
199
200/*
201 * 周期ハンドラ起動ルーチン
202 */
203#ifdef __cyccal
204
205void
206call_cychdr(CYCCB *cyccb)
207{
208 /*
209 * 次回の起動のためのタイムイベントブロックを登録する.
210 *
211 * 同じタイムティックで周期ハンドラを再度起動すべき場合には,
212 * この関数から isig_tim に戻った後に,再度この関数が呼ばれる
213 * ことになる.
214 */
215 tmevtb_enqueue_cyc(cyccb, cyccb->evttim + cyccb->cycinib->cyctim);
216
217 /*
218 * 周期ハンドラを,CPUロック解除状æ…
219‹ã§å‘¼ã³å‡ºã™ï¼Ž
220 */
221 i_unlock_cpu();
222 LOG_CYC_ENTER(cyccb);
223 (*((CYCHDR)(cyccb->cycinib->cychdr)))(cyccb->cycinib->exinf);
224 LOG_CYC_LEAVE(cyccb);
225 i_lock_cpu();
226}
227
228#endif /* __cyccal */
Note: See TracBrowser for help on using the repository browser.