Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- exception receive_wait(mailbox* mBox, void* pData){
- volatile unsigned int first_execution = 1;
- isr_off();
- SaveContext();
- if(first_execution == 1){
- first_execution = 0;
- if(mBox->nMessages > 0){
- memcpy(pData, mBox->pHead->pNext, sizeof(pData));
- if(mBox->nBlockedMsg > 0 && mBox->pHead->pNext->pBlock != 0){
- insert_Deadline_First(Ready_List, extract(mBox->pHead->pNext->pBlock));
- mBox->nBlockedMsg--;
- }
- delete_msg(mBox->pHead->pNext);
- mBox->nMessages--;
- }
- else{
- msg *pMsg = allocate_msg();
- if(pMsg == NULL){
- return FAIL;
- }
- pMsg->pBlock = Ready_List->pHead->pNext;
- Ready_List->pHead->pNext->pMessage = pMsg;
- insert_message(mBox, pMsg);
- insert_DeadLine_First(Waiting_List, extract_First(Ready_List));
- mBox->nMessages--;
- }
- updateRunning();
- LoadContext();
- }
- else if(Running->DeadLine <= ticks()){
- isr_off();
- if(Ready_List->pHead->pNext->pMessage->Status != -1){
- mBox->nMessages++;
- }
- remove_message(mBox, Ready_List->pHead->pNext->pMessage);
- isr_on();
- return DEADLINE_REACHED;
- }
- else{
- return OK;
- }
- }
- int receive_no_wait(mailbox* mBox, void* pData){
- volatile unsigned int first_execution = TRUE;
- int status = FAIL;
- isr_off(); //Disable interrupt
- SaveContext();
- if(first_execution == 1){
- first_execution = 0;
- if(mBox->nMessages > 0){
- memcpy(pData, mBox->pTail->pPrevious, sizeof(pData));
- status = OK;
- if(mBox->nBlockedMsg > 0 && mBox->pHead->pNext->pBlock != 0){
- insert_Deadline_First(Ready_List, extract(mBox->pHead->pNext->pBlock));
- mBox->nBlockedMsg--;
- }
- delete_msg(mBox->pHead->pNext);
- mBox->nMessages--;
- }
- LoadContext();
- }
- return status;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement