krnl 1
Loading...
Searching...
No Matches
k06.ino
Go to the documentation of this file.
1
2/* k06
3 Critical region by semaphore
4 task update data and task2 use them
5 task has higher priority than task 2
6
7*/
8
9#include <krnl.h>
10
11#define STKSIZE 100
12
13#define TASKPRIO 10
14
16struct k_t * pTask, *pTask2, *sem1;
17
18volatile char reg = 0;
19
20void task()
21{
22 int res;
23 while (1) {
24 res = k_wait(sem1, 0); // knock knock at sem1. timeout = 0 means forever
25
26 DI(); // just for setting bit for critical region for osc
27 reg = 0x08;
28 PORTB = (1 << pRun->nr) | reg;
29 EI();
30
31 k_eat_msec(10); // consume 10 millisec of CPU time
32
33 DI();
34 reg = 0; // reset crit reg pin
35 PORTB = (1 << pRun->nr) | reg;
36 EI();
37
39
40 k_sleep(1);
41 k_eat_msec(3);
42 k_sleep(30); // sleep 100 ticks - replacement for delay bq k_seelp releases CPU
43 }
44}
45
46void task2() // lower prority than task above
47{
48 int res;
49 while (1) {
50 res = k_wait(sem1, 0); // knock knock at sem1. timeout = 0 menans forever
51 DI(); // just for setting bit for critical region for osc
52 reg = 0x10;
53 PORTB = (1 << pRun->nr) | reg;
54 EI();
55
56 k_eat_msec(3); // consume 10 millisec of CPU time
57
58 DI();
59 reg = 0;
60 PORTB = (1 << pRun->nr) | reg;
61 EI();
62
64 k_sleep(1);
65 k_eat_msec(1);
66
67 k_sleep(20); // sleep 100 ticks - replacement for delay bq k_seelp releases CPU
68 }
69}
70
71
72void setup() {
73 // for debugging
74 for (int i = 8; i < 14; i++)
75 pinMode(i, OUTPUT);
76
77 Serial.begin(9600);
78
79 k_init(2, 2, 0); // 2 task, 1 semaphores, 0 messaegQueues */
81 pTask2 = k_crt_task(task2, TASKPRIO+1, stak2, STKSIZE); // +1 == lower priority
82
83 sem1 = k_crt_sem(1, 10); // 1: start value, 10: max value (clipping)
84 k_start(); /* start krnl timer speed 1 milliseconds*/
85
86 Serial.println("If you see this then krnl didnt start :-( ");
87}
88
89void loop() {}
90
91/***** DEBUGGING PART - LED ON 8-12**********/
92/************************ DEBUG CALLBACK BREAKOUT PART ****************/
93// must be extern C ! its not mandatory to supply with these functions - only if you need
94
95extern "C" {
96
97 // called when a semphore is clipping - nr is id of semaphore and i os nr of times clip has occured
98 unsigned char led13;
99 ;
100 void k_sem_clip(unsigned char nr, int i)
101 {
102 return;
103 if (nr == 2)
104 led13 |= 0x20;
105 }
106
107 void k_sem_unclip(unsigned char nr)
108 {
109 return;
110 if (nr == 2)
111 led13 = 0x00;
112 }
113
114
115 /* void k_send_Q_clip(unsigned char nr, int i) {} */
116
117 // task numbering is in creation order: dummy: 0, first of yours 1, next 2,...
118 void k_breakout() // called every task shift from dispatcher
119 {
120 unsigned char c;
121 PORTB = (1 << pRun->nr) | reg; // arduino uno !! specific usage of PORTB
122 }
123 // for a MEGA you have to find another port :-)
124 // port K (adc8-15) seems feasible
125 // get inspired at http://kom.aau.dk/~jdn/edu/doc/arduino/ards.html
126}
127
128
129
130
#define STKSIZE
Definition k02.ino:8
char stak[100]
Definition k02.ino:12
unsigned char led13
Definition k02.ino:59
volatile char reg
Definition k05.ino:17
void setup()
Definition k06.ino:72
void k_breakout()
Definition k06.ino:118
void k_sem_clip(unsigned char nr, int i)
Definition k06.ino:100
void task()
Definition k06.ino:20
void k_sem_unclip(unsigned char nr)
Definition k06.ino:107
void task2()
Definition k06.ino:46
void loop()
Definition k06.ino:89
struct k_t * pTask
volatile int i
char stak2[STKSZ]
struct k_t * sem1
void task2()
#define TASKPRIO
Definition k08isrsem.ino:14
struct k_t * pTask2
Definition k09msgq.ino:11
int k_signal(struct k_t *sem)
Signal a semaphore w eventually task shift.
Definition krnl.c:636
void k_eat_msec(unsigned int eatTime)
eat milliseconds - to mimik time consuming code
Definition krnl.c:246
struct k_t * pRun
Definition krnl.c:148
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
#define DI()
Definition krnl.h:478
#define EI()
Definition krnl.h:479
struct k_t * task
Definition krnl.h:323
unsigned char nr
Definition krnl.h:327