krnl 1
Loading...
Searching...
No Matches
k08isrsem.ino
Go to the documentation of this file.
1//220216
2
3/* critical region - by semaphores - aka mutex
4 * Signal from ISR
5 *
6 * Work on uno and mega :-)
7 * JDN
8 * */
9
10#include <krnl.h>
11
12#define STK 150
13
14#define TASKPRIO 10
15
16
17struct k_t * pTask1;
18
19struct k_t *mutSem, *syncSem;
20
22
23volatile int t2Missed = 0, t2Hit = 0;
24
25
26volatile int ISRoverflow = 0;
27
28
29#define debounceTime 200
30unsigned long lastISR = 0;
31
32#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
33ISR(INT4_vect, ISR_NAKED) // digital pin 2 onmega
34#endif
35
36//UNO set interrupt on pin 2
37#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
38ISR(INT0_vect, ISR_NAKED) // digital pin 2 on uno
39#endif
40{
41 PUSHREGS();
42
43 if (!k_running)
44 goto exitt ;
45
46 // comment out down to endofdebounce if you do not like Sw debounce
48 goto exitt;
49 }
50
52
53 // endofdebounce
54
55 if (-1 == ki_signal(syncSem))
57
59
60 exitt:
61 POPREGS();
63}
64
65
66/*
67 * sw debounce
68 * #define debounceTime 200
69 * unsigned long lastISR=0;
70 *
71 * ...
72 * PUSHREGS();
73 * if (debounceTime < (k_millis_counter - lastISR)) {
74 * lastISR+=debounceTime;
75 * ISR code
76 * }
77 * POPREGS();
78 * RETI();
79 */
80
81void task1()
82{
83 int i = 0;
84 int miss = 0;
85 int clp, sumclp = 0;
86 while (1) {
87
88 if (0 > k_wait2(syncSem, 1000, &clp)) { // or k_wait(syncSem,1000) with no clip info
89
90 //if (-1 == k_wait(syncSem, 1000)) {
91 miss++;
92 Serial.print("Timeout "); Serial.print(miss); Serial.print(" "); Serial.println(ISRoverflow);
93 }
94 else {
95 i++;
96 miss = 0;
97 Serial.print("get kick no "); Serial.print(i); Serial.print(" "); Serial.println(ISRoverflow);
98 }
99 sumclp += clp;
100 Serial.println("lost msg "); Serial.println(sumclp);
101 }
102}
103
104
105char a[STK];
106
107
108void setup() {
109 // for debugging - only on uno eq- If Mega etc use PORTA(which is pn 22,23,...)
110 // see http://kom.aau.dk/~jdn/edu/doc/arduino/mega.png
111
112 Serial.begin(115200);
113 delay(500);
114
115 Serial.println("\n\njust bef init part");
116
117
118 k_init(1, 1, 0); // 2 task, 1 semaphores, 0 messaegQueues */
119
120pTask1 = k_crt_task(task1, 15, a, STK);
121
122syncSem = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
123
124
125pinMode(2, INPUT_PULLUP); // on uno - - a button to ground (or wire) every time it goes low vupti an interrupt
126
127// ABOUT ISR
128// UNO/LENARDO pp 54 https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf p 54
129//MEGA 2560 pp 110 https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf
130
131__asm__ volatile ("cli"); // disable interrupt
132
133#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
134EICRB |= (1 << ISC41); // B00000010; // for mega on pin 2
135EIMSK |= (1 << INT4); //B00010000; // enable INT 4 for mega
136
137Serial.println(EICRB, HEX);
138Serial.println(EIMSK, HEX);
139#endif
140
141//UNO set interrupt on pin 2
142#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
143EICRA |= (1 << ISC01); // UNON UNO .,. trigger INT0 on falling edge
144EIMSK |= (1 << INT0); // enable external intr
145#endif
146
147__asm__ volatile ("sei"); // enable interrupt
148
149k_start(); /* start krnl timer speed 1 milliseconds*/
150
151Serial.println("If you see this then krnl didnt start :-( ");
152}
153
154void loop() {}
#define STK
volatile int i
void task1()
RETI()
char a[150]
#define debounceTime
Definition k08isrsem.ino:29
void setup()
struct k_t * mutSem
Definition k08isrsem.ino:19
volatile int ISRoverflow
Definition k08isrsem.ino:26
struct k_t * timedSem1
Definition k08isrsem.ino:21
volatile int t2Missed
Definition k08isrsem.ino:23
struct k_t * timedSem2
Definition k08isrsem.ino:21
volatile int t2Hit
Definition k08isrsem.ino:23
struct k_t * syncSem
Definition k08isrsem.ino:19
K_CHG_STAK()
struct k_t * pTask1
Definition k08isrsem.ino:17
unsigned long lastISR
Definition k08isrsem.ino:30
void task1()
Definition k08isrsem.ino:81
void loop()
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_wait2(struct k_t *sem, int timeout, int *nrClip)
wait with add info .ยด- nr of in max limit from signals since last time(saturation)
Definition krnl.c:691
volatile char k_running
Definition krnl.c:156
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
ISR(INT0_vect, ISR_NAKED)
Definition isem.ino:47
unsigned long k_millis_counter
Definition krnl.c:161
PUSHREGS()
Definition krnl.h:323