Semaforen in ETX

  • #include <stdio.h>
    #include <setjmp.h>
    #include <io6811.h>
    #include <etx.h>
    #include <lcd.h>
    #include <keyb.h>
    /* =================== Processen ======================== */
    SEMAFOOR *sid;                /* semafoor nummer */
    PROCES   *proc1id, *proc2id, *proc3id;
    int curpos = 0; /* huidige positie cursor */
    monitor void toongetal(int getal, int pos)
    {
       static char buf[10];
       char *p;
       if (curpos < pos)
       {
          while (curpos < pos)
          {
           lcd_curs_shr();
           curpos++;
          }
       }
       if (curpos > pos)
       {
          while (curpos > pos)
          {
             lcd_curs_shl();
             curpos--;
          }
       }
       sprintf(buf,&quot;%d &quot;,getal);
       p = buf;
       while (*p != 0)
       {
          lcd_data( *p++ );
          curpos++;
       }
    }
    /* dit is een proces */
    void proc1(void)
    {
       T_MSG    msg,i;
       enable_interrupt();
       wait(sid);        /* wacht op semafoor */
       i = 0;
       while (1 == 1)
       {
          etstart(60,0x124);
          msg = receive();
          toongetal(i, 0);
          i++;
       }
    }
    void proc2(void)
    {
       int     i;
       T_MSG    msg;
       enable_interrupt();
       /* initialiseer lcd en laat dan proc1 verder lopen */
       lcd_init();
       signal(sid);
       i = 0;
       while (1 == 1)
       {
          etstart(50,0x123);
          msg = receive();
          toongetal(i, 8);
          i++;
       }
    }
    void proc3(void)
    {
       int     teken, vorigteken;
       T_MSG    msg;
       enable_interrupt();
       /* initialiseer lcd en laat dan proc1 verder lopen */
       keyb_init();
       while (1 == 1)
       {
        etstart(10,0x125);
        msg = receive();
        teken = keyb_lees();
        if (teken != 0 &amp;&amp; vorigteken == 0)
        {
           toongetal(teken, 12);
           if (teken == &apos;0&apos;)
           {
              lcd_disp_shl();
           }
             else if (teken == &apos;4&apos;)
           {
              lcd_disp_shr();
           }
           else if (teken == &apos;f&apos;)
           {
              teken = teken;
           }
        }
        vorigteken = teken;
    }
    }
    /*
    *-----------------------------------------------------------
    * main - start van het programma
    *-----------------------------------------------------------
    */
    void main(void)
    {
       disable_interrupt();
       etx_init();
       /* nu loopt de task switcher */
       sid = screate(0);
       proc2id = pcreate(proc2,2,"proc 2");
       proc1id = pcreate(proc1,2,"proc 1");
       proc3id = pcreate(proc3,1,"proc 3");
       while (numproc > 1)
       {
          pause();
       }
    }