krnl 1
Loading...
Searching...
No Matches
ka01isr.ino
Go to the documentation of this file.
1//260414
2
3/*
4* ISR INTEGRATION
5* pro: we do use the standard atatchInterrupt from Arduino , easy etc
6*
7* ISR PINS TO USE
8
9UNO(328P): https://jensd.dk/doc/arduino/pins/uno.png
10
11pin 2 (INT0)
12pin 3 (INT1)
13
14MEGA(2560) https://jensd.dk/doc/arduino/pins/mega.png
15 pin 21 INT0 NB: I2C SCL pin as well
16 pin 20 INT1 NB: I2C SDA pin as well
17 pin 19 INT2
18 pin 18 INT3
19 pin 2 INT4
20 pin 3 INT5
21
22 Atmega32u4 based micro
23 intr 0,1,2,3, intr is special - it you used it beware
24Arduino micro(32u4 based)
25pin 18 INT0
26pin 19 INT1
27pin 20 INT2
28pin 21 INT3
29pin 1 INT6
30
31 NB NB NB
32 Only krnl calls allowd in isr: ki_signal and ki_send
33 When using Arduino install of interrupts( attachInterrupt) you are not allowed to call krnls scheduler.
34
35 So in worst case the task started by a interrupt krnl call (ki_signal, ki_send) will be running withn1 msec (at next krnl timer tick)
36
37 SO NO K_CHG_STAK(); PUSHREGS(); POPREGS(); RETI();
38}
39*
40*/
41
42#include <krnl.h>
43
44// stak size
45#define STK 150
46
47
49
50#define TASKPRIO 10
51
52struct k_t
56
57
58volatile int isrCount = 0, localCpy = 0;
59
60void myISR() {
61 isrCount++;
63}
64
65void task1() {
66
67 int cn=0;
68
70 while (1) {
71 k_wait(timedSem, 0);
72 Serial.print("isr counter ");
73 Serial.print(cn++);
74 Serial.print(" ");
75 Serial.println(localCpy);
76 }
77}
78
79
80void task2() {
81
82 while (1) {
83 k_wait(isrSyncSem, 0); // wait on kick from ISR
84 // to ensure atomic access to isrCOunt you might disable interrupt
85
86 DI(); // disable interrupt - takes approx 62.5 nanosec
88 EI(); // enable interrupt - takes approx 62.5 nanosec
89 }
90}
91
92void setup() {
93 Serial.begin(115200);
94 delay(500);
95
96 Serial.println("\n\njust bef init part");
97
98
99 k_init(2, 2, 0); // 2 task, 2 semaphores, 0 messaegQueues */
100
103
104 isrSyncSem = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
105 timedSem = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
106
107 pinMode(2, INPUT_PULLUP); // for isr
108
109 attachInterrupt(digitalPinToInterrupt(2), myISR, FALLING); // install ISR
110
111 Serial.println("justr bef start");
112
113 k_start(); /* start krnl timer speed 1 milliseconds*/
114
115 Serial.println("If you see this then krnl didnt start :-( ");
116}
117
118void loop() {}
#define STK
void task2()
void task1()
struct k_t * pTask1
Definition k08isrsem.ino:17
struct k_t * pTask2
Definition k09msgq.ino:11
char stkTask1[150]
Definition ka01isr.ino:48
volatile int localCpy
Definition ka01isr.ino:58
struct k_t * isrSyncSem
Definition ka01isr.ino:55
void setup()
Definition ka01isr.ino:92
volatile int isrCount
Definition ka01isr.ino:58
void myISR()
Definition ka01isr.ino:60
struct k_t * timedSem
Definition ka01isr.ino:55
char stkTask2[150]
Definition ka01isr.ino:48
void task2()
Definition ka01isr.ino:80
void task1()
Definition ka01isr.ino:65
void loop()
Definition ka01isr.ino:118
int ki_signal(struct k_t *sem)
signal a semaphore from AN ISR - no task shift , do not enable intr,...
Definition krnl.c:605
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
#define DI()
Definition krnl.h:478
#define EI()
Definition krnl.h:479
Definition krnl.h:323