/* * uLipeQueueFlush() */ OsStatus_t uLipeQueueFlush(OsHandler_t h) { uint32_t sReg; QueuePtr_t q = (QueuePtr_t)h; //check parameters: if(h == 0) { return(kInvalidParam); } //So flush queue: OS_CRITICAL_IN(); q->queueBack = 0; q->queueFront = 0; q->usedSlots = 0; //Update for all pending tasks: QueueRemoveLoop(h); QueueInsertLoop(h); //Queue flushed: OS_CRITICAL_OUT(); //schedule a new task (if needed): uLipeKernelTaskYield(); return(kStatusOk); }
/* * uLipeQueueRemove() */ void *uLipeQueueRemove(OsHandler_t h, uint8_t opt, uint16_t timeout, OsStatus_t *err) { QueuePtr_t q = (QueuePtr_t)h; uint32_t sReg = 0; void *ptr = NULL; //check arguments: if(q == 0) { if(err != NULL )*err = kInvalidParam ; return(NULL); } //Arguments valid, then proceed: OS_CRITICAL_IN(); //Check queue status first: if(q->usedSlots == 0) { OS_CRITICAL_OUT(); //Queue full, check options: switch(opt) { case OS_Q_BLOCK_EMPTY: { //task will block so: OS_CRITICAL_IN(); uLipePrioClr(currentTask->taskPrio, &taskPrioList); //prepare task to wait currentTask->taskStatus |= (1 << kTaskPendQueue); if(timeout != 0) { currentTask->taskStatus |= (1 << kTaskPendDelay); currentTask->delayTime = timeout; uLipePrioSet(currentTask->taskPrio, &timerPendingList.list[timerPendingList.activeList]); } //Adds task to wait list: currentTask->queueBmp = &q->queueInsertWait; uLipePrioSet(currentTask->taskPrio, &q->queueInsertWait); OS_CRITICAL_OUT(); //So check for a context switch: uLipeKernelTaskYield(); if(err != NULL )*err = kQueueEmpty; return(ptr); } break; case OS_Q_NON_BLOCK: { if(q->usedSlots != 0) break; else { OS_CRITICAL_OUT(); if(err != NULL )*err = kQueueEmpty; return(ptr); } } break; default: { //All other cases, only return: if(err != NULL )*err = kQueueEmpty; return(ptr); } break; } } //queue holds data, so remove it: ptr = (void *) q->queueBase[q->queueBack]; q->queueBack++; //queue bevahes as circular FIFO fashion if(q->queueBack > (q->numSlots - 1)) { q->queueBack = 0; } //Update the number of used slots: q->usedSlots--; //Update tasks wich pend this queue: QueueRemoveLoop(h); OS_CRITICAL_OUT(); //Check for context switching: uLipeKernelTaskYield(); if(err != NULL )*err = kStatusOk; //All gone well: return(ptr); }
/* * uLipeQueueRemove() */ void *uLipeQueueRemove(OsHandler_t h, uint8_t opt, uint16_t timeout, OsStatus_t *err) { uint32_t sReg = 0; QueuePtr_t q = (QueuePtr_t)h; void *ptr = NULL; //check arguments: if(h == NULL) { return(kInvalidParam); } //Arguments valid, then proceed: OS_CRITICAL_IN(); //Check queue status first: if(q->usedSlots == 0) { OS_CRITICAL_OUT(); //Queue full, check options: switch(opt) { case OS_Q_BLOCK_EMPTY: { //task will block so: OS_CRITICAL_IN(); //suspend current task: uLipePrioClr(currentTask->taskPrio, &taskPrioList); currentTask->taskStatus = (1 << kTaskPendQueue) | (1 << kTaskPendDelay); currentTask->delayTime = timeout; #if OS_USE_DEPRECATED == 1 //Assert this task on queue wait list: q->tasksPending[currentTask->taskPrio] = OS_Q_PEND_EMPTY; #else //Adds task to wait list: uLipePrioSet(currentTask->taskPrio, &q->queueInsertWait); #endif OS_CRITICAL_OUT(); //So check for a context switch: uLipeKernelTaskYield(); *err = kQueueEmpty; return(ptr); } break; default: { //All other cases, only return: *err = kQueueEmpty; return(ptr); } break; } } //queue holds data, so remove it: ptr = (void *) q->queueBase[q->queueBack]; q->queueBack++; //queue bevahes as circular FIFO fashion if(q->queueBack > (q->numSlots - 1)) { q->queueBack = 0; } //Update the number of used slots: q->usedSlots--; //Update tasks wich pend this queue: QueueRemoveLoop(h); OS_CRITICAL_OUT(); //Check for context switching: uLipeKernelTaskYield(); *err = kStatusOk; //All gone well: return(ptr); }