コード例 #1
0
ファイル: OsQueue.c プロジェクト: uLipe/uLipeRtosV4
/*
 * 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);

}
コード例 #2
0
ファイル: OsQueue.c プロジェクト: uLipe/uLipeRtosV4
/*
 * 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);
}
コード例 #3
0
ファイル: OsQueue.c プロジェクト: andrecurvello/uLipeRtosV4
/*
 * 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);
}