Advertisement
Guest User

2skärmar

a guest
Aug 31st, 2015
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.85 KB | None | 0 0
  1. exception receive_wait(mailbox* mBox, void* pData){
  2.   volatile unsigned int first_execution = 1;
  3.   isr_off();
  4.   SaveContext();
  5.   if(first_execution == 1){
  6.     first_execution = 0;
  7.     if(mBox->nMessages > 0){
  8.       memcpy(pData, mBox->pHead->pNext, sizeof(pData));
  9.       if(mBox->nBlockedMsg > 0 && mBox->pHead->pNext->pBlock != 0){
  10.         insert_Deadline_First(Ready_List, extract(mBox->pHead->pNext->pBlock));
  11.         mBox->nBlockedMsg--;
  12.       }
  13.       delete_msg(mBox->pHead->pNext);
  14.       mBox->nMessages--;
  15.     }
  16.     else{
  17.       msg *pMsg = allocate_msg();
  18.       if(pMsg == NULL){
  19.         return FAIL;
  20.       }
  21.       pMsg->pBlock = Ready_List->pHead->pNext;
  22.       Ready_List->pHead->pNext->pMessage = pMsg;
  23.       insert_message(mBox, pMsg);
  24.       insert_DeadLine_First(Waiting_List, extract_First(Ready_List));
  25.       mBox->nMessages--;
  26.     }
  27.     updateRunning();
  28.     LoadContext();
  29.   }
  30.   else if(Running->DeadLine <= ticks()){
  31.     isr_off();
  32.     if(Ready_List->pHead->pNext->pMessage->Status != -1){
  33.       mBox->nMessages++;
  34.     }
  35.     remove_message(mBox, Ready_List->pHead->pNext->pMessage);
  36.     isr_on();
  37.     return DEADLINE_REACHED;
  38.   }
  39.   else{
  40.     return OK;
  41.   }
  42. }
  43.  
  44.  
  45. int receive_no_wait(mailbox* mBox, void* pData){
  46.   volatile unsigned int first_execution = TRUE;
  47.   int status = FAIL;
  48.   isr_off();                            //Disable interrupt
  49.   SaveContext();
  50.   if(first_execution == 1){
  51.     first_execution = 0;
  52.     if(mBox->nMessages > 0){
  53.       memcpy(pData, mBox->pTail->pPrevious, sizeof(pData));
  54.       status = OK;
  55.       if(mBox->nBlockedMsg > 0 && mBox->pHead->pNext->pBlock != 0){
  56.         insert_Deadline_First(Ready_List, extract(mBox->pHead->pNext->pBlock));
  57.         mBox->nBlockedMsg--;
  58.       }
  59.       delete_msg(mBox->pHead->pNext);
  60.       mBox->nMessages--;
  61.     }
  62.     LoadContext();
  63.   }
  64.     return status;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement