Tinyos tutorial learning tips -- lesson 8

介绍了比较完整的一个数据采集程序SenseLightToLog,基础是SimpleCmd,增加了两条命令:一是让节点开始采集数据并存在EEPROM中,二是让节点将EEPROM中的数据通过无线发送器传到网络中。

SenseLightToLog

async event result_t ADC.dataReady(uint16_t this_data){

   atomic {

    int p = head;

    bufferPtr[currentBuffer][p] = this_data;

    head = (p+1);

    if (head == maxdata) head = 0; // Wrap around circular buffer

    if (head == 0) {

        post writeTask();

     }

    }

    return SUCCESS;

  }

  task void writeTask() {

    char* ptr;

    atomic {

      ptr = (char*)bufferPtr[currentBuffer];

      currentBuffer ^= 0x01; // Toggle between two buffers

    }

    call LoggerWrite.append(ptr);

  }

在上面的程序中,为什么不直接在ADC.dataReady函数末尾调用LoggerWrite.append来将采集到的数据加入发送队列呢?因为ADC.dataReady是异步(async)的,而LoggerWrite.append不是,所以不能在async函数里被调用,原因是异步函数是抢占式的,它的调用路线图中不可以出现非异步的函数。可行的方法是在async函数(ADC.dataReady)post一个任务,然后在任务处理函数中调用非async函数(LoggerWrite.append),这就是上面程序所采用的方法。

 

# Logger组件:读写EEPROM的内容,比EEPROMReadEEPROMWrite更加方便。

# ByteEEPROM组件:也是读写EEPROM内容的组件,供高速率读写时使用。

 

你可能感兴趣的:(网络,buffer,任务)