dit projekt
k07mutexsem-adv.ino
Go to the documentation of this file.
1 // 220216
2 #include <krnl.h>
3 
4 
5 struct k_t *p1, *p2, *s1, *semmutex;
6 
7 // shared data
8 struct shDataTp {
9  int v;
10  int counter;
11 };
12 
13 struct shDataTp sharedData = {0, 0};
14 
15 volatile int noDataDelivered = 0;
16 
17 
18 void saveDataInCritRegion(int v) // save data from critical region protected by a semaphore
19 {
20  k_wait(semmutex, 0);
21  {
22  sharedData.v = v;
24 
25  }
27 }
28 
29 int 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;
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 
45 struct shDataTp getDataInCritRegion(void)
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
52  tmp = sharedData;
53 
55  return tmp;
56 }
57 
58 // the sampler task
59 
60 
61 void 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 
80 void 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
101 char a1[STK], a2[STK];
102 
103 void 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 
130 void loop() {}
int x
struct k_t * s1
void setup()
void t2()
void t1()
char a2[STK]
struct shDataTp sharedData
struct k_t * p1
volatile int noDataDelivered
void saveDataInCritRegion(int v)
#define STK
struct k_t * p2
char a1[STK]
struct shDataTp getDataInCritRegion(void)
int saveDataInCritRegionNoWait(int v)
void loop()
struct k_t * semmutex
int k_signal(struct k_t *sem)
Definition: krnl.c:681
void k_eat_msec(unsigned int eatTime)
Definition: krnl.c:292
int k_sleep(int time)
Definition: krnl.c:491
struct k_t * k_crt_sem(int init_val, int maxvalue)
Definition: krnl.c:589
int k_wait(struct k_t *sem, int timeout)
Definition: krnl.c:728
int k_set_sem_timer(struct k_t *sem, int val)
Definition: krnl.c:631
struct k_t * k_crt_task(void(*pTask)(void), char prio, char *pStk, int stkSize)
Definition: krnl.c:374
int k_init(int nrTask, int nrSem, int nrMsg)
Definition: krnl.c:1152
int k_start()
Definition: krnl.c:1192
#define DI()
Definition: krnl.h:489
#define EI()
Definition: krnl.h:490
Definition: krnl.h:334