dit projekt
k07mutexceiling.ino
Go to the documentation of this file.
1 //220216
2 #include <krnl.h>
3 // one task loops and blink
4 // k_wait ensures proper timing
5 
6 struct k_t *p1, *p2, *s1, *semmutex;
7 
8 // shared data
9 struct shDataTp {
10  int v;
11  int counter;
12 };
13 
14 struct shDataTp sharedData = {0, 0};
15 
17 {
18 int retV;
19 /*
20 k_mut_ceil_enter
21  @return : 0 if you have been waiting, 1 if you just went through, -1 for
22  timeout, -4 if your priority was higher than ceiling priority so you were aborted
23 */
24  retV = k_mut_ceil_enter(semmutex, 0);
25  if (0 <= retV ) {
26  sharedData.v = v;
29  }
30  Serial.print("enter retV ");
31  Serial.println(retV);
32 }
33 
34 struct shDataTp getDataInCritRegion(void)
35 {
36  struct shDataTp tmp;
37  if (0 <= k_mut_ceil_enter(semmutex, 0) ) {
39  tmp = sharedData;
41  }
42 
43  return tmp; // also if no data has been picked up ...
44 }
45 
46 // the sampler task
47 void t1()
48 {
49  int v;
50  k_set_sem_timer(s1, 100);
51  while (1) {
52 
53  k_wait(s1, 0); //wait until a kick comes
54 
55  v = analogRead(A0);
57  }
58 }
59 
60 void t2()
61 {
62  static struct shDataTp v;
63  while (1) {
64 
65  k_sleep(345);
67  Serial.print(v.v);
68  Serial.print(" ");
69  Serial.println(v.counter);
70  } // do we keep up in pace ?
71 }
72 
73 #define STK 110
74 char a1[STK],a2[STK];
75 
76 void setup()
77 {
78  int res;
79  Serial.begin(115200);
80  while (! Serial) ;
81  pinMode(13, OUTPUT);
82 
83  k_init(2, 2, 0); // init with space for one task
84  // |--- no of mg Queues (0)
85  // |----- no of semaphores (0)
86  // |------- no of tasks (2)
87 
88  // priority low number higher priority than higher number
89  p1 = k_crt_task(t1, 10, a1,STK); // t1 as task, priority 10, 100 B stak
90  p2 = k_crt_task(t2, 10, a2,STK); // t1 as task, priority 10, 100 B stak
91 
92  s1 = k_crt_sem(0, 10); // tik
93  semmutex = k_crt_mut(5,1, 10); // ceiling prio == 5
94 
95  Serial.println("bef start");
96  res = k_start(); // 1 milli sec tick speed
97  // you will never return from k_start
98  Serial.print("ups an error occured: "); Serial.println(res);
99  while (1) ;
100 }
101 
102 void loop() {}
struct k_t * s1
void setup()
void t2()
void t1()
char a2[STK]
struct shDataTp sharedData
struct k_t * p1
void saveDataInCritRegion(int v)
#define STK
struct k_t * p2
char a1[STK]
struct shDataTp getDataInCritRegion(void)
void loop()
struct k_t * semmutex
struct k_t * k_crt_mut(char ceiling_prio, int init_val, int maxvalue)
Definition: krnl.c:748
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_mut_ceil_leave(struct k_t *sem)
Definition: krnl.c:816
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_mut_ceil_enter(struct k_t *sem, int timeout)
Definition: krnl.c:784
int k_init(int nrTask, int nrSem, int nrMsg)
Definition: krnl.c:1152
int k_start()
Definition: krnl.c:1192
Definition: krnl.h:334