krnl 1
Loading...
Searching...
No Matches
k07mutexsem-adv.ino
Go to the documentation of this file.
1// 220216
2#include <krnl.h>
3
4
5struct k_t *p1, *p2, *s1, *semmutex;
6
7// shared data
8struct shDataTp {
9 int v;
10 int counter;
11};
12
13struct shDataTp sharedData = {0, 0};
14
15volatile int noDataDelivered = 0;
16
17
18void saveDataInCritRegion(int v) // save data from critical region protected by a semaphore
19{
20 k_wait(semmutex, 0);
21 {
22 sharedData.v = v;
23 sharedData.counter ++;
24
25 }
27}
28
29int saveDataInCritRegionNoWait(int v) // picjk up data from critical region protected by a semaphore
30{
31 int x;
32 x = k_wait(semmutex, -1);
33
34 if (0 <= x) { // yes
35 sharedData.v = v;
36 sharedData.counter ++;
38 }
39
40 return x; // 1: ok we had to wait, 1: ok no wait, -1: timeout, -2: no wait and we wil not wait (k_wait(<sem>,-1))
41}
42
43
44
46{
47 struct shDataTp tmp;
48 k_wait(semmutex, 0);
49
50 k_eat_msec(70); // to block region some time so teh other cant get it at once
51 sharedData.counter--;
52 tmp = sharedData;
53
55 return tmp;
56}
57
58// the sampler task
59
60
61void t1()
62{
63 int v;
64
65 k_set_sem_timer(s1, 100);
66
67 while (1) {
68
69 k_wait(s1, 0); //wait until a kick comes
70
71 v = analogRead(A0); // just to get some noise
72 if (0 > saveDataInCritRegionNoWait(v)) { // or saveDataInCritRegion(v); if you can afford to wait - may become late
73 DI();
75 EI();
76 }
77 }
78}
79
80void t2()
81{
82 int ll;
83 static struct shDataTp v;
84 while (1) {
85
86
87 k_sleep(300);
89 Serial.print(v.v);
90 Serial.print(" ");
91 Serial.print(v.counter);
92 DI();
93 ll = noDataDelivered;
94 EI();
95 Serial.print(" nodata dlv ");
96 Serial.println(ll);
97 } // do we keep up in pace ?
98}
99
100#define STK 150
101char a1[STK], a2[STK];
102
103void setup()
104{
105 int res;
106 Serial.begin(115200);
107 while (! Serial) ;
108 pinMode(13, OUTPUT);
109
110 k_init(2, 2, 0); // init with space for one task
111 // |--- no of mg Queues (0)
112 // |----- no of semaphores (0)
113 // |------- no of tasks (2)
114
115 // priority low number higher priority than higher number
116 p1 = k_crt_task(t1, 10, a1, STK); // t1 as task, priority 10, 100 B stak
117 p2 = k_crt_task(t2, 10, a2, STK); // t1 as task, priority 10, 100 B stak
118
119 s1 = k_crt_sem(0, 10);
120
121 semmutex = k_crt_sem(1, 10); // must be 1 otherwise no one can come inside
122
123 Serial.println("bef start");
124 res = k_start(); // 1 milli sec tick speed
125 // you will never return from k_start
126 Serial.print("ups an error occured: "); Serial.println(res);
127 while (1) ;
128}
129
130void loop() {}
#define STK
struct k_t * p1
Definition k03asleep.ino:22
struct k_t * p2
Definition k03asleep.ino:22
unsigned char s1[110]
Definition k03asleep.ino:25
int x
char a2[110]
char a1[110]
struct shDataTp sharedData
struct shDataTp getDataInCritRegion(void)
struct k_t * semmutex
void setup()
void t2()
void t1()
volatile int noDataDelivered
void saveDataInCritRegion(int v)
struct shDataTp getDataInCritRegion(void)
int saveDataInCritRegionNoWait(int v)
void loop()
int k_signal(struct k_t *sem)
Signal a semaphore w eventually task shift.
Definition krnl.c:636
void k_eat_msec(unsigned int eatTime)
eat milliseconds - to mimik time consuming code
Definition krnl.c:246
int k_sleep(int time)
let task sleep for a number of milliseconds
Definition krnl.c:445
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
struct k_t * t1
Definition krnlgen.ino:3
struct k_t * t2
Definition krnlgen.ino:3
Definition krnl.h:323