source: ssp_qb_r5f100le_cs/trunk/extension/cyclic.c

Last change on this file was 95, checked in by nmir-saito, 9 years ago

ファイルの mime-type 変更

  • Property svn:mime-type set to text/plain; charset=shift_jis
File size: 4.8 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2011 by Meika Sugimoto
6 *
7 * 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
9 * 再配布(以下,利用と呼ぶ)することを無償で許諾する.
10 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
11 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース
12 * コード中に含まれていること.
13 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
14 * できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
15 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
16 * 証規定を掲載すること.
17 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
18 * できない形で再配布する場合には,次のいずれかの条件を満たすこと.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
20 * 権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
22 * 告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
24 * からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
25 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
26 * く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 *
28 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
29 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
30 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
31 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負
32 * わない.
33 *
34 */
35
36/*
37 * 周期ハンドラ機能
38 */
39
40#include "kernel_impl.h"
41#include "check.h"
42#include "time_event.h"
43#include "cyclic.h"
44
45/*
46 * トレースログマクロのデフォルト定義
47 */
48#ifndef LOG_CYC_ENTER
49#define LOG_CYC_ENTER(cycidx)
50#endif /* LOG_CYC_ENTER */
51
52#ifndef LOG_CYC_LEAVE
53#define LOG_CYC_LEAVE(cycidx)
54#endif /* LOG_CYC_LEAVE */
55
56#ifndef LOG_STA_CYC_ENTER
57#define LOG_STA_CYC_ENTER(cycid)
58#endif /* LOG_STA_CYC_ENTER */
59
60#ifndef LOG_STA_CYC_LEAVE
61#define LOG_STA_CYC_LEAVE(ercd)
62#endif /* LOG_STA_CYC_LEAVE */
63
64#ifndef LOG_STP_CYC_ENTER
65#define LOG_STP_CYC_ENTER(cycid)
66#endif /* LOG_STP_CYC_ENTER */
67
68#ifndef LOG_STP_CYC_LEAVE
69#define LOG_STP_CYC_LEAVE(ercd)
70#endif /* LOG_STP_CYC_LEAVE */
71
72
73/* 周期ハンドラIDをタイムイベントIDに変換 */
74#define CYC_EVTID(cycidx) ((ID)((cycidx) + cycevtid_offset))
75#define INDEX_CYC(cycid) ((uint_t)((cycid) - TMIN_CYCID))
76
77
78/* 周期ハンドラの動作状態を表すビットマップ */
79#define CYCACT_BIT(index) (1U << (index))
80
81/*
82 * 周期ハンドラ起動ルーチン
83 */
84void call_cychdr(uintptr_t cycidx);
85
86/*
87 * 周期ハンドラ機能の初期化
88 */
89
90#ifdef TOPPERS_cycini
91
92void
93initialize_cyclic(void)
94{
95 uint_t i;
96
97 /* 周期ハンドラの状態設定 */
98 cyccb_cycact = cycinib_cycact;
99
100 for(i = 0U ; i < tnum_cyc ; i++) {
101 cyccb_evttim[i] = 0U;
102
103 /* 周期ハンドラの初期起動 */
104 if((cycinib_cycact & CYCACT_BIT(i)) != 0U) {
105 time_event_enqueue(CYC_EVTID(i) ,
106 (EVTTIM)cycinib_cycphs[i] , call_cychdr , i);
107 cyccb_evttim[i] = cycinib_cycphs[i];
108 }
109 }
110}
111
112#endif /* TOPPERS_cycini */
113
114#ifdef TOPPERS_sta_cyc
115
116ER
117sta_cyc(ID cycid)
118{
119 ER ercd;
120 uint_t index = INDEX_CYC(cycid);
121 EVTTIM evttim;
122
123 LOG_STA_CYC_ENTER(cycid);
124 CHECK_TSKCTX_UNL();
125 CHECK_CYCID(cycid);
126
127 t_lock_cpu();
128
129 if((cyccb_cycact & CYCACT_BIT(index)) != 0U) {
130 time_event_dequeue(CYC_EVTID(index));
131 }
132 else {
133 cyccb_cycact |= CYCACT_BIT(index);
134 }
135
136 evttim = current_time + cycinib_cycphs[index];
137 time_event_enqueue(CYC_EVTID(index) ,
138 evttim , call_cychdr , index);
139 cyccb_evttim[index] = evttim;
140
141 ercd = E_OK;
142 t_unlock_cpu();
143
144 error_exit:
145 LOG_STA_CYC_LEAVE(ercd);
146 return ercd;
147}
148
149#endif /* TOPPERS_sta_cyc */
150
151
152#ifdef TOPPERS_stp_cyc
153
154ER
155stp_cyc(ID cycid)
156{
157 ER ercd;
158 uint_t index = INDEX_CYC(cycid);
159
160 LOG_STP_CYC_ENTER(cycid);
161 CHECK_TSKCTX_UNL();
162 CHECK_CYCID(cycid);
163
164 t_lock_cpu();
165
166 if((cyccb_cycact & CYCACT_BIT(index)) != 0U) {
167 cyccb_cycact &= ~CYCACT_BIT(index);
168 time_event_dequeue(CYC_EVTID(index));
169 }
170 ercd = E_OK;
171 t_unlock_cpu();
172
173 error_exit:
174 LOG_STA_CYC_LEAVE(ercd);
175 return ercd;
176}
177
178#endif /* TOPPERS_stp_cyc */
179
180#ifdef TOPPERS_cyccal
181
182void
183call_cychdr(uintptr_t cycidx)
184{
185 cyccb_evttim[cycidx] += cycinib_cyctim[cycidx];
186
187 /* 次周期のタイムイベントを登録 */
188 time_event_enqueue((ID)cycidx ,
189 cyccb_evttim[cycidx] , call_cychdr , cycidx);
190
191 i_unlock_cpu();
192
193 /* 周期ハンドラを実行 */
194 LOG_CYC_ENTER(cycidx);
195 (*cycinib_cychdr[cycidx])(cycinib_exinf[cycidx]);
196 LOG_CYC_LEAVE(cycidx);
197
198 if (!i_sense_lock()) {
199 i_lock_cpu();
200 }
201}
202
203#endif /* TOPPERS_cyccal */
Note: See TracBrowser for help on using the repository browser.