source: rtos_arduino/trunk/lib/rca_lib.cpp@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 7.3 KB
Line 
1#include "rca.h"
2#include "rca_lib.h"
3
4extern "C" {
5extern void yield(void);
6extern void rca_ena_int(uint_t intno);
7extern void rca_dis_int(uint_t intno);
8}
9
10#ifdef RCA_ENABLE_PROFILING
11volatile uint32_t rca_idle_result;
12volatile uint32_t rca_isr_result;
13volatile uint32_t rca_dispatch_result;
14volatile uint32_t rca_timer_isr_result;
15volatile uint32_t rca_usb_isr_result;
16volatile uint32_t rca_sercom0_isr_result;
17volatile uint32_t rca_sercom2_isr_result;
18volatile uint32_t rca_sercom3_isr_result;
19volatile uint32_t rca_sercom4_isr_result;
20volatile uint32_t rca_sercom5_isr_result;
21volatile uint32_t rca_eic_isr_result;
22volatile uint32_t rca_tc5_isr_result;
23volatile uint32_t rca_rtc_isr_result;
24
25static volatile uint32_t rca_idle_cnt;
26static volatile uint32_t rca_isr_cnt;
27static volatile uint32_t rca_dispatch_cnt;
28static volatile uint32_t rca_timer_isr_cnt;
29static volatile uint32_t rca_usb_isr_cnt;
30static volatile uint32_t rca_sercom0_isr_cnt;
31static volatile uint32_t rca_sercom2_isr_cnt;
32static volatile uint32_t rca_sercom3_isr_cnt;
33static volatile uint32_t rca_sercom4_isr_cnt;
34static volatile uint32_t rca_sercom5_isr_cnt;
35static volatile uint32_t rca_eic_isr_cnt;
36static volatile uint32_t rca_tc5_isr_cnt;
37static volatile uint32_t rca_rtc_isr_cnt;
38static volatile uint32_t rca_profiling_cyccnt;
39#endif /* RCA_ENABLE_PROFILING */
40
41Inline void
42rca_di(void){
43 Asm("cpsid f":::"memory");
44}
45
46/*
47 * FAULTMASK‚̃NƒŠƒA
48 */
49Inline void
50rca_ei(void){
51 Asm("cpsie f":::"memory");
52}
53
54void
55rca_init(intptr_t exinf)
56{
57 init(); //wiring.c
58}
59
60void
61rca_ena_int(uint_t intno) {
62 if (ena_int(intno + 16) != E_OK) {
63 while(1); //ToDo
64 }
65
66}
67
68void
69rca_dis_int(uint_t intno) {
70 if (dis_int(intno + 16) != E_OK) {
71 while(1); //ToDo
72 }
73}
74
75extern const DeviceVectors exception_table;
76
77#ifdef RCA_RR_SCEDULE
78static uint32_t time_slice = 0;
79#endif /* RCA_RR_SCEDULE */
80
81/*
82 * Cyclic Handler
83 */
84void
85rca_CycHandler(intptr_t exinf)
86{
87#ifdef RCA_RR_SCEDULE
88 int i;
89 if (++time_slice == RCA_RR_SCEDULE_CYCLE) {
90 time_slice = 0;
91 for(i = 1; i < 16; i++){
92 if (RCA_RR_SCEDULE & (i << i)) {
93 irot_rdq(i);
94 }
95 }
96 }
97#endif /* RCA_RR_SCEDULE */
98#ifdef RCA_ENABLE_PROFILING
99 rca_di();
100 rca_isr_cnt++;
101 rca_timer_isr_cnt++;
102 rca_profiling_cyccnt++;
103 if(rca_profiling_cyccnt == RCA_PROFILING_CYC_MS){
104 rca_idle_result= rca_idle_cnt;
105 rca_isr_result= rca_isr_cnt;
106 rca_dispatch_result= rca_dispatch_cnt;
107 rca_timer_isr_result= rca_timer_isr_cnt;
108 rca_usb_isr_result= rca_usb_isr_cnt;
109 rca_sercom0_isr_result= rca_sercom0_isr_cnt;
110 rca_sercom2_isr_result= rca_sercom2_isr_cnt;
111 rca_sercom3_isr_result= rca_sercom3_isr_cnt;
112 rca_sercom4_isr_result= rca_sercom4_isr_cnt;
113 rca_sercom5_isr_result= rca_sercom5_isr_cnt;
114 rca_eic_isr_result= rca_eic_isr_cnt;
115 rca_tc5_isr_result= rca_tc5_isr_cnt;
116 rca_rtc_isr_result= rca_rtc_isr_cnt;
117 rca_idle_cnt = 0;
118 rca_isr_cnt = 0;
119 rca_dispatch_cnt = 0;
120 rca_timer_isr_cnt = 0;
121 rca_usb_isr_cnt = 0;
122 rca_sercom0_isr_cnt = 0;
123 rca_sercom2_isr_cnt = 0;
124 rca_sercom3_isr_cnt = 0;
125 rca_sercom4_isr_cnt = 0;
126 rca_sercom5_isr_cnt = 0;
127 rca_eic_isr_cnt = 0;
128 rca_tc5_isr_cnt = 0;
129 rca_rtc_isr_cnt = 0;
130 rca_profiling_cyccnt = 0;
131 }
132 rca_ei();
133#endif /* RCA_ENABLE_PROFILING */
134 ((void(*)(void))(exception_table.pfnSysTick_Handler))();
135}
136
137/*
138 * Interrupt Handler
139 */
140void
141rca_USB_Handler(void)
142{
143#ifdef RCA_ENABLE_PROFILING
144 rca_di();
145 rca_usb_isr_cnt++;
146 rca_isr_cnt++;
147 rca_ei();
148#endif /* RCA_ENABLE_PROFILING */
149 ((void(*)(void))(exception_table.pfnUSB_Handler))();
150}
151
152void
153rca_SERCOM0_Handler(void)
154{
155#ifdef RCA_ENABLE_PROFILING
156 rca_di();
157 rca_sercom0_isr_cnt++;
158 rca_isr_cnt++;
159 rca_ei();
160#endif /* RCA_ENABLE_PROFILING */
161 ((void(*)(void))(exception_table.pfnSERCOM0_Handler))();
162}
163
164#ifdef RCA_USE_SERIAL3
165#define PIN_SERIAL3_RX 49 /* D5 */
166#define PIN_SERIAL3_TX 48 /* D4 */
167
168Uart Serial3(&sercom2, PIN_SERIAL3_RX, PIN_SERIAL3_TX);
169
170void
171rca_SERCOM2_Handler(void)
172{
173#ifdef RCA_ENABLE_PROFILING
174 rca_di();
175 rca_sercom2_isr_cnt++;
176 rca_isr_cnt++;
177 rca_ei();
178#endif /* RCA_ENABLE_PROFILING */
179 Serial3.IrqHandler();
180}
181#endif /* RCA_USE_SERIAL3 */
182
183void
184rca_SERCOM3_Handler(void)
185{
186#ifdef RCA_ENABLE_PROFILING
187 rca_di();
188 rca_sercom3_isr_cnt++;
189 rca_isr_cnt++;
190 rca_ei();
191#endif /* RCA_ENABLE_PROFILING */
192 ((void(*)(void))(exception_table.pfnSERCOM3_Handler))();
193}
194
195void
196rca_SERCOM4_Handler(void)
197{
198#ifdef RCA_ENABLE_PROFILING
199 rca_di();
200 rca_sercom4_isr_cnt++;
201 rca_isr_cnt++;
202 rca_ei();
203#endif /* RCA_ENABLE_PROFILING */
204 ((void(*)(void))(exception_table.pfnSERCOM4_Handler))();
205}
206
207#ifdef TOPPERS_USE_ARDUINO_SERIAL
208void
209rca_SERCOM5_Handler(void)
210{
211#ifdef RCA_ENABLE_PROFILING
212 rca_di();
213 rca_sercom5_isr_cnt++;
214 rca_isr_cnt++;
215 rca_ei();
216#endif /* RCA_ENABLE_PROFILING */
217 ((void(*)(void))(exception_table.pfnSERCOM5_Handler))();
218}
219#endif /* TOPPERS_USE_ARDUINO_SERIAL */
220
221void
222rca_EIC_Handler(void)
223{
224#ifdef RCA_ENABLE_PROFILING
225 rca_di();
226 rca_eic_isr_cnt++;
227 rca_isr_cnt++;
228 rca_ei();
229#endif /* RCA_ENABLE_PROFILING */
230 ((void(*)(void))(exception_table.pfnEIC_Handler))();
231}
232
233void
234rca_TC5_Handler(void)
235{
236#ifdef RCA_ENABLE_PROFILING
237 rca_di();
238 rca_tc5_isr_cnt++;
239 rca_isr_cnt++;
240 rca_ei();
241#endif /* RCA_ENABLE_PROFILING */
242 ((void(*)(void))(exception_table.pfnTC5_Handler))();
243}
244
245void
246rca_RTC_Handler(void)
247{
248#ifdef RCA_ENABLE_PROFILING
249 rca_di();
250 rca_rtc_isr_cnt++;
251 rca_isr_cnt++;
252 rca_ei();
253#endif /* RCA_ENABLE_PROFILING */
254 ((void(*)(void))(exception_table.pfnRTC_Handler))();
255}
256
257/*
258 * For delay
259 */
260void
261yield(void){
262#ifdef RCA_RR_SCEDULE
263 time_slice = 0;
264#endif /* RCA_RR_SCEDULE */
265#ifdef RCA_ENABLE_PROFILING
266 rca_di();
267 rca_dispatch_cnt++;
268 rca_ei();
269#endif /* RCA_ENABLE_PROFILING */
270 dly_tsk(0);
271}
272
273extern void setup(void);
274extern void loop(void);
275
276void
277rca_maintask(intptr_t exinf)
278{
279 syslog(LOG_NOTICE, "Arduino Main Task start!");
280 dly_tsk(1);
281#ifdef USBCON
282 USBDevice.init();
283 USBDevice.attach();
284#endif /* USBCON */
285
286 setup();
287
288 chg_pri(0, RCA_MAINTASK_LOOP_PRI);
289
290 while(1){
291 loop();
292 if (serialEventRun) serialEventRun();
293 }
294}
295
296#define RCA_TASK_BODY(NUM) \
297extern void task##NUM##_setup(void); \
298extern void task##NUM##_loop(void); \
299 \
300void \
301rca_task##NUM(intptr_t exinf) \
302{ \
303 syslog(LOG_NOTICE, "Arduino Task" #NUM " start!"); \
304 dly_tsk(1); \
305 \
306 task##NUM##_setup(); \
307 \
308 chg_pri(0, RCA_TASK##NUM##_LOOP_PRI); \
309 \
310 while(1){ \
311 task##NUM##_loop(); \
312 } \
313}
314
315#if RCA_NUM_TASK > 0
316RCA_TASK_BODY(1)
317#endif /* RCA_NUM_TASK > 0 */
318
319#if RCA_NUM_TASK > 1
320RCA_TASK_BODY(2)
321#endif /* RCA_NUM_TASK > 1 */
322
323#if RCA_NUM_TASK > 2
324RCA_TASK_BODY(3)
325#endif /* RCA_NUM_TASK > 2 */
326
327#if RCA_NUM_TASK > 3
328RCA_TASK_BODY(4)
329#endif /* RCA_NUM_TASK > 3 */
330
331#if RCA_NUM_TASK > 4
332RCA_TASK_BODY(5)
333#endif /* RCA_NUM_TASK > 4 */
334
335#ifdef RCA_ENABLE_PROFILING
336void
337rca_idle_task(intptr_t exinf) {
338 while(1){
339 rca_di();
340 rca_idle_cnt++;
341 rca_ei();
342 }
343}
344#endif /* RCA_ENABLE_PROFILING */
Note: See TracBrowser for help on using the repository browser.