diff options
Diffstat (limited to 'samples/nanokernel/test/test_fifo/src/fifo.c')
-rw-r--r-- | samples/nanokernel/test/test_fifo/src/fifo.c | 713 |
1 files changed, 0 insertions, 713 deletions
diff --git a/samples/nanokernel/test/test_fifo/src/fifo.c b/samples/nanokernel/test/test_fifo/src/fifo.c deleted file mode 100644 index 21b409014..000000000 --- a/samples/nanokernel/test/test_fifo/src/fifo.c +++ /dev/null @@ -1,713 +0,0 @@ -/* - * Copyright (c) 2012-2014 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * @file - * @brief Test nanokernel FIFO APIs - * - * This module tests four basic scenarios with the usage of the following FIFO - * routines: - * - * nano_fiber_fifo_get, nano_fiber_fifo_put - * nano_task_fifo_get, nano_task_fifo_put - * nano_isr_fifo_get, nano_isr_fifo_put - * - * Scenario #1 - * Task enters items into a queue, starts the fiber and waits for a semaphore. - * Fiber extracts all items from the queue and enters some items back into - * the queue. Fiber gives the semaphore for task to continue. Once the control - * is returned back to task, task extracts all items from the queue. - - * Scenario #2 - * Task enters an item into queue2, starts a fiber and extract an item from - * queue1 once the item is there. The fiber will extract an item from queue2 - * once the item is there and and enter an item to queue1. The flow of control - * goes from task to fiber and so forth. - - * Scenario #3 - * Tests the ISR interfaces. Function testIsrFifoFromFiber gets an item from - * the fifo queue in ISR context. It then enters four items into the queue - * and finishes execution. Control is returned back to function - * testTaskFifoGetW which also finished it's execution and returned to main. - * Finally function testIsrFifoFromTask is run and it gets all data from - * the queue and puts and gets one last item to the queue. All these are run - * in ISR context. - * - * Scenario #4: - * Timeout scenarios with multiple FIFOs and fibers. - */ - -#include <zephyr.h> -#include <tc_util.h> -#include <misc/__assert.h> -#include <misc/util.h> -#include <irq_offload.h> - -#include <util_test_common.h> - -#ifndef FIBER_STACKSIZE -#define FIBER_STACKSIZE 2048 -#endif -#define NUM_FIFO_ELEMENT 4 -#define INVALID_DATA NULL - -#define TCERR1(count) TC_ERROR("Didn't get back correct FIFO, count %d\n", count) -#define TCERR2 TC_ERROR("Didn't get back correct FIFO\n") -#define TCERR3 TC_ERROR("The queue should be empty!\n") - -typedef struct { - struct nano_fifo *fifo_ptr; /* FIFO */ - void *data; /* pointer to data to add */ -} ISR_FIFO_INFO; - -char __stack fiberStack1[FIBER_STACKSIZE]; -char __stack fiberStack2[FIBER_STACKSIZE]; -char __stack fiberStack3[FIBER_STACKSIZE]; - -struct nano_fifo nanoFifoObj; -struct nano_fifo nanoFifoObj2; - -struct nano_sem nanoSemObj1; /* Used to block/wake-up fiber1 */ -struct nano_sem nanoSemObj2; /* Used to block/wake-up fiber2 */ -struct nano_sem nanoSemObj3; /* Used to block/wake-up fiber3 */ -struct nano_sem nanoSemObjTask; /* Used to block/wake-up task */ - -struct nano_timer timer; -void *timerData[1]; - -int myFifoData1[4]; -int myFifoData2[2]; -int myFifoData3[4]; -int myFifoData4[2]; - -void * const pMyFifoData1 = (void *)myFifoData1; -void * const pMyFifoData2 = (void *)myFifoData2; -void * const pMyFifoData3 = (void *)myFifoData3; -void * const pMyFifoData4 = (void *)myFifoData4; - -void * const pPutList1[NUM_FIFO_ELEMENT] = { - (void *)myFifoData1, - (void *)myFifoData2, - (void *)myFifoData3, - (void *)myFifoData4 - }; - -void * const pPutList2[NUM_FIFO_ELEMENT] = { - (void *)myFifoData4, - (void *)myFifoData3, - (void *)myFifoData2, - (void *)myFifoData1 - }; - -int retCode = TC_PASS; - -static ISR_FIFO_INFO isrFifoInfo = {&nanoFifoObj, NULL}; - -void fiber1(void); -void fiber2(void); -void fiber3(void); - -void initNanoObjects(void); -void testTaskFifoGetW(void); - -extern int test_fifo_timeout(void); - -/** - * - * @brief Add an item to a FIFO - * - * This routine is the ISR handler for _trigger_nano_isr_fifo_put(). It adds - * an item to the FIFO in the context of an ISR. - * - * @param parameter pointer to ISR handler parameter - * - * @return N/A - */ - -void isr_fifo_put(void *parameter) -{ - ISR_FIFO_INFO *pInfo = (ISR_FIFO_INFO *) parameter; - - nano_isr_fifo_put(pInfo->fifo_ptr, pInfo->data); -} - -static void _trigger_nano_isr_fifo_put(void) -{ - irq_offload(isr_fifo_put, &isrFifoInfo); -} - - -/** - * - * @brief Get an item from a FIFO - * - * This routine is the ISR handler for _trigger_nano_isr_fifo_get(). It gets - * an item from the FIFO in the context of an ISR. - * - * @param parameter pointer to ISR handler parameter - * - * @return N/A - */ - -void isr_fifo_get(void *parameter) -{ - ISR_FIFO_INFO *pInfo = (ISR_FIFO_INFO *) parameter; - - pInfo->data = nano_isr_fifo_get(pInfo->fifo_ptr, TICKS_NONE); -} - -static void _trigger_nano_isr_fifo_get(void) -{ - irq_offload(isr_fifo_get, &isrFifoInfo); -} - -/** - * - * @brief Entry point for the first fiber - * - * @return N/A - */ - -void fiber1(void) -{ - void *pData; /* pointer to FIFO object get from the queue */ - int count = 0; /* counter */ - - /* Wait for fiber1 to be activated. */ - nano_fiber_sem_take(&nanoSemObj1, TICKS_UNLIMITED); - - /* Wait for data to be added to <nanoFifoObj> by task */ - pData = nano_fiber_fifo_get(&nanoFifoObj, TICKS_UNLIMITED); - if (pData != pPutList1[0]) { - TC_ERROR("fiber1 (1) - expected 0x%x, got 0x%x\n", - pPutList1[0], pData); - retCode = TC_FAIL; - return; - } - - /* Wait for data to be added to <nanoFifoObj2> by fiber3 */ - pData = nano_fiber_fifo_get(&nanoFifoObj2, TICKS_UNLIMITED); - if (pData != pPutList2[0]) { - TC_ERROR("fiber1 (2) - expected 0x%x, got 0x%x\n", - pPutList2[0], pData); - retCode = TC_FAIL; - return; - } - - /* Wait for fiber1 to be reactivated */ - nano_fiber_sem_take(&nanoSemObj1, TICKS_UNLIMITED); - - TC_PRINT("Test Fiber FIFO Get\n\n"); - /* Get all FIFOs */ - while ((pData = nano_fiber_fifo_get(&nanoFifoObj, TICKS_NONE)) != NULL) { - TC_PRINT("FIBER FIFO Get: count = %d, ptr is %p\n", count, pData); - if ((count >= NUM_FIFO_ELEMENT) || (pData != pPutList1[count])) { - TCERR1(count); - retCode = TC_FAIL; - return; - } - count++; - } - - TC_END_RESULT(retCode); - PRINT_LINE; - - /* - * Entries in the FIFO queue have to be unique. - * Put data. - */ - TC_PRINT("Test Fiber FIFO Put\n"); - TC_PRINT("\nFIBER FIFO Put Order: "); - for (int i=0; i<NUM_FIFO_ELEMENT; i++) { - nano_fiber_fifo_put(&nanoFifoObj, pPutList2[i]); - TC_PRINT(" %p,", pPutList2[i]); - } - TC_PRINT("\n"); - PRINT_LINE; - - /* Give semaphore to allow the main task to run */ - nano_fiber_sem_give(&nanoSemObjTask); - -} /* fiber1 */ - - -/** - * - * @brief Test the nano_fiber_fifo_get(TICKS_UNLIMITED) interface - * - * This function tests the fifo put and get wait interfaces in a fiber. - * It gets data from nanoFifoObj2 queue and puts data to nanoFifoObj queue. - * - * @return N/A - */ - -void testFiberFifoGetW(void) -{ - void *pGetData; /* pointer to FIFO object get from the queue */ - void *pPutData; /* pointer to FIFO object to put to the queue */ - - TC_PRINT("Test Fiber FIFO Get Wait Interfaces\n\n"); - pGetData = nano_fiber_fifo_get(&nanoFifoObj2, TICKS_UNLIMITED); - TC_PRINT("FIBER FIFO Get from queue2: %p\n", pGetData); - /* Verify results */ - if (pGetData != pMyFifoData1) { - retCode = TC_FAIL; - TCERR2; - return; - } - - pPutData = pMyFifoData2; - TC_PRINT("FIBER FIFO Put to queue1: %p\n", pPutData); - nano_fiber_fifo_put(&nanoFifoObj, pPutData); - - pGetData = nano_fiber_fifo_get(&nanoFifoObj2, TICKS_UNLIMITED); - TC_PRINT("FIBER FIFO Get from queue2: %p\n", pGetData); - /* Verify results */ - if (pGetData != pMyFifoData3) { - retCode = TC_FAIL; - TCERR2; - return; - } - - pPutData = pMyFifoData4; - TC_PRINT("FIBER FIFO Put to queue1: %p\n", pPutData); - nano_fiber_fifo_put(&nanoFifoObj, pPutData); - - TC_END_RESULT(retCode); - -} /* testFiberFifoGetW */ - - -/** - * - * @brief Test ISR FIFO routines (triggered from fiber) - * - * This function tests the fifo put and get interfaces in the ISR context. - * It is invoked from a fiber. - * - * We use nanoFifoObj queue to put and get data. - * - * @return N/A - */ - -void testIsrFifoFromFiber(void) -{ - void *pGetData; /* pointer to FIFO object get from the queue */ - - TC_PRINT("Test ISR FIFO (invoked from Fiber)\n\n"); - - /* This is data pushed by function testFiberFifoGetW */ - _trigger_nano_isr_fifo_get(); - pGetData = isrFifoInfo.data; - - TC_PRINT("ISR FIFO Get from queue1: %p\n", pGetData); - if (isrFifoInfo.data != pMyFifoData4) { - retCode = TC_FAIL; - TCERR2; - return; - } - - /* Verify that the queue is empty */ - _trigger_nano_isr_fifo_get(); - pGetData = isrFifoInfo.data; - - if (pGetData != NULL) { - TC_PRINT("Get from queue1: %p\n", pGetData); - retCode = TC_FAIL; - TCERR3; - return; - } - - /* Put more item into queue */ - TC_PRINT("\nISR FIFO (running in fiber) Put Order:\n"); - for (int i=0; i<NUM_FIFO_ELEMENT; i++) { - isrFifoInfo.data = pPutList1[i]; - TC_PRINT(" %p,", pPutList1[i]); - _trigger_nano_isr_fifo_put(); - } - TC_PRINT("\n"); - - TC_END_RESULT(retCode); - -} /* testIsrFifoFromFiber */ - - -/** - * - * @brief Test ISR FIFO routines (triggered from task) - * - * This function tests the fifo put and get interfaces in the ISR context. - * It is invoked from a task. - * - * We use nanoFifoObj queue to put and get data. - * - * @return N/A - */ - -void testIsrFifoFromTask(void) -{ - void *pGetData; /* pointer to FIFO object get from the queue */ - void *pPutData; /* pointer to FIFO object put to queue */ - int count = 0; /* counter */ - - TC_PRINT("Test ISR FIFO (invoked from Task)\n\n"); - - /* This is data pushed by function testIsrFifoFromFiber - * Get all FIFOs - */ - _trigger_nano_isr_fifo_get(); - pGetData = isrFifoInfo.data; - - while (pGetData != NULL) { - TC_PRINT("Get from queue1: count = %d, ptr is %p\n", count, pGetData); - if ((count >= NUM_FIFO_ELEMENT) || (pGetData != pPutList1[count])) { - TCERR1(count); - retCode = TC_FAIL; - return; - } - - /* Get the next element */ - _trigger_nano_isr_fifo_get(); - pGetData = isrFifoInfo.data; - count++; - } /* while */ - - - /* Put data into queue and get it again */ - pPutData = pPutList2[3]; - - isrFifoInfo.data = pPutData; - _trigger_nano_isr_fifo_put(); - isrFifoInfo.data = NULL; /* force data to a new value */ - /* Get data from queue */ - _trigger_nano_isr_fifo_get(); - pGetData = isrFifoInfo.data; - /* Verify data */ - if (pGetData != pPutData) { - retCode = TC_FAIL; - TCERR2; - return; - } else { - TC_PRINT("\nTest ISR FIFO (invoked from Task) - put %p and get back %p\n", - pPutData, pGetData); - } - - TC_END_RESULT(retCode); -} /* testIsrFifoFromTask */ - -/** - * - * @brief Entry point for the second fiber - * - * @return N/A - */ - -void fiber2(void) -{ - void *pData; /* pointer to FIFO object from the queue */ - - /* Wait for fiber2 to be activated */ - - nano_fiber_sem_take(&nanoSemObj2, TICKS_UNLIMITED); - - /* Wait for data to be added to <nanoFifoObj> */ - pData = nano_fiber_fifo_get(&nanoFifoObj, TICKS_UNLIMITED); - if (pData != pPutList1[1]) { - TC_ERROR("fiber2 (1) - expected 0x%x, got 0x%x\n", - pPutList1[1], pData); - retCode = TC_FAIL; - return; - } - - /* Wait for data to be added to <nanoFifoObj2> by fiber3 */ - pData = nano_fiber_fifo_get(&nanoFifoObj2, TICKS_UNLIMITED); - if (pData != pPutList2[1]) { - TC_ERROR("fiber2 (2) - expected 0x%x, got 0x%x\n", - pPutList2[1], pData); - retCode = TC_FAIL; - return; - } - - /* Wait for fiber2 to be reactivated */ - nano_fiber_sem_take(&nanoSemObj2, TICKS_UNLIMITED); - - /* Fiber #2 has been reactivated by main task */ - for (int i = 0; i < 4; i++) { - pData = nano_fiber_fifo_get(&nanoFifoObj, TICKS_UNLIMITED); - if (pData != pPutList1[i]) { - TC_ERROR("fiber2 (3) - iteration %d expected 0x%x, got 0x%x\n", - i, pPutList1[i], pData); - retCode = TC_FAIL; - return; - } - } - - nano_fiber_sem_give(&nanoSemObjTask); /* Wake main task */ - /* Wait for fiber2 to be reactivated */ - nano_fiber_sem_take(&nanoSemObj2, TICKS_UNLIMITED); - - testFiberFifoGetW(); - PRINT_LINE; - testIsrFifoFromFiber(); - - TC_END_RESULT(retCode); -} /* fiber2 */ - -/** - * - * @brief Entry point for the third fiber - * - * @return N/A - */ - -void fiber3(void) -{ - void *pData; - - /* Wait for fiber3 to be activated */ - nano_fiber_sem_take(&nanoSemObj3, TICKS_UNLIMITED); - - /* Put two items onto <nanoFifoObj2> to unblock fibers #1 and #2. */ - nano_fiber_fifo_put(&nanoFifoObj2, pPutList2[0]); /* Wake fiber1 */ - nano_fiber_fifo_put(&nanoFifoObj2, pPutList2[1]); /* Wake fiber2 */ - - /* Wait for fiber3 to be re-activated */ - nano_fiber_sem_take(&nanoSemObj3, TICKS_UNLIMITED); - - /* Immediately get the data from <nanoFifoObj2>. */ - pData = nano_fiber_fifo_get(&nanoFifoObj2, TICKS_UNLIMITED); - if (pData != pPutList2[0]) { - retCode = TC_FAIL; - TC_ERROR("fiber3 (1) - got 0x%x from <nanoFifoObj2>, expected 0x%x\n", - pData, pPutList2[0]); - } - - /* Put three items onto the FIFO for the task to get */ - nano_fiber_fifo_put(&nanoFifoObj2, pPutList2[0]); - nano_fiber_fifo_put(&nanoFifoObj2, pPutList2[1]); - nano_fiber_fifo_put(&nanoFifoObj2, pPutList2[2]); - - /* Sleep for 2 seconds */ - nano_fiber_timer_start(&timer, SECONDS(2)); - nano_fiber_timer_test(&timer, TICKS_UNLIMITED); - - /* Put final item onto the FIFO for the task to get */ - nano_fiber_fifo_put(&nanoFifoObj2, pPutList2[3]); - - /* Wait for fiber3 to be re-activated (not expected to occur) */ - nano_fiber_sem_take(&nanoSemObj3, TICKS_UNLIMITED); -} - - -/** - * - * @brief Test the nano_task_fifo_get(TICKS_UNLIMITED) interface - * - * This is in a task. It puts data to nanoFifoObj2 queue and gets - * data from nanoFifoObj queue. - * - * @return N/A - */ - -void testTaskFifoGetW(void) -{ - void *pGetData; /* pointer to FIFO object get from the queue */ - void *pPutData; /* pointer to FIFO object to put to the queue */ - - PRINT_LINE; - TC_PRINT("Test Task FIFO Get Wait Interfaces\n\n"); - pPutData = pMyFifoData1; - TC_PRINT("TASK FIFO Put to queue2: %p\n", pPutData); - nano_task_fifo_put(&nanoFifoObj2, pPutData); - - /* Activate fiber2 */ - nano_task_sem_give(&nanoSemObj2); - - pGetData = nano_task_fifo_get(&nanoFifoObj, TICKS_UNLIMITED); - TC_PRINT("TASK FIFO Get from queue1: %p\n", pGetData); - /* Verify results */ - if (pGetData != pMyFifoData2) { - retCode = TC_FAIL; - TCERR2; - return; - } - - pPutData = pMyFifoData3; - TC_PRINT("TASK FIFO Put to queue2: %p\n", pPutData); - nano_task_fifo_put(&nanoFifoObj2, pPutData); - - TC_END_RESULT(retCode); -} /* testTaskFifoGetW */ - -/** - * - * @brief Initialize nanokernel objects - * - * This routine initializes the nanokernel objects used in the FIFO tests. - * - * @return N/A - */ - -void initNanoObjects(void) -{ - nano_fifo_init(&nanoFifoObj); - nano_fifo_init(&nanoFifoObj2); - - nano_sem_init(&nanoSemObj1); - nano_sem_init(&nanoSemObj2); - nano_sem_init(&nanoSemObj3); - nano_sem_init(&nanoSemObjTask); - - nano_timer_init(&timer, timerData); - -} /* initNanoObjects */ - -/** - * - * @brief Entry point to FIFO tests - * - * This is the entry point to the FIFO tests. - * - * @return N/A - */ - -void main(void) -{ - void *pData; /* pointer to FIFO object get from the queue */ - int count = 0; /* counter */ - - TC_START("Test Nanokernel FIFO"); - - /* Initialize the FIFO queues and semaphore */ - initNanoObjects(); - - /* Create and start the three (3) fibers. */ - - task_fiber_start(&fiberStack1[0], FIBER_STACKSIZE, (nano_fiber_entry_t) fiber1, - 0, 0, 7, 0); - - task_fiber_start(&fiberStack2[0], FIBER_STACKSIZE, (nano_fiber_entry_t) fiber2, - 0, 0, 7, 0); - - task_fiber_start(&fiberStack3[0], FIBER_STACKSIZE, (nano_fiber_entry_t) fiber3, - 0, 0, 7, 0); - - /* - * The three fibers have each blocked on a different semaphore. Giving - * the semaphore nanoSemObjX will unblock fiberX (where X = {1, 2, 3}). - * - * Activate fibers #1 and #2. They will each block on nanoFifoObj. - */ - - nano_task_sem_give(&nanoSemObj1); - nano_task_sem_give(&nanoSemObj2); - - /* Put two items into <nanoFifoObj> to unblock fibers #1 and #2. */ - nano_task_fifo_put(&nanoFifoObj, pPutList1[0]); /* Wake fiber1 */ - nano_task_fifo_put(&nanoFifoObj, pPutList1[1]); /* Wake fiber2 */ - - /* Activate fiber #3 */ - nano_task_sem_give(&nanoSemObj3); - - /* - * All three fibers should be blocked on their semaphores. Put data into - * <nanoFifoObj2>. Fiber #3 will read it after it is reactivated. - */ - - nano_task_fifo_put(&nanoFifoObj2, pPutList2[0]); - nano_task_sem_give(&nanoSemObj3); /* Reactivate fiber #3 */ - - for (int i = 0; i < 4; i++) { - pData = nano_task_fifo_get(&nanoFifoObj2, TICKS_UNLIMITED); - if (pData != pPutList2[i]) { - TC_ERROR("nano_task_fifo_get() expected 0x%x, got 0x%x\n", - pPutList2[i], pData); - goto exit; - } - } - - /* Add items to <nanoFifoObj> for fiber #2 */ - for (int i = 0; i < 4; i++) { - nano_task_fifo_put(&nanoFifoObj, pPutList1[i]); - } - - nano_task_sem_give(&nanoSemObj2); /* Activate fiber #2 */ - - /* Wait for fibers to finish */ - nano_task_sem_take(&nanoSemObjTask, TICKS_UNLIMITED); - - if (retCode == TC_FAIL) { - goto exit; - } - - /* - * Entries in the FIFO queue have to be unique. - * Put data to queue. - */ - - TC_PRINT("Test Task FIFO Put\n"); - TC_PRINT("\nTASK FIFO Put Order: "); - for (int i=0; i<NUM_FIFO_ELEMENT; i++) { - nano_task_fifo_put(&nanoFifoObj, pPutList1[i]); - TC_PRINT(" %p,", pPutList1[i]); - } - TC_PRINT("\n"); - - PRINT_LINE; - - nano_task_sem_give(&nanoSemObj1); /* Activate fiber1 */ - - if (retCode == TC_FAIL) { - goto exit; - } - - /* - * Wait for fiber1 to complete execution. (Using a semaphore gives - * the fiber the freedom to do blocking-type operations if it wants to.) - */ - nano_task_sem_take(&nanoSemObjTask, TICKS_UNLIMITED); - - TC_PRINT("Test Task FIFO Get\n"); - - /* Get all FIFOs */ - while ((pData = nano_task_fifo_get(&nanoFifoObj, TICKS_NONE)) != NULL) { - TC_PRINT("TASK FIFO Get: count = %d, ptr is %p\n", count, pData); - if ((count >= NUM_FIFO_ELEMENT) || (pData != pPutList2[count])) { - TCERR1(count); - retCode = TC_FAIL; - goto exit; - } - count++; - } - - /* Test FIFO Get Wait interfaces*/ - testTaskFifoGetW(); - PRINT_LINE; - - testIsrFifoFromTask(); - PRINT_LINE; - - /* test timeouts */ - if (test_fifo_timeout() != TC_PASS) { - retCode = TC_FAIL; - goto exit; - } - PRINT_LINE; - -exit: - TC_END_RESULT(retCode); - TC_END_REPORT(retCode); -} |