root/nano-RK/projects/basic_signals/main.c

Revision 309, 5.6 kB (checked in by agr, 8 months ago)

stack init update to enable msp430 stack config

Line 
1 /******************************************************************************
2 *  Nano-RK, a real-time operating system for sensor networks.
3 *  Copyright (C) 2007, Real-Time and Multimedia Lab, Carnegie Mellon University
4 *  All rights reserved.
5 *
6 *  This is the Open Source Version of Nano-RK included as part of a Dual
7 *  Licensing Model. If you are unsure which license to use please refer to:
8 *  http://www.nanork.org/nano-RK/wiki/Licensing
9 *
10 *  This program is free software: you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License as published by
12 *  the Free Software Foundation, version 2.0 of the License.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 *
22 *  Contributing Authors (specific to this file):
23 *  Zane Starr
24 *******************************************************************************/
25
26
27 #include <nrk.h>
28 #include <include.h>
29 #include <ulib.h>
30 #include <stdio.h>
31 #include <avr/sleep.h>
32 #include <hal.h>
33 #include <nrk_error.h>
34 #include <nrk_timer.h>
35 #include <nrk_events.h>
36
37 NRK_STK Stack1[NRK_APP_STACKSIZE];
38 nrk_task_type TaskOne;
39 void Task1(void);
40
41 NRK_STK Stack2[NRK_APP_STACKSIZE];
42 nrk_task_type TaskTwo;
43 void Task2 (void);
44
45 NRK_STK Stack3[NRK_APP_STACKSIZE];
46 nrk_task_type TaskThree;
47 void Task3 (void);
48
49
50
51 void nrk_create_taskset();
52
53 nrk_sig_t signal_one;
54 nrk_sig_t signal_two;
55
56
57 int
58 main ()
59 {
60   uint8_t cnt;
61   nrk_setup_ports();
62   nrk_setup_uart(UART_BAUDRATE_115K2);
63
64   printf( "Starting up...\r\n" );
65
66   nrk_init();
67
68   nrk_led_clr(ORANGE_LED);
69   nrk_led_clr(BLUE_LED);
70   nrk_led_clr(GREEN_LED);
71   nrk_led_clr(RED_LED);
72                    
73   signal_one=nrk_signal_create();
74   signal_two=nrk_signal_create();
75
76   nrk_time_set(0,0);
77   nrk_create_taskset ();
78   nrk_start();
79  
80   return 0;
81 }
82
83
84 void Task1()
85 {
86 int8_t v;
87 nrk_sig_mask_t my_sigs;
88 uint8_t cnt;
89
90 cnt=0;
91 printf( "My node's address is %d\r\n",NODE_ADDR );
92
93   printf( "Task1 PID=%d\r\n",nrk_get_pid());
94   v=nrk_signal_register(signal_two);
95   if(v==NRK_ERROR) nrk_kprintf( PSTR( "T1 nrk_signal_register failed\r\n" ));
96   while(1) {
97         nrk_led_toggle(ORANGE_LED); 
98         // After cnt 20, stop sending the signal
99         // This will test the timeout   
100         if(cnt<20)
101                 {
102                 nrk_kprintf( PSTR("Task1 sending signal 1\r\n"));   
103                 v=nrk_event_signal( signal_one );
104                 if(v==NRK_ERROR)
105                 nrk_kprintf( PSTR( "T1 nrk_event_signal failed\r\n" ));
106                 cnt++;
107                 } else nrk_kprintf( PSTR( "Task1 not sending signal!\r\n" ));
108
109         nrk_kprintf( PSTR("Task1 waiting on signal 2\r\n"));   
110         my_sigs=nrk_event_wait( SIG(signal_two) );
111         if(my_sigs==0) nrk_kprintf( PSTR( "T1 nrk_event_wait failed\r\n" ));
112         if(my_sigs & SIG(signal_two))
113                 nrk_kprintf( PSTR( "Task1 got signal 2\r\n") );
114        
115         nrk_wait_until_next_period();
116         }
117 }
118
119
120 void Task2()
121 {
122 int8_t v;
123 nrk_sig_mask_t my_sigs;
124 nrk_sig_t t;
125 nrk_time_t timeout;
126
127   timeout.secs=10;
128   timeout.nano_secs=0;
129   printf( "Task2 PID=%d\r\n",nrk_get_pid());
130   v=nrk_signal_register(signal_one);
131   if(v==NRK_ERROR) nrk_kprintf( PSTR( "T2 nrk_signal_register failed\r\n" ));
132
133   // You can set a next wakeup signal which can be used as a  timeout
134   // for event_signal()
135   v=nrk_signal_register(nrk_wakeup_signal);
136   if(v==NRK_ERROR) nrk_kprintf( PSTR( "T2 nrk_signal_register failed\r\n" ));
137
138   while(1) {
139         nrk_led_toggle(BLUE_LED);
140         nrk_kprintf( PSTR("Task2 sending signal 2\r\n"));   
141         v=nrk_event_signal( signal_two);
142         if(v==NRK_ERROR) nrk_kprintf( PSTR( "T2 nrk_event_signal failed\r\n" ));
143         nrk_kprintf( PSTR("Task2 waiting on signal 1\r\n")); 
144
145         nrk_set_next_wakeup(timeout);
146         my_sigs=nrk_event_wait( SIG(signal_one) | SIG(nrk_wakeup_signal) );
147
148         if(my_sigs==0) nrk_kprintf( PSTR( "T2 nrk_event_wait failed\r\n" ));
149         if(my_sigs & SIG(signal_one))
150                 nrk_kprintf( PSTR( "Task2 got signal 1\r\n") );
151         if(my_sigs & SIG(nrk_wakeup_signal))
152                 nrk_kprintf( PSTR( "Task2 got timeout signal! \r\n") );
153                
154         nrk_wait_until_next_period();
155         }
156 }
157
158 void Task3()
159 {
160 uint16_t cnt;
161 cnt=0;
162 while(1)
163         {
164         nrk_led_toggle(RED_LED);
165         printf( "Task3: Tick %d\r\n",cnt );
166         cnt++;
167         nrk_wait_until_next_period();
168         }
169
170
171 }
172
173 void
174 nrk_create_taskset()
175 {
176   TaskOne.task = Task1;
177   nrk_task_set_stk( &TaskOne, Stack1, NRK_APP_STACKSIZE);
178   TaskOne.prio = 5;
179   TaskOne.FirstActivation = TRUE;
180   TaskOne.Type = BASIC_TASK;
181   TaskOne.SchType = PREEMPTIVE;
182   TaskOne.period.secs = 0;
183   TaskOne.period.nano_secs = 250*NANOS_PER_MS;
184   TaskOne.cpu_reserve.secs = 0;
185   TaskOne.cpu_reserve.nano_secs =  50*NANOS_PER_MS;
186   TaskOne.offset.secs = 0;
187   TaskOne.offset.nano_secs= 0;
188   nrk_activate_task (&TaskOne);
189
190   TaskTwo.task = Task2;
191   nrk_task_set_stk( &TaskTwo, Stack2, NRK_APP_STACKSIZE);
192   TaskTwo.prio = 4;
193   TaskTwo.FirstActivation = TRUE;
194   TaskTwo.Type = BASIC_TASK;
195   TaskTwo.SchType = PREEMPTIVE;
196   TaskTwo.period.secs = 0;
197   TaskTwo.period.nano_secs = 500*NANOS_PER_MS;
198   TaskTwo.cpu_reserve.secs = 0;
199   TaskTwo.cpu_reserve.nano_secs = 100*NANOS_PER_MS;
200   TaskTwo.offset.secs = 0;
201   TaskTwo.offset.nano_secs= 0;
202   nrk_activate_task (&TaskTwo);
203
204   TaskThree.task = Task3;
205   nrk_task_set_stk( &TaskThree, Stack3, NRK_APP_STACKSIZE);
206   TaskThree.prio = 3;
207   TaskThree.FirstActivation = TRUE;
208   TaskThree.Type = BASIC_TASK;
209   TaskThree.SchType = PREEMPTIVE;
210   TaskThree.period.secs = 1;
211   TaskThree.period.nano_secs = 0;
212   TaskThree.cpu_reserve.secs = 0;
213   TaskThree.cpu_reserve.nano_secs = 100*NANOS_PER_MS;
214   TaskThree.offset.secs = 0;
215   TaskThree.offset.nano_secs= 0;
216   nrk_activate_task (&TaskThree);
217
218
219
220 }
221
Note: See TracBrowser for help on using the browser.