int blobsLoop() { BlobA *blobs; BlobB *ccBlobs; uint32_t numBlobs, numCCBlobs; // create blobs g_blobs->blobify(); // handle received data immediately handleRecv(); // send blobs g_blobs->getBlobs(&blobs, &numBlobs, &ccBlobs, &numCCBlobs); cc_sendBlobs(g_chirpUsb, blobs, numBlobs, ccBlobs, numCCBlobs); ser_getSerial()->update(); cc_setLED(); // deal with any latent received data until the next frame comes in while(!g_qqueue->queued()) handleRecv(); return 0; }
/** * Entry function which will process the assembled code and perform the required actions */ void processAssembledCode(char * assembled, unsigned int length, unsigned short numberSymbols, int coreId, int numberActiveCores, int baseHostPid) { stopInterpreter=0; currentSymbolEntries=0; localCoreId=coreId; numActiveCores=numberActiveCores; symbolTable=initialiseSymbolTable(numberSymbols); hostCoresBasePid=baseHostPid; unsigned int i; for (i=0;i<length;) { unsigned short command=getUShort(&assembled[i]); i+=sizeof(unsigned short); if (command == LET_TOKEN) i=handleLet(assembled, i); if (command == ARRAYSET_TOKEN) i=handleArraySet(assembled, i); if (command == DIMARRAY_TOKEN) i=handleDimArray(assembled, i, 0); if (command == DIMSHAREDARRAY_TOKEN) i=handleDimArray(assembled, i, 1); if (command == PRINT_TOKEN) i=handlePrint(assembled, i); if (command == STOP_TOKEN) return; if (command == SYNC_TOKEN) i=handleSync(assembled, i); if (command == IF_TOKEN) i=handleIf(assembled, i); if (command == IFELSE_TOKEN) i=handleIf(assembled, i); if (command == FOR_TOKEN) i=handleFor(assembled, i); if (command == GOTO_TOKEN) i=handleGoto(assembled, i); if (command == INPUT_TOKEN) i=handleInput(assembled, i); if (command == INPUT_STRING_TOKEN) i=handleInputWithString(assembled, i); if (command == SEND_TOKEN) i=handleSend(assembled, i); if (command == RECV_TOKEN) i=handleRecv(assembled, i); if (command == RECVTOARRAY_TOKEN) i=handleRecvToArray(assembled, i); if (command == SENDRECV_TOKEN) i=handleSendRecv(assembled, i); if (command == SENDRECVARRAY_TOKEN) i=handleSendRecvArray(assembled, i); if (command == BCAST_TOKEN) i=handleBcast(assembled, i); if (command == REDUCTION_TOKEN) i=handleReduction(assembled, i); if (stopInterpreter) return; } }
exception_t handleSyscall(syscall_t syscall) { exception_t ret; irq_t irq; #ifdef DEBUG ksKernelEntry.path = Debug_Syscall; ksKernelEntry.syscall_no = syscall; #endif /* DEBUG */ switch (syscall) { case SysSend: ret = handleInvocation(false, true); if (unlikely(ret != EXCEPTION_NONE)) { irq = getActiveIRQ(); if (irq != irqInvalid) { handleInterrupt(irq); } } break; case SysNBSend: ret = handleInvocation(false, false); if (unlikely(ret != EXCEPTION_NONE)) { irq = getActiveIRQ(); if (irq != irqInvalid) { handleInterrupt(irq); } } break; case SysCall: ret = handleInvocation(true, true); if (unlikely(ret != EXCEPTION_NONE)) { irq = getActiveIRQ(); if (irq != irqInvalid) { handleInterrupt(irq); } } break; case SysRecv: handleRecv(true); break; case SysReply: handleReply(); break; case SysReplyRecv: handleReply(); handleRecv(true); break; case SysNBRecv: handleRecv(false); break; case SysYield: handleYield(); break; default: fail("Invalid syscall"); } schedule(); activateThread(); return EXCEPTION_NONE; }
int blobsLoop() { #if 1 BlobA *blobs; BlobB *ccBlobs; uint32_t numBlobs, numCCBlobs; static uint32_t drop = 0; // create blobs if (g_blobs->blobify()<0) { DBG("drop %d\n", drop++); return 0; } // handle received data immediately handleRecv(); // send blobs g_blobs->getBlobs(&blobs, &numBlobs, &ccBlobs, &numCCBlobs); cc_sendBlobs(g_chirpUsb, blobs, numBlobs, ccBlobs, numCCBlobs); ser_getSerial()->update(); // if user isn't controlling LED, set it here, according to biggest detected object if (!g_ledSet) cc_setLED(); // deal with any latent received data until the next frame comes in while(!g_qqueue->queued()) handleRecv(); #endif #if 0 Qval qval; static int i = 0; while(1) { if (g_qqueue->dequeue(&qval) && qval.m_col==0xffff) { cprintf("%d\n", i++); break; } } #endif #if 0 BlobA *blobs; BlobB *ccBlobs; uint32_t numBlobs, numCCBlobs; static uint32_t drop = 0; // create blobs if (g_blobs->blobify()<0) { DBG("drop %d\n", drop++); return 0; } g_blobs->getBlobs(&blobs, &numBlobs, &ccBlobs, &numCCBlobs); cc_sendBlobs(g_chirpUsb, blobs, numBlobs, ccBlobs, numCCBlobs); #endif return 0; }
exception_t handleSyscall(syscall_t syscall) { exception_t ret; irq_t irq; #if defined(DEBUG) || defined(CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES) ksKernelEntry.path = Entry_Syscall; ksKernelEntry.syscall_no = syscall; #endif /* DEBUG */ #ifdef CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES benchmark_track_start(); #endif /* CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES */ switch (syscall) { case SysSend: ret = handleInvocation(false, true); if (unlikely(ret != EXCEPTION_NONE)) { irq = getActiveIRQ(); if (irq != irqInvalid) { handleInterrupt(irq); } } break; case SysNBSend: ret = handleInvocation(false, false); if (unlikely(ret != EXCEPTION_NONE)) { irq = getActiveIRQ(); if (irq != irqInvalid) { handleInterrupt(irq); } } break; case SysCall: ret = handleInvocation(true, true); if (unlikely(ret != EXCEPTION_NONE)) { irq = getActiveIRQ(); if (irq != irqInvalid) { handleInterrupt(irq); } } break; case SysRecv: handleRecv(true); break; case SysReply: handleReply(); break; case SysReplyRecv: handleReply(); handleRecv(true); break; case SysNBRecv: handleRecv(false); break; case SysYield: handleYield(); break; default: fail("Invalid syscall"); } schedule(); activateThread(); #ifdef CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES benchmark_track_exit(); #endif /* CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES */ return EXCEPTION_NONE; }