krnl 1
Loading...
Searching...
No Matches
k02simplecontroller.ino
Go to the documentation of this file.
1#include <krnl.h>
2
3// A small krnl program with two independent tasks
4// High priority task (t1) acts like a realtime controller with
5// fixed samplings frequency.
6// A low priority task(t2) do non real time actions (just some printing)
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
31 k_set_sem_timer(samplingsSem,100); // krnl will signal sem every 10 tick
32
33 while (1) {
34 // wait until next kick from timer
35 // In this way we will run realtime with a fixed frequencey
36 // but beware of tasks with highe priority bq they can spoil your
37 // realtime bq you will be ready but not running until they leave the
38 // active queue
39
41 toggleLED13(); // chk frequency with an oscilloscope
42
43 // AD();
44 // pid();
45 // DA();
46 // hope you get the plot :-)
47
48 }
49}
50
51void t2(void)
52{
53 // and task body for task 2
54 // runs independent of task t1
55 while (1) {
56 Serial.println("tik"); // just do something non realtime :-)
57 k_sleep(1000);
58 }
59}
60
61void setup()
62{
63 Serial.begin(9600); // for output from task 1
64 pinMode(13,OUTPUT); // for blink on LED from task 2
65
66 // init krnl so you can create 2 tasks, 1 semaphore and no message queues
67 k_init(2,1,0);
68
69 // two task are created
70 // |------------ function used for body code for task
71 // | |--------- priority (lower number= higher prio
72 // | | |------- array used for stak for task
73 // | | | |--- staksize for array s1
74 pt1=k_crt_task(t1,10,s1,200); // highest prio
75 pt2=k_crt_task(t2,11,s2,200); // lowest - 10 < 11 as well as 5 < 100 :-)
76
77 // |--- startvalue (can be 0,1,2, not negative
78 // |-- max value before maxing out
79 samplingsSem = k_crt_sem(0,10);
80
81 // NB-1 remember an Arduino has only 2-8 kByte RAM
82 // NB-2 remember that stak is used in function calls for
83 // - return address
84 // - registers stakked
85 // - local variabels in a function
86 // So having 200 Bytes of stak excludes a local variable like ...
87 // int arr[400];
88 // krnl call k_unused_stak returns size of unused stak
89 // Both task has same priority so krnl will shift between the
90 // tasks every 10 milli second (speed set in k_start)
91
92 k_start(1); // start kernel with tick speed 10 milli seconds
93}
94
95void loop(){ /* loop will never be called */
96}
97
98
99
100
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_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
struct k_t * samplingsSem
void setup()
void t2(void)
void toggleLED13()
void t1(void)
void loop()
struct k_t * t1
Definition krnlgen.ino:3
struct k_t * t2
Definition krnlgen.ino:3
Definition krnl.h:323