Page 414 - Programming Microcontrollers in C
P. 414

Delay Routine    399

                       /* save interrupt status */
                       asm(“ mfcr R1,PSR\n lrw R2,save\n stw R1,(R2,0)\n”);
                       /* disable all interrupts */
                       Disable_Interrupts();
                       Disable_Fast_Interrupts();

                       /* request specific semaphore */
                       if(0<=r && r<Number_of_semaphores&&semaphore_status[r]&&r!=’a’)
                          return Minus_one;       /* it is not available */
                       else
                       {
                          semaphore[r]=TRUE;
                          /* reenable interrupts */
                          asm(“ lrw r2,save\n ldw R1,(r2,0)\n mtcr R1,PSR\n”);
                          return r;              /* return semaphore number */
                       }
                       for(i=0;(i<Number_of_semaphores) && (semaphore[i]!=0);i++)
                          ; /* find an unused semaphore */
                       if(i>=Number_of_semaphores)
                       {
                          /* reenable interrupts */
                          asm(“ lrw r2,save\n ldw R1,(r2,0)\n mtcr R1,PSR\n”);
                          return Minus_one;  /* no semaphore available */
                       }
                       else
                       {
                          semaphore[i]=TRUE;  /* mark semaphore as used */
                          /* reenable interrupts */
                          asm(“ lrw r2,save\n ldw R1,(r2,0)\n mtcr R1,PSR\n”);
                          return i;             /* return semaphore number */
                       }
                   }

                   void release_semaphore(int i)
                   {
                       semaphore[i]=FALSE;
                   }

                   int semaphore_status(int i)
                   {
                       return semaphore[i];
                   }

                   void wait_for_semaphore(int i)
                   {
   409   410   411   412   413   414   415   416   417   418   419