krnl 1
Loading...
Searching...
No Matches
ceil04.ino
Go to the documentation of this file.
1
2/*
3 ceil04
4 task1 and task each 200 tick peiode and 60 tick tiem eating in mutex
5
6 mutex by semaphore of ceiling mutex
7 Set/Reset by #defein CEIL
8
9 Using debug on PORTB(Uno et al) or PORTA(Mega's)
10*/
11
12#include <krnl.h>
13
14#define STK 150
15
16#define TASKPRIO 10
17
19struct k_t * pTask1, *pTask2, *pTask3, *sem1, *sem2, *sem3, *sem4;
20
21#define CEIL
22
23void task1()
24{
26 while (1) {
27 k_wait(sem3, 0);
28#ifdef CEIL
30#else
31 k_wait(sem1, 0);
32#endif
33 bugBitSet(4); // vipper bit 4 DIO 4
34 k_eat_time(60);
35 bugBitReset(4);
36#ifdef CEIL
38#else
40#endif
41 }
42}
43
44
45void task2()
46{
47 int res;
49 while (1) {
50 k_wait(sem2, 0);
51
52#ifdef CEIL
54#else
55 k_wait(sem1, 0);
56#endif
57
58 bugBitSet(5);
59
60 k_eat_time(60);
61
62 bugBitReset(5);
63
64#ifdef CEIL
66#else
68#endif
69
70 }
71}
72
73void task3()
74{
76 while (1) {
77 k_wait(sem4, 0);
78 k_eat_time(20);
79 }
80}
81
82void setup() {
83 // for debugging - only on uno eq- If Mega etc use PORTA(which is pn 22,23,...)
84 // see http://kom.aau.dk/~jdn/edu/doc/arduino/mega.png
85
87 Serial.begin(9600);
88
89 k_init(3, 4, 0); // 2 task, 1 semaphores, 0 messaegQueues */
93
94 sem1 = k_crt_sem(1, 10); // 1: start value, 10: max value (clipping)
96
97 sem2 = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
98 sem3 = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
99 sem4 = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
100 k_start(1); /* start krnl timer speed 1 milliseconds*/
101
102 Serial.println("If you see this then krnl didnt start :-( ");
103}
104
105void loop() {}
106
107/*****************************************/
108
109
111{
112#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
113 for (int i = 8; i < 8 + 6; i++)
114 pinMode(i, OUTPUT);
115
116#elif defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
117 for (int i = 22; i < 22 + 6; i++)
118 pinMode(i, OUTPUT);
119#endif
120
121}
122
123/**********************************************************************/
124/***** DEBUGGING PART - LED ON 8-12**********/
125/************************ DEBUG CALLBACK BREAKOUT PART ****************/
126// must be extern C ! its not mandatory to supply with these functions - only if you need
127volatile unsigned char reg = 0;
128
129void bugBitSet(int bitNr)
130{
131 DI();
132 reg = 1 << bitNr;
133
134#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
135
136 PORTB = (1 << pRun->nr) | reg; // arduino uno !! specific usage of PORTB
137
138#elif defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
139
140 PORTA = (1 << pRun->nr) | reg; // // arduino uno !! specific usage of PORTB
141
142#endif
143 EI();
144}
145
146void bugBitReset(int bitNr)
147{
148 char r;
149 DI();
150 r = ~(1 << bitNr);
151 reg = 0;
152#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
153
154 PORTB = (1 << pRun->nr) & r; // arduino uno !! specific usage of PORTB
155
156#elif defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
157
158 PORTA = (1 << pRun->nr) & r; // // arduino uno !! specific usage of PORTB
159
160#endif
161 EI();
162}
163
164
165
166extern "C" {
167 // called when a semphore is clipping - nr is id of semaphore and i os nr of times clip has occured
168 unsigned char led13;
169
170 void k_sem_clip(unsigned char nr, int i)
171 {
172 return; // !!!!
173 if (nr == 2)
174 led13 |= 0x20;
175 }
176
177 void k_sem_noclip(unsigned char nr)
178 {
179 return;
180 if (nr == 2)
181 led13 = 0x00;
182 }
183
184
185 /* void k_send_Q_clip(unsigned char nr, int i) {} */
186
187 // task numbering is in creation order: dummy: 0, first of yours 1, next 2,...
188 void k_breakout() // called every task shift from dispatcher
189 {
190 unsigned char c;
191
192 // if we do have a uno,nano etc use PORTB directly
193#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
194
195 PORTB = (1 << pRun->nr) | reg; // arduino uno !! specific usage of PORTB
196
197#elif defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
198
199 PORTA = (1 << pRun->nr) | reg; // // arduino uno !! specific usage of PORTB
200
201#endif
202
203
204 }
205 // for a MEGA you have to find another port :-)
206 // port K (adc8-15) seems feasible
207 // get inspired at http://kom.aau.dk/~jdn/edu/doc/arduino/ards.html
208}
209
210
211
212
213
unsigned char led13
Definition k02.ino:59
volatile char reg
Definition k05.ino:17
#define STK
char stak1[STKSZ]
volatile int i
char stak2[STKSZ]
struct k_t * sem1
struct k_t * sem2
void task2()
void task1()
struct k_t * pTask1
Definition k08isrsem.ino:17
struct k_t * pTask2
Definition k09msgq.ino:11
int k_signal(struct k_t *sem)
Signal a semaphore w eventually task shift.
Definition krnl.c:636
struct k_t * pRun
Definition krnl.c:148
int k_mut_ceil_set(struct k_t *sem, char prio)
set ceiling priority on a mutex
Definition krnl.c:529
int k_wait(struct k_t *sem, int timeout)
stand wait on semaphore call with timeout facility
Definition krnl.c:683
int k_mut_ceil_leave(struct k_t *sem)
leave a "ceiled mutex" enter with k_mut_ceil_enter
Definition krnl.c:771
struct k_t * k_crt_task(void(*pTask)(void), char prio, char *pStk, int stkSize)
create a task - only to be called before k_start creates a task and put it in the active Q
Definition krnl.c:328
int k_set_sem_timer(struct k_t *sem, int val)
attach a periodic timer to a semaphore, to be used for realtime
Definition krnl.c:586
int k_mut_ceil_enter(struct k_t *sem, int timeout)
set ceiling priority on a mutex
Definition krnl.c:739
struct k_t * k_crt_sem(int init_val, int maxvalue)
change task priority and reinserts it in task Q and do a task shift
Definition krnl.c:544
int k_init(int nrTask, int nrSem, int nrMsg)
Definition krnl.c:1108
int k_start()
Definition krnl.c:1149
#define DI()
Definition krnl.h:478
#define EI()
Definition krnl.h:479
struct k_t * sem3
char stak3[150]
Definition ceil04.ino:18
struct k_t * pTask3
Definition ceil04.ino:19
void setup()
Definition ceil04.ino:82
void k_breakout()
Definition ceil04.ino:188
void bugBitReset(int bitNr)
Definition ceil04.ino:146
void init_IO_for_debug()
Definition ceil04.ino:110
void k_sem_noclip(unsigned char nr)
Definition ceil04.ino:177
struct k_t * sem4
Definition ceil04.ino:19
void k_sem_clip(unsigned char nr, int i)
Definition ceil04.ino:170
void bugBitSet(int bitNr)
Definition ceil04.ino:129
void task3()
Definition ceil04.ino:73
void task2()
Definition ceil04.ino:45
void task1()
Definition ceil04.ino:23
void loop()
Definition ceil04.ino:105
Definition krnl.h:323
unsigned char nr
Definition krnl.h:327