krnl 1
Loading...
Searching...
No Matches
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
6struct k_t *p1, *p2, *s1, *semmutex;
7
8// shared data
9struct shDataTp {
10 int v;
12};
13
14struct shDataTp sharedData = {0, 0};
15
17{
18int retV;
19/*
20k_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;
27 sharedData.counter ++;
29 }
30 Serial.print("enter retV ");
31 Serial.println(retV);
32}
33
35{
36 struct shDataTp tmp;
37 if (0 <= k_mut_ceil_enter(semmutex, 0) ) {
38 sharedData.counter--;
39 tmp = sharedData;
41 }
42
43 return tmp; // also if no data has been picked up ...
44}
45
46// the sampler task
47void 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
60void 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
74char a1[STK],a2[STK];
75
76void 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
102void 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
char a2[110]
char a1[110]
void setup()
void t2()
void t1()
struct shDataTp sharedData
void saveDataInCritRegion(int v)
struct shDataTp getDataInCritRegion(void)
void loop()
struct k_t * semmutex
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
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
struct k_t * k_crt_mut(char ceiling_prio, int init_val, int maxvalue)
crt a std semaphore to be used as mutex
Definition krnl.c:703
int k_init(int nrTask, int nrSem, int nrMsg)
Definition krnl.c:1108
int k_start()
Definition krnl.c:1149
struct k_t * t1
Definition krnlgen.ino:3
struct k_t * t2
Definition krnlgen.ino:3
Definition krnl.h:323