 
#include <krnl.h>

struct k_t * tSm1, *tSm2; 
struct k_t * p_t1, *p_t2; 

struct k_msg_t *pMsg;
char mar[10*2];

#define STK_SIZE 200

char s1[STK_SIZE]; // stak for t1 ... and t2
char s2[STK_SIZE];
 
volatile int icnt=0;


void t1(void) {
 
  while (1) {
     k_signal(tSm2);
     delay(1500);
 }
}

void t2(void) {
  int i;
  i = 0;
  pinMode(13,OUTPUT);
  k_set_sem_timer(tSm2,50);
   while (1) {
      if (0 == k_receive(pMsg,&i,10))
      {
        Serial.print("pong");
        Serial.println(i);
      }
      else {
        Serial.println("no pong");
      }
   }
}

 ISR(INT0_vect, ISR_NAKED) {
 // no local vars ?!?  ! I think
   PUSHREGS();
  digitalWrite(13,LOW);
   if (!k_running)
   goto exitt;
   
    
   icnt++;   
   ki_send(pMsg,(void *)&icnt);
   K_CHG_STAK();
   exitt:

   POPREGS();
   reti();
 }
 
void setup() {

  Serial.begin(9600);
  
  k_init(); // from now you can crt task,sem etc
  
  tSm1 = k_crt_sem(0,10); // 
  tSm2 = k_crt_sem(0,10); // 
   
  p_t1 = k_crt_task(t1, 10, s1, STK_SIZE);
  p_t2 = k_crt_task(t2, 9, s2, STK_SIZE);
 
  // If you want to test bef start
  // Serial.print("\nfree ram: ");
  //  ii = freeRam();
  //  Serial.println(ii);
  DI();
  pinMode(2,INPUT);  // set som input
  digitalWrite(2,HIGH);  // enable pullup resistor
     
#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__)
  // 1280/2560 mega pin2 intr:4, pin5 intr:5
  EIMSK |= (1 << INT4);  // enable external intr
  EICRB |= (1 << ISC41); // trigger INT4 on falling edge
#else
  EIMSK |= (1 << INT0);  // enable external intr
  EICRA |= (1 << ISC01); // trigger INT0 on falling edge
#endif
  EI();

  pinMode(13,OUTPUT);
  digitalWrite(13,HIGH);
  pMsg = k_crt_send_Q(10,2,mar); 
 Serial.println("start");
 delay(2000);
  k_start(10); // now we are runnning   with timer 10 msev
 Serial.println("oev");

  // main will not come back and will sleep rest of life
}

void loop(void) {
  // just for compilation - will never be called
}

/* QED :-) */


