krnl 1
Loading...
Searching...
No Matches
ka02isr.ino
Go to the documentation of this file.
1//260414
2
3/*
4* ISR INTEGRATION
5
6* ADN WITH DEBOUNCE
7* pro: we do use the standard atatchInterrupt from Arduino , easy etc
8*
9* ISR PINS TO USE
10
11UNO(328P): https://jensd.dk/doc/arduino/pins/uno.png
12
13pin 2 (INT0)
14pin 3 (INT1)
15
16MEGA(2560) https://jensd.dk/doc/arduino/pins/mega.png
17 pin 21 INT0 NB: I2C SCL pin as well
18 pin 20 INT1 NB: I2C SDA pin as well
19 pin 19 INT2
20 pin 18 INT3
21 pin 2 INT4
22 pin 3 INT5
23
24 Atmega32u4 based micro
25 intr 0,1,2,3, intr is special - it you used it beware
26Arduino micro(32u4 based)
27pin 18 INT0
28pin 19 INT1
29pin 20 INT2
30pin 21 INT3
31pin 1 INT6
32
33 NB NB NB
34 Only krnl calls allowd in isr: ki_signal and ki_send
35 When using Arduino install of interrupts( attachInterrupt) you are not allowed to call krnls scheduler.
36
37 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)
38
39 SO NO K_CHG_STAK(); PUSHREGS(); POPREGS(); RETI();
40}
41*
42*/
43
44#include <krnl.h>
45
46// stak size
47#define STK 150
48
49
51
52#define TASKPRIO 10
53
54struct k_t
58
59
60volatile int isrCount = 0, localCpy = 0;
61
62unsigned long lastRun;
63const unsigned long debounceTime = 1000;
64
66 // https://jensd.dk/doc/time/simpletime.html
67 if (debounceTime < (ki_millis() - lastRun)) {
69 isrCount++;
71 }
72}
73
78
79
80void task1() {
81
82 int cn = 0;
83
85 while (1) {
86 k_wait(timedSem, 0);
87 Serial.print("isr counter ");
88 Serial.print(cn++);
89 Serial.print(" ");
90 Serial.println(localCpy);
91 }
92}
93
94
95void task2() {
96
97 while (1) {
98 k_wait(isrSyncSem, 0); // wait on kick from ISR
99 // to ensure atomic access to isrCOunt you might disable interrupt
100
101 DI(); // disable interrupt - takes approx 62.5 nanosec
103 EI(); // enable interrupt - takes approx 62.5 nanosec
104 }
105}
106
107void setup() {
108 Serial.begin(115200);
109 delay(500);
110
111 Serial.println("\n\njust bef init part");
112
113
114 k_init(2, 2, 0); // 2 task, 2 semaphores, 0 messaegQueues */
115
118
119 isrSyncSem = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
120 timedSem = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
121
122 pinMode(2, INPUT_PULLUP); // for isr
123
124// Select with or without debounce
125 attachInterrupt(digitalPinToInterrupt(2), myISR_No_Debounce, FALLING); // install ISR
126 //attachInterrupt(digitalPinToInterrupt(2), myISR_Debounce, FALLING); // install ISR
127
128 Serial.println("justr bef start");
129 lastRun = k_millis();
130 k_start(); /* start krnl timer speed 1 milliseconds*/
131
132 Serial.println("If you see this then krnl didnt start :-( ");
133}
134
135void loop() {}
#define STK
void task2()
void task1()
#define debounceTime
Definition k08isrsem.ino:29
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
volatile int isrCount
Definition ka01isr.ino:58
struct k_t * timedSem
Definition ka01isr.ino:55
char stkTask2[150]
Definition ka01isr.ino:48
void myISR_Debounce()
Definition ka02isr.ino:65
void setup()
Definition ka02isr.ino:107
unsigned long lastRun
Definition ka02isr.ino:62
void myISR_No_Debounce()
Definition ka02isr.ino:74
void task2()
Definition ka02isr.ino:95
void task1()
Definition ka02isr.ino:80
void loop()
Definition ka02isr.ino:135
unsigned long k_millis(void)
return no of millisec sincs start NB no leap seconds - its clean
Definition krnl.c:1247
unsigned long ki_millis(void)
returns no msec since start - no DI/EI lock Returns nr of milliseconds since krnl was started by k_st...
Definition krnl.c:1240
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