前言..................................................................................................................................................3编程小贴士......................................................................................................................................3链接和命名空间..............................................................................................................................63.1C..........................................................................................................................................63.2C++.....................................................................................................................................93.3Java...................................................................................................................................113.4组件与接口......................................................................................................................113.5Why?................................................................................................................................13接口和模块....................................................................................................................................154.1SplitPhase........................................................................................................................154.2带参数的接口...................................................................................................................164.3模块的实现.......................................................................................................................174.4Tasks(任务).................................................................................................................194.5Concurrency并发...........................................................................................................234.6Allocation.........................................................................................................................31ConfigurationsandWiring..........................................................................................................355.0.1Theaskeywordandothernamespacetricks.....................................................395.1PassThroughWiring......................................................................................................415.1.1MultipleWirings,Fan-in,andFan-out多串联,扇入,扇出。....................425.2CombineFunctions.........................................................................................................44ParameterizedWiring..................................................................................................................466.1Defaults............................................................................................................................506.2unique()anduniqueCount()...........................................................................................51第一章前言这本书介绍了如何在TinyOS2.0(T2)下编程。它比之前的指导性的文章更为深入些,而且还涉及到一些额外的主题,例如radiostacks的结构及其实现和一些现存的TinyOS库。这本书关注于如何编写nesC代码,以及解释那些nesC和TinyOS设计模式背后的概念和原理。如果你想很快速的了解如何进行TinyOS编程,你可以先阅读指导(tutorials).如果你对TinyOS的某个子系统很感兴趣,你可以参阅TEPs(TinyOSEnhancementProposals),它详细阐述了相应的设计,接口和组件。这些都可以在TinyOS的发布目录下找到。虽然本书的一些内容仍然适用于TinyOS1.x的版本,但1.x的版本与T2版本的不同还是会导致不同编程实践。如果仍有疑问,可以参考TEP,TEPs会经常讨论1.x和2.0的细节上的不同。对于那些有C或C++编程经验的人来说,写一些简单的nesC程序是相当的简单的:你所需要做的只是实现几个模块,并把它们串起来。真正的难的地方(比较有挑战的)在于建立大型程序的时候。TinyOS模块的语法和C的语法类似,但那些将组件串联在一起的配置(configurations)却大不一样。本书一开始解释了nesC和其他“C方言”的联系和区别,然后逐步深入的讨论这些不同是怎么导致编程风格和方法上的不同的。本书假设阅读的起点:你了解C,C++,JAVA,理解指针或类似的东西。你曾经在大学里上过操作系统的课程(或同等的课程)并且知道,并发,中断和优先级。当然,本书仍然尽可能多的讲解nesC,这也是最为实际的方法来使用这种语言完成软件开发。在这方面,本书也是很多人花费了数千个小时来学习和研究这种语言的使用方法的成果。实际上,DavidGay和CorySharp常常推广nesC编程的使用范围,使人们更容易的理解什么样的编程实践可以带来更简单有效健壮的代码。尤其是第八章是DavidGay和我一起写的论文的修改版,其中讨论了关于使用结构体在接口中(正如计时器Timer所做的)作为编译期检查机制,这种方法是由Cory提出的。第二章编程小贴士本文将会提到一些编程注意点来避免在nesC编程中遇到的常见问题。我们整理好这些以备参考。ProgrammingHint1:It’sdangeroustosignaleventsfromcommands,asyoumightcauseaverylongcallloop,corruptmemoryandcrashyourprogram.注意点1:在命令中触发一个事件是相当“危险”的,这可能会导致一个很长的调用循环,破坏内存并最终导致程序的崩溃。ProgrammingHint2:Keeptasksshort.注意点2:确保任务的简短。ProgrammingHint3:Keepcodesynchronouswhenyoucan.Codeshouldbeasynconlyifitstimingisveryimportantorifitmightbeusedbysomethingwhosetimingisimportant.注意点3:尽可能保证代码的同步性。只有当程序的时效性很重要时,可以考虑代码的异步执行。ProgrammingHint4:Keepatomicsectionsshort,andhaveasfewofthemaspossible.Becarefulaboutcallingouttoothercomponentsfromwithinanatomicsection.注意点4:确保原子操作的简短,并少量的使用它们。对在一个原子操作中调用其他的组件要格外小心。ProgrammingHint5:Onlyonecomponentshouldbeabletomodifyapointer’sdataatanytime.Inthebestcase,onlyonecomponentshouldbestoringthepointeratanytime.注意点5:只有一个组件可以在任何时刻修改一个被指针指向的数据。最佳的情况是:在任何时刻,只有一个组件存储着这些指针。ProgrammingHint6:Allocateallstateincomponents.Ifyourapplicationrequirementsnecessitateadynamicmemorypool,encapsulateitinacomponentandtrytolimitthesetofusers.注意点6:在组件中分配好所有的变量。如果你的程序确实需要动态内存池,请将其封装到一个组件中,并限制使用它的用户。ProgrammingHint7:Conservememorybyusingenumsratherthanconstvariablesforintegerconstants,a