krnl 1
Loading...
Searching...
No Matches
rt-arduino-isrsync.ino
Go to the documentation of this file.
1/* critical region - by semaphores - aka mutex
2 * Signal from ISR
3 *
4 * Work on uno and mega :-)
5 JDN
6 * */
7
8#include <krnl.h>
9
10#define STK 150
11
12#define TASKPRIO 10
13
14
15struct k_t * pTask1, *pTask2;
16
17struct k_t *mutSem, *syncSem;
18
20
21volatile int t2Missed = 0, t2Hit = 0;
22
23
24volatile int ISRoverflow = 0;
25
26#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
27ISR(INT4_vect, ISR_NAKED) { // digital pin 2 onmega
28#endif
29
30 //UNO set interrupt on pin 2
31#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
32 ISR(INT0_vect, ISR_NAKED) { // digital pin 2 on uno
33#endif
34
36 if (!k_running)
37 goto exitt ;
38 // maybe room for sw debounce - use millis
39 if (-1 == ki_signal(syncSem))
42
43exitt:
44 POPREGS();
46 }
47
48
49 void task1()
50 {
51 int i = 0;
52 int miss = 0;
53 while (1) {
54
55 if (-1 == k_wait(syncSem, 1000)) {
56 miss++;
57 Serial.print("timeout "); Serial.print(miss); Serial.print(" "); Serial.println(ISRoverflow);
58 }
59 else {
60 i++;
61 Serial.print("get kick no "); Serial.print(i); Serial.print(" "); Serial.println(ISRoverflow);
62 }
63 }
64 }
65
66
67 void task2()
68 {
69 int i = 0;
70 int miss = 0;
71 while (1) {
72
73 Serial.println("timeout222 ");
74 k_sleep(100);
75 }
76 }
77
78
79
80
81 void setup() {
82 // for debugging - only on uno eq- If Mega etc use PORTA(which is pn 22,23,...)
83 // see http://kom.aau.dk/~jdn/edu/doc/arduino/mega.png
84
85 Serial.begin(115200);
86 delay(2000);
87
88 Serial.println("just bef init part");
89
90 k_init(2, 1, 0); // 2 task, 1 semaphores, 0 messaegQueues */
91
92 pTask1 = k_crt_task(task1, 15, STK);
93 pTask2 = k_crt_task(task2, 15, STK);
94
95 syncSem = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
96
97 Serial.println("just bef k_start");
98
99
100 pinMode(2, INPUT_PULLUP);
101
102 // ABOUT ISR
103 // UNO/LENARDO pp 54 https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf p 54
104 //MEGA 2560 pp 110 https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf
105
106 __asm__ volatile ("cli"); // disable interrupt
107
108#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
109 EICRB |= (1 << ISC41); // B00000010; // for mega on pin 2
110 EIMSK |= (1 << INT4); //B00010000; // enable INT 4 for mega
111
112 Serial.println(EICRB, HEX);
113 Serial.println(EIMSK, HEX);
114#endif
115
116 //UNO set interrupt on pin 2
117#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
118 EICRA |= (1 << ISC01); // UNON UNO .,. trigger INT0 on falling edge
119 EIMSK |= (1 << INT0); // enable external intr
120#endif
121
122 __asm__ volatile ("sei"); // enable interrupt
123
124 k_start(1); /* start krnl timer speed 1 milliseconds*/
125
126 Serial.println("If you see this then krnl didnt start :-( ");
127 }
128
129 void loop() {}
#define STK
volatile int i
void task2()
void task1()
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
struct k_t * pTask1
Definition k08isrsem.ino:17
struct k_t * pTask2
Definition k09msgq.ino:11
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_sleep(int time)
let task sleep for a number of milliseconds
Definition krnl.c:445
volatile char k_running
Definition krnl.c:156
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
ISR(INT0_vect, ISR_NAKED)
Definition isem.ino:47
RETI()
void setup()
PUSHREGS()
K_CHG_STAK()
void task2()
void task1()
void loop()
Definition krnl.h:323