📄 bombillaenginem.nc
字号:
/* tab:4 * * * "Copyright (c) 2000-2002 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the following two paragraphs and the author appear in all * copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS * DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, * UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * *//* tab:4 * * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. * By downloading, copying, installing or using the software you * agree to this license. If you do not agree to this license, do * not download, install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * *//* * Authors: Philip Levis <pal@cs.berkeley.edu> * Neil Patel * History: Apr 11, 2003 Inception. * *//** * @author Philip Levis <pal@cs.berkeley.edu> * @author Neil Patel */includes AM;includes Bombilla;module BombillaEngineM { provides { interface StdControl; interface BombillaContextComm as Comm[uint8_t bytecode]; interface BombillaError as Error; } uses { interface Leds; interface BombillaContextSynch as Synch; interface BombillaQueue as Queue; interface BombillaBytecode as Bytecode[uint8_t bytecode] ; interface StdControl as SubControl; interface BombillaAnalysis as Analysis; interface Timer as ErrorTimer; interface SendMsg as SendError; }}implementation { BombillaQueue runQueue; BombillaCapsuleBuffer* capsules[uniqueCount("Capsule")]; BombillaContext* errorContext; BombillaErrorMsg errorMsg; bool inErrorState; bool errorFlipFlop; TOS_Msg msg; command result_t StdControl.init() { uint16_t i; dbg(DBG_BOOT, "VM: Bombilla initializing.\n"); call Leds.init(); call Queue.init(&runQueue); call SubControl.init(); for (i = 0; i < uniqueCount("Capsule"); i++) { signal Comm.analyzeLockSets[i](capsules); } inErrorState = FALSE; return SUCCESS; } command result_t StdControl.start() { dbg(DBG_BOOT, "VM: Starting.\n"); call SubControl.start(); return SUCCESS; } command result_t StdControl.stop() { dbg(DBG_BOOT, "VM: Stopping.\n"); call SubControl.stop(); return SUCCESS; } result_t computeInstruction(BombillaContext* context) { uint8_t instr = context->currentCapsule->capsule.code[(int)context->pc]; // dbg(DBG_USR1, "VM (%hhi): Issuing instruction 0x%hhx.\n", context->which, instr); if (context->state != BOMB_STATE_RUN) { dbg(DBG_ERROR, "VM: (%hhi) Tried to execute instruction in non-run state: %hhi\n", context->which, context->state); return FAIL; } context->pc++; call Bytecode.execute[instr](instr, context); return SUCCESS; } task void RunTask() { int i; // FIFO style policy if (!inErrorState) { BombillaContext* context = call Queue.dequeue(NULL, &runQueue); for (i=0; i < 4; i++) { // this is an arbitrary number of instructions computeInstruction(context); if (context->state != BOMB_STATE_RUN || context->queue == &runQueue) { return; } } //if (context->queue != &runQueue) { call Queue.enqueue(context, &runQueue, context); post RunTask(); //} } } result_t executeContext(BombillaContext* context) { if (context->state != BOMB_STATE_RUN) {return FAIL;} call Queue.enqueue(context, &runQueue, context); post RunTask(); return SUCCESS; } default command result_t Bytecode.execute[uint8_t opcode](uint8_t instr, BombillaContext* context) { dbg(DBG_ERROR|DBG_USR1, "VM: Executing default instruction: halt!\n"); context->state = BOMB_STATE_HALT; return FAIL; } command void Comm.registerCapsule[uint8_t type](BombillaCapsuleBuffer* capsule) { capsules[type] = capsule; } command void Comm.reboot[uint8_t type]() { int i; dbg(DBG_USR1, "VM: Bombilla rebooting.\n"); call Synch.reboot(); call Queue.init(&runQueue); for (i = 0; i < uniqueCount("Timer"); i++) { capsules[i]->haveSeen = 0; } for (i = 0; i < uniqueCount("Capsule"); i++) { signal Comm.analyzeLockSets[i](capsules); } inErrorState = FALSE; errorContext = NULL; } default event result_t Comm.analyzeLockSets[uint8_t type](BombillaCapsuleBuffer* caps[]) { return SUCCESS; } event result_t Synch.makeRunnable(BombillaContext* context) { context->state = BOMB_STATE_RUN; return executeContext(context); } command result_t Error.error(BombillaContext* context, uint8_t cause) { inErrorState = TRUE; dbg(DBG_ERROR|DBG_USR1, "VM: Entering ERROR state. Context: %i, cause %i\n", (int)context->which, (int)cause); call Leds.redOn(); call Leds.greenOn(); call Leds.yellowOn(); call ErrorTimer.start(TIMER_REPEAT, 1000); errorContext = context; if (context != NULL) { errorContext = context; errorMsg.context = context->which; errorMsg.reason = cause; errorMsg.capsule = context->currentCapsule->capsule.type; errorMsg.instruction = context->pc - 1; context->state = BOMB_STATE_HALT; } else { errorMsg.context = BOMB_CAPSULE_INVALID; errorMsg.reason = cause; errorMsg.capsule = BOMB_CAPSULE_INVALID; errorMsg.instruction = 255; } return SUCCESS; } event result_t ErrorTimer.fired() { dbg(DBG_USR1|DBG_ERROR, "VM: ERROR\n"); if (!inErrorState) { call ErrorTimer.stop(); return FAIL; } call Leds.redToggle(); call Leds.greenToggle(); call Leds.yellowToggle(); nmemcpy(msg.data, &errorMsg, sizeof(BombillaErrorMsg)); if (errorFlipFlop) { call SendError.send(TOS_UART_ADDR, sizeof(BombillaErrorMsg), (TOS_MsgPtr)&(msg)); } else { call SendError.send(TOS_BCAST_ADDR, sizeof(BombillaErrorMsg), (TOS_MsgPtr)&(msg)); } errorFlipFlop = !errorFlipFlop; return SUCCESS; } event result_t SendError.sendDone(TOS_MsgPtr mesg, result_t success) { return SUCCESS; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -