介绍了比较完整的一个数据采集程序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的内容,比EEPROMRead和EEPROMWrite更加方便。
# ByteEEPROM组件:也是读写EEPROM内容的组件,供高速率读写时使用。