krnl 1
Loading...
Searching...
No Matches
k03mutex.ino
Go to the documentation of this file.
1#include <krnl.h>
2
3// A small krnl program with two independent tasks
4// They share data which is guarded by a semaphore implemented mutex
5// Tasks has same priority in this examples
6// you can have more mutex regions by using more sempahores :-)
7
8struct k_t *pt1, // pointer to hold reference
9*pt2, // to taskdescriptor for t1 and t2
11
12char s1[200]; // stak for task t1
13char s2[200]; // stak for task t2
14
16{
17 static char flag=0;
18 if (flag) {
19 flag = 0;
20 digitalWrite(13,HIGH);
21 }
22 else {
23 flag = 1;
24 digitalWrite(13,LOW);
25 }
26}
27
28void t1(void)
29{
30 while (1) {
31 // just wait until you get region
32
33 k_wait(mutexSem,0);
34 // CRITICAL REGION STARTS
35 // when I am in between the wait and signal task t2 cant be in its similar region
36 // bq I have the token (semaphore initialised to 1)
37 // and ofcourse the same for t2 versus t1
38 digitalWrite(13,HIGH);
39 k_sleep(700);
40 digitalWrite(13,LOW);
41
42 // CRITICAL REGION ENDS
44 }
45}
46
47void t2(void)
48{
49 // and task body for task 2
50 // runs independent of task t1
51 while (1) {
52 k_wait(mutexSem,0); // just wait until you get region
53 // CRITICAL REGION STARTS
54 Serial.println("t1 got it");
55 k_sleep(100);
56
57 // CRITICAL REGION ENDS
59 }
60}
61
62void setup()
63{
64 Serial.begin(9600); // for output from task 1
65 pinMode(13,OUTPUT); // for blink on LED from task 2
66
67 // init krnl so you can create 2 tasks, 1 semaphore and no message queues
68 k_init(2,1,0);
69
70 // two task are created
71 // |------------ function used for body code for task
72 // | |--------- priority (lower number= higher prio
73 // | | |------- array used for stak for task
74 // | | | |--- staksize for array s1
75 pt1=k_crt_task(t1,11,s1,200); //
76 pt2=k_crt_task(t2,11,s2,200); //
77
78 // |--- startvalue is 1 bq it is for mutex usage
79 // |-- max value before maxing out
80 mutexSem = k_crt_sem(1,10);
81
82 k_start(1); // start kernel with tick speed 10 milli seconds
83}
84
85void loop(){ /* loop will never be called */
86}
87
88
89
90
91
struct k_t * pt2
struct k_t * pt1
unsigned char s2[110]
Definition k03asleep.ino:25
unsigned char s1[110]
Definition k03asleep.ino:25
int k_signal(struct k_t *sem)
Signal a semaphore w eventually task shift.
Definition krnl.c:636
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
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
struct k_t * mutexSem
Definition mutex.ino:3
void setup()
Definition k03mutex.ino:62
void t2(void)
Definition k03mutex.ino:47
void toggleLED13()
Definition k03mutex.ino:15
void t1(void)
Definition k03mutex.ino:28
void loop()
Definition k03mutex.ino:85
struct k_t * t1
Definition krnlgen.ino:3
struct k_t * t2
Definition krnlgen.ino:3
Definition krnl.h:323