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)
{