krnl 1
Loading...
Searching...
No Matches
msgtstisrsimplenoglitch.ino
Go to the documentation of this file.
1
2#include <krnl.h>
3
4// External triggered ISR
5// An Interrupt Service Routine is attached to pin 2
6// So when pin2 is drived to ground (by a wire) an interrupt is generated.
7// The ISR increment a counter and send it to a message Q
8// naming ki_send .... "i" indicates it can be used in an ISR and demand interrupt to be disabled prio to call
9// and that no task shift takes place in the call
10// demonstrates ISR with message Q and preemption(task shift) in the ISR
11// NB Take a look on the ISR. For 1280 and 2560 it is INT4 but for 168,328,.. it's INTO
12// It is taken care by a compile flag
13
14// It handles glotch (prel) with a requirement of at lest 10 msec between to interrupts)
15// (c) beerware license JDN 2013
16
17struct k_t * tSm1, *tSm2;
18struct k_t * p_t1, *p_t2;
19
21char mar[10*2];
22char mar2[10*2];
23
24#define STK_SIZE 200
25
26char s1[STK_SIZE]; // stak for t1 ... and t2
28
29volatile int icnt=0;
30
31volatile unsigned long nowISR=0,lastISR=0;
32
33
34void doBlink(void) {
35 static char flag = 0;
36 flag = !flag;
37 digitalWrite(13,flag);
38}
39
40void t1(void) {
41 int i;
42 while (1) {
43 delay(100);
44 if (0 <= k_receive(pMsg2,&i,-1,NULL) ) {
45 doBlink();
46 }
47 }
48}
49
50void t2(void) {
51 int i;
52 i = 0;
53 while (1) {
54 if (0 == k_receive(pMsg,&i,0,NULL) ) {
55 Serial.println(i);
56 k_send(pMsg2,&i);
57 }
58 else
59 Serial.println("-1");
60 }
61}
62
63#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__)
64ISR(INT4_vect,ISR_NAKED) {
65#else
66ISR(INT0_vect, ISR_NAKED) {
67#endif
68 // no local vars ?!? ! I think
69 PUSHREGS();
70 if (!k_running)
71 goto exitt ;
72
73 nowISR = millis();
74 if (10 < (nowISR - lastISR)) {
76 icnt++;
77 ki_send(pMsg,(void *)&icnt);
78
79 K_CHG_STAK();
80 }
81exitt:
82
83 POPREGS();
84 RETI();
85}
86
88{
89 DI();
90 pinMode(2,INPUT); // set som input
91 digitalWrite(2,HIGH); // enable pullup resistor
92
93#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__)
94 // 1280/2560 mega pin2 intr:4, pin5 intr:5
95 EIMSK |= (1 << INT4); // enable external intr
96 EICRB |= (1 << ISC41); // trigger INT4 on falling edge
97#else
98 EIMSK |= (1 << INT0); // enable external intr
99 EICRA |= (1 << ISC01); // trigger INT0 on falling edge
100#endif
101
102 EI();
103}
104
105void setup() {
106
107 Serial.begin(9600);
108
109 k_init(2,5,2); // from now you can crt task,sem etc
110
111 tSm1 = k_crt_sem(0,10); //
112 tSm2 = k_crt_sem(0,10); //
113 p_t1 = k_crt_task(t1, 10, s1, STK_SIZE);
114 p_t2 = k_crt_task(t2, 9, s2, STK_SIZE);
115
116 pMsg = k_crt_send_Q(10,2,mar);
117 pMsg2 = k_crt_send_Q(10,2,mar2);
118 pinMode(13,OUTPUT);
119 Serial.print("start ");
120 Serial.println(KRNL_VRS);
121 delay(2000);
122
123 installISR2();
124 Serial.println("bef gogo");
125
126 k_start(10); // now we are runnning with timer 10 msev
127 Serial.println("shit - should not come here");
128
129 // main will not come back and will sleep rest of life
130}
131
132void loop(void) {/* just for compilation - will never be called*/
133}
134
135/* QED :-) */
136
137
138
volatile int i
unsigned char s2[110]
Definition k03asleep.ino:25
unsigned char s1[110]
Definition k03asleep.ino:25
unsigned long lastISR
Definition k08isrsem.ino:30
char k_receive(struct k_msg_t *pB, void *el, int timeout, int *lost_msg)
Definition krnl.c:991
volatile char k_running
Definition krnl.c:156
char ki_send(struct k_msg_t *pB, void *el)
Definition krnl.c:908
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
char k_send(struct k_msg_t *pB, void *el)
Definition krnl.c:944
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
struct k_msg_t * k_crt_send_Q(int nr_el, int el_size, void *pBuf)
Definition krnl.c:841
int k_start()
Definition krnl.c:1149
#define DI()
Definition krnl.h:478
#define EI()
Definition krnl.h:479
#define RETI()
Definition krnl.h:480
#define KRNL_VRS
Definition krnl.h:2
#define K_CHG_STAK()
Definition krnl.h:488
#define STK_SIZE
Definition isem.ino:17
struct k_t * p_t1
Definition isem.ino:15
volatile int icnt
Definition isem.ino:22
struct k_t * tSm1
Definition msg1.ino:15
struct k_msg_t * pMsg
Definition msg1.ino:18
struct k_msg_t * pMsg2
Definition msg1.ino:18
struct k_t * tSm2
Definition msg1.ino:15
char mar[10 *2]
Definition msg1.ino:19
char mar2[10 *2]
Definition msg1.ino:20
struct k_t * p_t2
Definition msg1.ino:16
struct k_t * t1
Definition krnlgen.ino:3
struct k_t * t2
Definition krnlgen.ino:3
void loop(void)
void doBlink(void)
volatile unsigned long nowISR
void t2(void)
void installISR2()
void t1(void)
ISR(INT0_vect, ISR_NAKED)
PUSHREGS()
Definition krnl.h:323