⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randrwc.nc

📁 tinyos2.0版本驱动
💻 NC
字号:
/* $Id: RandRWC.nc,v 1.5 2007/09/13 23:10:22 scipio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE      * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA,  * 94704.  Attention:  Intel License Inquiry. *//** * Block storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */module RandRWC {  uses {    interface Boot;    interface Leds;    interface BlockRead;    interface BlockWrite;    interface AMSend;    interface SplitControl as SerialControl;  }}implementation {  enum {    SIZE = 1024L * 256,    NWRITES = SIZE / 4096,  };  uint16_t shiftReg;  uint16_t initSeed;  uint16_t mask;  /* Return the next 16 bit random number */  uint16_t rand() {    bool endbit;    uint16_t tmpShiftReg;    tmpShiftReg = shiftReg;    endbit = ((tmpShiftReg & 0x8000) != 0);    tmpShiftReg <<= 1;    if (endbit)       tmpShiftReg ^= 0x100b;    tmpShiftReg++;    shiftReg = tmpShiftReg;    tmpShiftReg = tmpShiftReg ^ mask;    return tmpShiftReg;  }  void resetSeed() {    shiftReg = 119 * 119 * ((TOS_NODE_ID % 100) + 1);    initSeed = shiftReg;    mask = 137 * 29 * ((TOS_NODE_ID % 100) + 1);  }    uint8_t data[512], rdata[512];  int count, testCount;  uint32_t addr, len;  uint16_t offset;  message_t reportmsg;  void done();  void report(error_t e) {    uint8_t *msg = call AMSend.getPayload(&reportmsg, 1);    msg[0] = e;    if (call AMSend.send(AM_BROADCAST_ADDR, &reportmsg, 1) != SUCCESS)      call Leds.led0On();  }  event void AMSend.sendDone(message_t* msg, error_t error) {    if (error != SUCCESS)      call Leds.led0On();  }  void fail(error_t e) {    call Leds.led0On();    report(e);  }  void success() {    call Leds.led1On();    report(0x80);  }  bool scheck(error_t r) __attribute__((noinline)) {    if (r != SUCCESS)      fail(r);    return r == SUCCESS;  }  bool bcheck(bool b) {    if (!b)      fail(FAIL);    return b;  }  void setParameters() {    addr = (uint32_t)count << 12 | (rand() >> 6);    len = rand() >> 7;    if (addr + len > SIZE)      addr = SIZE - len;    offset = rand() >> 8;    if (offset + len > sizeof data)      offset = sizeof data - len;  }  event void Boot.booted() {  	TOS_NODE_ID=10;    call SerialControl.start();  }  event void SerialControl.stopDone(error_t e) { }  event void SerialControl.startDone(error_t e) {    int i;    if (e != SUCCESS)      {	call Leds.led0On();	return;      }    resetSeed();    for (i = 0; i < sizeof data; i++)      data[i++] = rand() >> 8;    done();  }  void nextRead() {    if (++count == NWRITES)      done();    else      {	setParameters();	scheck(call BlockRead.read(addr, rdata, len));      }  }  void nextWrite() {    if (++count == NWRITES)      {	call Leds.led2Toggle();	scheck(call BlockWrite.sync());      }    else      {	setParameters();	scheck(call BlockWrite.write(addr, data + offset, len));      }  }  event void BlockWrite.writeDone(storage_addr_t x, void* buf, storage_len_t y, error_t result) {    if (scheck(result))      nextWrite();  }  event void BlockWrite.eraseDone(error_t result) {    if (scheck(result))      {	call Leds.led2Toggle();	nextWrite();      }  }  event void BlockWrite.syncDone(error_t result) {    if (scheck(result))      done();  }  event void BlockRead.readDone(storage_addr_t x, void* buf, storage_len_t rlen, error_t result) __attribute__((noinline)) {    if (scheck(result) && bcheck(x == addr && rlen == len && buf == rdata &&				 memcmp(data + offset, rdata, rlen) == 0))      nextRead();  }  event void BlockRead.computeCrcDone(storage_addr_t x, storage_len_t y, uint16_t z, error_t result) {  }  enum { A_READ = 2, A_WRITE };  void doAction(int act) {    count = 0;    resetSeed();    switch (act)      {      case A_WRITE:	scheck(call BlockWrite.erase());	break;      case A_READ:	nextRead();	break;      }  }  const uint8_t actions[] = {    A_WRITE,    A_READ  };  void done() {    uint8_t act = TOS_NODE_ID / 100;    call Leds.led2Toggle();    switch (act)      {      case 0:	if (testCount < sizeof actions)	  doAction(actions[testCount]);	else	  success();	break;      case A_READ: case A_WRITE:	if (testCount)	  success();	else	  doAction(act);	break;      default:	fail(FAIL);	break;      }    testCount++;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -