source: asp3_gr_sakura/trunk/kernel/overrun.c

Last change on this file was 318, checked in by coas-nagasima, 7 years ago

プロパティの文字コードにUTF-8を追加、キーワードを削除

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc; charset=UTF-8
File size: 7.6 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) 2005-2015 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36 * の責任を負わない.
37 *
38 * $Id$
39 */
40
41/*
42 * オーバランハンドラ機能
43 */
44
45#include "kernel_impl.h"
46#include "check.h"
47#include "task.h"
48#include "overrun.h"
49
50#ifdef TOPPERS_SUPPORT_OVRHDR
51#include "target_timer.h"
52
53/*
54 * トレースログマクロのデフォルト定義
55 */
56#ifndef LOG_OVR_ENTER
57#define LOG_OVR_ENTER(p_runtsk)
58#endif /* LOG_OVR_ENTER */
59
60#ifndef LOG_OVR_LEAVE
61#define LOG_OVR_LEAVE(p_runtsk)
62#endif /* LOG_OVR_LEAVE */
63
64#ifndef LOG_STA_OVR_ENTER
65#define LOG_STA_OVR_ENTER(tskid, ovrtim)
66#endif /* LOG_STA_OVR_ENTER */
67
68#ifndef LOG_STA_OVR_LEAVE
69#define LOG_STA_OVR_LEAVE(ercd)
70#endif /* LOG_STA_OVR_LEAVE */
71
72#ifndef LOG_STP_OVR_ENTER
73#define LOG_STP_OVR_ENTER(tskid)
74#endif /* LOG_STP_OVR_ENTER */
75
76#ifndef LOG_STP_OVR_LEAVE
77#define LOG_STP_OVR_LEAVE(ercd)
78#endif /* LOG_STP_OVR_LEAVE */
79
80#ifndef LOG_REF_OVR_ENTER
81#define LOG_REF_OVR_ENTER(tskid, pk_rovr)
82#endif /* LOG_REF_OVR_ENTER */
83
84#ifndef LOG_REF_OVR_LEAVE
85#define LOG_REF_OVR_LEAVE(ercd, pk_rovr)
86#endif /* LOG_REF_OVR_LEAVE */
87
88#ifdef TOPPERS_ovrini
89
90/*
91 * オーバランタイマが動作中かを示すフラグ
92 */
93bool_t ovrtimer_flag;
94
95/*
96 * オーバランハンドラ機能の初期化
97 */
98void
99initialize_overrun(void)
100{
101 ovrtimer_flag = false;
102}
103
104#endif /* TOPPERS_ovrini */
105
106/*
107 * オーバランハンドラ用タイマの動作開始
108 */
109#ifdef TOPPERS_ovrsta
110#ifndef OMIT_OVRTIMER_START
111
112void
113ovrtimer_start(void)
114{
115 if (p_runtsk->staovr) {
116 target_ovrtimer_start(p_runtsk->leftotm);
117 ovrtimer_flag = true;
118 }
119}
120
121#endif /* OMIT_OVRTIMER_START */
122#endif /* TOPPERS_ovrsta */
123
124/*
125 * オーバランハンドラ用タイマの停止
126 */
127#ifdef TOPPERS_ovrstp
128#ifndef OMIT_OVRTIMER_STOP
129
130void
131ovrtimer_stop(uint_t int_num)
132{
133 if (ovrtimer_flag) {
134 assert(p_runtsk != NULL && p_runtsk->staovr);
135 p_runtsk->leftotm = target_ovrtimer_stop(int_num);
136 ovrtimer_flag = false;
137 }
138}
139
140#endif /* OMIT_OVRTIMER_STOP */
141#endif /* TOPPERS_ovrstp */
142
143/*
144 * オーバランハンドラの動作開始
145 */
146#ifdef TOPPERS_sta_ovr
147
148ER
149sta_ovr(ID tskid, PRCTIM ovrtim)
150{
151 TCB *p_tcb;
152 ER ercd;
153
154 LOG_STA_OVR_ENTER(tskid, ovrtim);
155 CHECK_UNL();
156 CHECK_OBJ(ovrinib[0].ovrhdr != NULL);
157 if (tskid == TSK_SELF && !sense_context()) {
158 p_tcb = p_runtsk;
159 }
160 else {
161 CHECK_ID(VALID_TSKID(tskid));
162 p_tcb = get_tcb(tskid);
163 }
164 CHECK_PAR(0U < ovrtim && ovrtim <= TMAX_OVRTIM);
165
166 lock_cpu();
167 if (!sense_context() && p_tcb == p_runtsk) {
168 if (p_runtsk->staovr) {
169 (void) target_ovrtimer_stop(INTNO_DUMMY_TIMER);
170 }
171 target_ovrtimer_start(ovrtim);
172 ovrtimer_flag = true;
173 }
174 p_tcb->staovr = true;
175 p_tcb->leftotm = ovrtim;
176 ercd = E_OK;
177 unlock_cpu();
178
179 error_exit:
180 LOG_STA_OVR_LEAVE(ercd);
181 return(ercd);
182}
183
184#endif /* TOPPERS_sta_ovr */
185
186/*
187 * オーバランハンドラの動作停止
188 */
189#ifdef TOPPERS_stp_ovr
190
191ER
192stp_ovr(ID tskid)
193{
194 TCB *p_tcb;
195 ER ercd;
196
197 LOG_STP_OVR_ENTER(tskid);
198 CHECK_UNL();
199 CHECK_OBJ(ovrinib[0].ovrhdr != NULL);
200 if (tskid == TSK_SELF && !sense_context()) {
201 p_tcb = p_runtsk;
202 }
203 else {
204 CHECK_ID(VALID_TSKID(tskid));
205 p_tcb = get_tcb(tskid);
206 }
207
208 lock_cpu();
209 if (!sense_context() && p_tcb == p_runtsk) {
210 if (p_runtsk->staovr) {
211 (void) target_ovrtimer_stop(INTNO_DUMMY_TIMER);
212 ovrtimer_flag = false;
213 }
214 }
215 p_tcb->staovr = false;
216 ercd = E_OK;
217 unlock_cpu();
218
219 error_exit:
220 LOG_STP_OVR_LEAVE(ercd);
221 return(ercd);
222}
223
224#endif /* TOPPERS_stp_ovr */
225
226/*
227 * オーバランハンドラの状態参照
228 */
229#ifdef TOPPERS_ref_ovr
230
231ER
232ref_ovr(ID tskid, T_ROVR *pk_rovr)
233{
234 TCB *p_tcb;
235 ER ercd;
236
237 LOG_REF_OVR_ENTER(tskid, pk_rovr);
238 CHECK_TSKCTX_UNL();
239 CHECK_OBJ(ovrinib[0].ovrhdr != NULL);
240 if (tskid == TSK_SELF && !sense_context()) {
241 p_tcb = p_runtsk;
242 }
243 else {
244 CHECK_ID(VALID_TSKID(tskid));
245 p_tcb = get_tcb(tskid);
246 }
247
248 lock_cpu();
249 if (p_tcb->staovr) {
250 pk_rovr->ovrstat = TOVR_STA;
251 if (p_tcb == p_runtsk) {
252 pk_rovr->leftotm = target_ovrtimer_get_current();
253 }
254 else {
255 pk_rovr->leftotm = p_tcb->leftotm;
256 }
257 }
258 else {
259 pk_rovr->ovrstat = TOVR_STP;
260 }
261 ercd = E_OK;
262 unlock_cpu();
263
264 error_exit:
265 LOG_REF_OVR_LEAVE(ercd, pk_rovr);
266 return(ercd);
267}
268
269#endif /* TOPPERS_ref_ovr */
270
271/*
272 * オーバランハンドラ起動ルーチン
273 *
274 * オーバランハンドラの呼出し後に,呼出し前の状態(CPUロックフラグ,割
275 * 込み優先度マスク)に戻さないのは,このルーチンからのリターン後に,
276 * 割込み出口処理で元の状態に戻すためである.
277 */
278#ifdef TOPPERS_ovrcal
279
280void
281call_ovrhdr(void)
282{
283 assert(sense_context());
284 assert(!sense_lock());
285 assert(ovrinib[0].ovrhdr != NULL);
286
287 lock_cpu();
288 if (p_runtsk != NULL && p_runtsk->staovr && p_runtsk->leftotm == 0U) {
289 p_runtsk->staovr = false;
290 unlock_cpu();
291
292 LOG_OVR_ENTER(p_runtsk);
293 ((OVRHDR)(ovrinib[0].ovrhdr))(TSKID(p_runtsk),
294 p_runtsk->p_tinib->exinf);
295 LOG_OVR_LEAVE(p_runtsk);
296 }
297 else {
298 /*
299 * このルーチンが呼び出される前に,オーバランハンドラの起動が
300 * キャンセルされた場合
301 */
302 unlock_cpu();
303 }
304}
305
306#endif /* TOPPERS_ovrcal */
307#endif /* TOPPERS_SUPPORT_OVRHDR */
Note: See TracBrowser for help on using the repository browser.