人人范文网 范文大全

NesC学习经验总结

发布时间:2020-03-02 09:46:26 来源:范文大全 收藏本文 下载本文 手机版

第一篇:nx类型的应用和理解

今天先说一下为什么TinyOS2.x要引入nx类型的结构,大家都明白在C语言中,我们直接用struct结构体就可以了,这个nx到底是什么意思?其实nx是为了wsn网络传输特别引用的一种独特的数据类型,第一个原因是提高跨平台传输的兼容性;第二个原因是使包的结构可以和bytes的单位一致,这样可以保证在包缓存和域偏移量之间的兼容性问题得到解决,不会导致包在接受过后出现错乱的问题。

也要记住编译程序的时候,nx只可以在nesC1.2或者以上的版本才可以通过,否则会出现编译时间错误,如果不了解这点,对调试程序会难度会很大,因为错误确实很难发现。而且nx是用big endian,如果你要使用little endian,你需要找到定义你的域的头文件将nx加一个le也就是nxle来区别。

这里要注意big endian is 16 bits 而little endian是32 bits,不知道哪位知道endian的中文翻译是什么?我到现在都不知道那个词对应的。如果上面有说错的地方还望高人指出!

引用:

tinyos programming by Philip Levis

第二篇:event和task的理解

TinyOS里面有event和task两个类型的调度,如何合理的利用这两个事件让自己的程序高效运行显得尤为重要。

首先让我们先学习一下如何使用event和task时间,event我们需要用signal来触发,task我们需要用post来触发,event可以带参数运行,而task不能带任何参数这点要注意。

task的功能模块里面我们尽量利用少而精的代码来完成,保证task的代码尽可能的短来提高程序的高效性,而event的调度尽可能不要在command中完成因为这样做的结果会导致调度在tinyos的堆栈中积累越来越多,导致程序锁死这点非常关键因为节点牺牲了大量的性能来保证他的低功耗传输和应用,所以相应的程序的代码也要作出一定的调整。从我的角度理解,task可以是并发处理,而event只能放入堆栈一个一个处理,由于节点的内存有限以及CPU处理缓慢导致容易程序挂起。

举一个简单的例子,我们在处理节点读取感测外部数据时,由于要频繁调用read.read命令时可以使用下面两种代码: command error_t Read.read() { post readDoneTask(); return SUCCESS; } task void readDoneTask() { signal Read.readDone(SUCCESS, filterVal); } 和

command error_t Read.read() { signal Read.readDone(SUCCESS, filterVal); }

可以肯定的说第二个代码很简洁,但是他在执行中的效率一定很高吗?让我们来分析一下,由于read.read的命令要频繁调用一边采集外部数据,导致stack持续增加而程序执行缓慢,就会出现问题,而第一个代码因为task会在稍后的时间执行并且是并发处理机制,不会独占处理时间,但是采用FIFO机制,对程序的处理起到了缓和的作用,所以可以打打加速程序的运行,节省时间,而这也是我们要保证task的代码比较短,因为一个task要执行完另一个才可以执行,所以要保证不被一个task独占的时间太久。

如果你觉得还是很难理解task的应用的话,这样说可能会简单点,如果运行大型的运算程序,像tinyos因为硬件的局限性很难做到,所以我们把它分成许多小的task来完成 这样就保证程序一次执行一点,避免出现loop call问题。

下面附上commands,events和tasks的区别大家可以记下来学习了! Commands Should be non-blocking i.e.take parameters start the proceing and return to app; postpone time-consuming work by posting a task Can call commands on other components

Events Can call commands, signal other events, post tasks but cannot be signal-ed by commands Pre-empt tasks, not vice-versa

Tasks FIFO scheduling Non pre-emptable by other task, pre-emtable by events Used to perform computationally intensive work Can be posted by commands and/or events

第三篇 如何调试NesC程序

作为一个新型的语言,如何调试程序是所有这类语言面临的一个共同的难题,没有直观的IDE开发环境导致这类语言在发展初期面临很多的技术问题,如何更好的推广这类语言的关键也往往要从debugging开始做起!

在TinyOS1.x和2.x中,我们可以通过调用c语言的printf来对程序进行调试,很多人对这个并不了解,却一味的使用Leds来显示程序的执行流程,但是如何看到变量的转化,恐怕一个小小的Leds无法实现的吧?所以Leds的使用只限于查看程序流程,对大型的模块是否程序进入执行,对逻辑纠错可能方便很多。

如何添加printf呢?其实添加printf文件很简单,只需要在makefile文件里面加入下面这句话:

CFLAGS += -I$(TOSDIR)/lib/printf

就可以添加printf的库文件到程序里面,我们下面所需要做的就是调用这个库文件在你需要显示printf的程序文件里面

在你的程序里面添加头文件#include \"printf.h\",这个程序文件就具备了调试printf的功能。 在需要调试的程序行输出printf(\"comments %##, \\n\",variable); 这类格式就可以输出变量的类型了。需要注意的是我们在Nesc中引入无符号整形变量,输出32位的要用参数%x,输出64位的要用%llx来区别,否侧就会出现溢出的错误,希望大家注意。

如果你对printf的语法不是很了解的话,请放狗google搜索,有很多这类的内容,我们只需要看c语言对printf的参数规定即可!

如果你有疑问,请在技术讨论区发问,版主会为您解答! 第四篇 commands和events的用法与provide和use的关系

NesC里面为interface提供了command和event的关键字,很多同学不清楚什么时候应该用那一个关键字,这节课就讲讲他们的用法吧!

因为interface是双向定义的,所以如果一个interface a下的一系列功能也就是commands在文件b中被定义以及实现了,那么这个文件b就要提供provide interface a来为文件c提供他的interface的应用,而文件c就要用use关键字来使用这个文件b提供的interface,所以要注意command是出现在interface provider里面的;而events则正好相反,他只能出现在interface user里面,所以最简单的一个方法来判断如何使用provide和use就是看你要用的command和event的功能,这样是不是就很简单的判断出那些文件provide interface,而那些文件use interface了?

需要注意的是provide和use可以同时存在,不排除一些程序文件在provide interface的同时还use interface,而且interface有可能是一样的,也有可能是不一样的,所以大家要在今后的程序中注意一下。

另外需要说明的是interface会被定义在一个单独的文件里,这里存放着command和这个command所对应的event,这里这个文件只是起到一个简化程序的作用,通过调用这个文件来简化我们的程序开发,这类文件只有定义好的command和event和他们所传递的参数,没有任何程序的主体,所以需要保证所有的参数与这些command和event在已经实现了的文件里面的参数传递保持一直,否则就会出现编译器错误!希望大家注意!

如果有问题可以在NesC语言专区进行发问,我会为大家解答或者分析你的程序结构!

学习经验总结

学习经验总结

学习经验总结

学习经验总结

学习经验总结

学习经验总结

学习经验总结

学习经验总结

学习经验总结

学习经验总结

NesC学习经验总结
《NesC学习经验总结.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档