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 */
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 Lifo test fiber * * @param par1 Ignored parameter. * @param par2 Number of test loops. * * @return N/A */ void lifo_fiber1(int par1, int par2) { int i; int element_a[2]; int element_b[2]; int *pelement; ARG_UNUSED(par1); for (i = 0; i < par2 / 2; i++) { pelement = (int *)nano_fiber_lifo_get(&nanoLifo1, TICKS_UNLIMITED); if (pelement[1] != 2 * i) { break; } element_a[1] = 2 * i; nano_fiber_lifo_put(&nanoLifo2, element_a); pelement = (int *)nano_fiber_lifo_get(&nanoLifo1, TICKS_UNLIMITED); if (pelement[1] != 2 * i + 1) { break; } element_b[1] = 2 * i + 1; nano_fiber_lifo_put(&nanoLifo2, element_b); } /* wait till it is safe to end: */ nano_fiber_fifo_get(&nanoFifo_sync, TICKS_UNLIMITED); }
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_wait(&nanoSemObj1); /* Wait for data to be added to <nanoFifoObj> by task */ pData = nano_fiber_fifo_get_wait(&nanoFifoObj); 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_wait(&nanoFifoObj2); if (pData != pPutList2[0]) { TC_ERROR("fiber1 (2) - expected 0x%x, got 0x%x\n", pPutList2[0], pData); retCode = TC_FAIL; return; } nano_fiber_sem_take_wait(&nanoSemObj1); /* Wait for fiber1 to be reactivated */ TC_PRINT("Test Fiber FIFO Get\n\n"); /* Get all FIFOs */ while ((pData = nano_fiber_fifo_get(&nanoFifoObj)) != 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 Fifo test fiber * * @param par1 Ignored parameter. * @param par2 Number of test loops. * * @return N/A */ void fifo_fiber1(int par1, int par2) { int i; int element[2]; int * pelement; ARG_UNUSED(par1); for (i = 0; i < par2; i++) { pelement = (int *) nano_fiber_fifo_get(&nanoFifo1, TICKS_UNLIMITED); if (pelement[1] != i) { break; } element[1] = i; nano_fiber_fifo_put(&nanoFifo2, element); } /* wait till it is safe to end: */ nano_fiber_fifo_get(&nanoFifo_sync, TICKS_UNLIMITED); }
/** * * @brief Fifo test fiber * * @param par1 Address of the counter. * @param par2 Number of test cycles. * * @return N/A */ void fifo_fiber2(int par1, int par2) { int i; int element[2]; int * pelement; int * pcounter = (int *) par1; for (i = 0; i < par2; i++) { element[1] = i; nano_fiber_fifo_put(&nanoFifo1, element); pelement = (int *) nano_fiber_fifo_get(&nanoFifo2, TICKS_UNLIMITED); if (pelement[1] != i) { break; } (*pcounter)++; } /* wait till it is safe to end: */ nano_fiber_fifo_get(&nanoFifo_sync, TICKS_UNLIMITED); }
/** * * @brief Fifo test fiber * * @param par1 Address of the counter. * @param par2 Number of test cycles. * * @return N/A */ void fifo_fiber3(int par1, int par2) { int i; int element[2]; int * pelement; int * pcounter = (int *) par1; for (i = 0; i < par2; i++) { element[1] = i; nano_fiber_fifo_put(&nanoFifo1, element); while ((pelement = nano_fiber_fifo_get(&nanoFifo2, TICKS_NONE)) == NULL) { fiber_yield(); } if (pelement[1] != i) { break; } (*pcounter)++; } /* wait till it is safe to end: */ nano_fiber_fifo_get(&nanoFifo_sync, TICKS_UNLIMITED); }
static void cmd_handler(int arg1, int arg2) { while (1) { struct btp_hdr *cmd; uint16_t len; cmd = nano_fiber_fifo_get(&cmds_queue, TICKS_UNLIMITED); len = sys_le16_to_cpu(cmd->len); /* TODO * verify if service is registered before calling handler */ switch (cmd->service) { case BTP_SERVICE_ID_CORE: handle_core(cmd->opcode, cmd->index, cmd->data, len); break; case BTP_SERVICE_ID_GAP: tester_handle_gap(cmd->opcode, cmd->index, cmd->data, len); break; case BTP_SERVICE_ID_GATT: tester_handle_gatt(cmd->opcode, cmd->index, cmd->data, len); break; case BTP_SERVICE_ID_L2CAP: tester_handle_l2cap(cmd->opcode, cmd->index, cmd->data, len); break; default: tester_rsp(cmd->service, cmd->opcode, cmd->index, BTP_STATUS_FAILED); break; } nano_fiber_fifo_put(&avail_queue, cmd); } }
static void shell(int arg1, int arg2) { char *argv[ARGC_MAX + 1]; size_t argc; while (1) { struct uart_console_input *cmd; shell_cmd_function_t cb; printk("%s", get_prompt()); cmd = nano_fiber_fifo_get(&cmds_queue, TICKS_UNLIMITED); argc = line2argv(cmd->line, argv, ARRAY_SIZE(argv)); if (!argc) { nano_fiber_fifo_put(&avail_queue, cmd); continue; } cb = get_cb(argv[0]); if (!cb) { if (app_cmd_handler != NULL) { cb = app_cmd_handler; } else { printk("Unrecognized command: %s\n", argv[0]); printk("Type 'help' for list of available commands\n"); nano_fiber_fifo_put(&avail_queue, cmd); continue; } } /* Execute callback with arguments */ if (cb(argc, argv) < 0) { show_cmd_help(argc, argv); } nano_fiber_fifo_put(&avail_queue, cmd); } }
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); }