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