krnl 1
Loading...
Searching...
No Matches
rt-arduino-critregion.ino
Go to the documentation of this file.
1/* critical region - by semaphores - aka mutex
2 JDN
3 * */
4
5#include <krnl.h>
6
7#define STK 150
8
9#define TASKPRIO 10
10
11
12struct k_t * pTask1, *pTask2;
13
14struct k_t *mutSem;
15
17
18volatile int t2Missed = 0, t2Hit = 0;;
19
20void task1()
21{
22 int lI, lII;
23 k_set_sem_timer(timedSem1, 100); // 100 tick aka 100 msec realtime signal from krnl
24
25 while (1) {
26 k_wait(timedSem1, 0); // wait until kick
27 DI(); // get it atomic !
28 lI = t2Missed;
29 lII = t2Hit;
30 EI();
31
32 k_wait(mutSem, 0); // wait until access
33
34 k_eat_ticks(50); // simulate processing
35 Serial.print("1:yes "); Serial.print(" hit: ");
36 Serial.print(lII);
37 Serial.print(" nohit: "); Serial.println(lI);
39 k_eat_ticks(2);
40 }
41}
42
43
44void task2()
45{
46 k_set_sem_timer(timedSem2, 10); // 100 tick aka 100 msec realtime signal from krnl
47
48 while (1) {
49 k_wait(timedSem2, 0) ; // wait until kick
50 if (0 <= k_wait(mutSem, 10) ) { // wait until access or 10 ticks timeout return 1: ok - no wait 0: ok wait, -1: timeout
51
52 k_eat_ticks(5);
53 Serial.println("2:yes");
54 t2Hit++;
56
57 }
58 else
59 {
60 DI(); // update atomic
61 t2Missed++;
62 EI();
63 }
64 k_eat_ticks(2);
65 }
66}
67
68
69void setup() {
70 // for debugging - only on uno eq- If Mega etc use PORTA(which is pn 22,23,...)
71 // see http://kom.aau.dk/~jdn/edu/doc/arduino/mega.png
72
73 Serial.begin(115200);
74 delay(2000);
75
76 Serial.println("just bef init part");
77
78 k_init(2, 3, 0); // 2 task, 1 semaphores, 0 messaegQueues */
79
80 pTask1 = k_crt_task(task1, 15, STK);
81 pTask2 = k_crt_task(task2, 15 , STK);
82
83 timedSem1 = k_crt_sem(0, 1); // 1: start value, 10: max value (clipping)
84 timedSem2 = k_crt_sem(0, 1); // 1: start value, 10: max value (clipping)
85 mutSem = k_crt_sem(1, 1); // 1: start value, 10: max value (clipping)
86
87 Serial.println("just bef k_start");
88
89 k_start(1); /* start krnl timer speed 1 milliseconds*/
90
91 Serial.println("If you see this then krnl didnt start :-( ");
92}
93
94void loop() {}
#define STK
void task2()
void task1()
struct k_t * mutSem
Definition k08isrsem.ino:19
struct k_t * timedSem1
Definition k08isrsem.ino:21
volatile int t2Missed
Definition k08isrsem.ino:23
struct k_t * timedSem2
Definition k08isrsem.ino:21
volatile int t2Hit
Definition k08isrsem.ino:23
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
int k_wait(struct k_t *sem, int timeout)
stand wait on semaphore call with timeout facility
Definition krnl.c:683
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
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
void setup()
void task2()
void task1()
void loop()
Definition krnl.h:323