krnl 1
Loading...
Searching...
No Matches
msg1.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// (c) beerware license JDN 2013
14
15struct k_t * tSm1, *tSm2;
16struct k_t * p_t1, *p_t2;
17
19char mar[10*2];
20char mar2[10*2];
21
22#define STK_SIZE 200
23
24char s1[STK_SIZE]; // stak for t1 ... and t2
26
27volatile int icnt=0;
28
29
30void doBlink(void) {
31 static char flag = 0;
32 flag != flag;
33 digitalWrite(13,flag);
34}
35
36void t1(void) {
37 int i;
38 while (1) {
39 delay(100);
40 if (0 <= k_receive(pMsg2,&i,-1,NULL) ) {
41 doBlink();
42 }
43 }
44}
45
46void t2(void) {
47 int i;
48 i = 0;
49 while (1) {
50 if (0 <= k_receive(pMsg,&i,10,NULL) ) {
51 Serial.println(i);
52 k_send(pMsg2,&i);
53 }
54 else {
55 Serial.println("-1");
56 }
57 }
58}
59
60#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__)
61ISR(INT4_vect,ISR_NAKED) {
62#else
63ISR(INT0_vect, ISR_NAKED) {
64#endif
65 // no local vars ?!? ! I think
66 PUSHREGS();
67 if (!k_running)
68 goto exitt ;
69
70 icnt++;
71 ki_send(pMsg,(void *)&icnt);
72
73 K_CHG_STAK();
74
75exitt:
76
77 POPREGS();
78 RETI();
79}
80
82{
83 DI();
84 pinMode(2,INPUT); // set som input
85 digitalWrite(2,HIGH); // enable pullup resistor
86
87#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__)
88 // 1280/2560 mega pin2 intr:4, pin5 intr:5
89 EIMSK |= (1 << INT4); // enable external intr
90 EICRB |= (1 << ISC41); // trigger INT4 on falling edge
91#else
92 EIMSK |= (1 << INT0); // enable external intr
93 EICRA |= (1 << ISC01); // trigger INT0 on falling edge
94#endif
95
96 EI();
97}
98
99void setup() {
100
101 Serial.begin(9600);
102
103 k_init(2,5,2); // from now you can crt task,sem etc
104
105 tSm1 = k_crt_sem(0,10); //
106 tSm2 = k_crt_sem(0,10); //
107 p_t1 = k_crt_task(t1, 10, s1, STK_SIZE);
108 p_t2 = k_crt_task(t2, 9, s2, STK_SIZE);
109
110 pMsg = k_crt_send_Q(10,2,mar);
111 pMsg2 = k_crt_send_Q(10,2,mar2);
112 pinMode(13,OUTPUT);
113 Serial.print("start ");
114 Serial.println(KRNL_VRS);
115 delay(2000);
116
117 installISR2();
118 Serial.println("bef gogo");
119
120 k_start(10); // now we are runnning with timer 10 msev
121 Serial.println("shit - should not come here");
122
123 // main will not come back and will sleep rest of life
124}
125
126void loop(void) {/* just for compilation - will never be called*/
127}
128
129/* QED :-) */
130
131
132
volatile int i
unsigned char s2[110]
Definition k03asleep.ino:25
unsigned char s1[110]
Definition k03asleep.ino:25
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
void loop(void)
Definition msg1.ino:126
struct k_msg_t * pMsg
Definition msg1.ino:18
struct k_msg_t * pMsg2
Definition msg1.ino:18
void doBlink(void)
Definition msg1.ino:30
void setup()
Definition msg1.ino:99
struct k_t * tSm2
Definition msg1.ino:15
void t2(void)
Definition msg1.ino:46
char mar[10 *2]
Definition msg1.ino:19
char mar2[10 *2]
Definition msg1.ino:20
void installISR2()
Definition msg1.ino:81
void t1(void)
Definition msg1.ino:36
struct k_t * p_t2
Definition msg1.ino:16
ISR(INT0_vect, ISR_NAKED)
Definition msg1.ino:63
struct k_t * t1
Definition krnlgen.ino:3
struct k_t * t2
Definition krnlgen.ino:3
PUSHREGS()
Definition krnl.h:323