tinyos http www.nesc.cn 接口中可不可以安排任务

人人网 - 抱歉
哦,抱歉,好像看不到了
现在你可以:
看看其它好友写了什么
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&tinyos/nesc程序入手写法
&& unnewbear
专栏的第三篇介绍了tinyos/nesc程序的基本结构和入手写法,在看前一篇tinyos编程思想里还不觉得有什么,或者说是不觉得作者总结的有多么好,但是这一篇真是给人有一种茅塞顿开的感觉。要写一个tinyos程序,怎么写,大体的流程是什么,这篇文章写的真是很清楚。我大体理解一下,做了个摘记。
&& unnewbear
指出在写一个tinyos程序的时候,大体上是分为三步的,第一步要根据自己的实际情况弄清楚要使用哪些组件,第二步是根据自己要使用的组件编写顶层配置文件,第三步,当顶层配置文件写完之后,再填充内部的内容,实现相应的组件,即编写module文件。
以Blink程序为例,这个应用程序需要使用四个组件,分别是Main组件,以及应用程序具体逻辑功能的实现组件BlinkM,因为程序要使用传感器节点的LED灯,所以要使用到系统提供的ledc组件,同时因为要对时间进行计数,所以要使用到系统提供的定时器组件timer.Main组件是任何一个应用程序都必须具备的一个组件,它是tinyos程序的入口,其次,对于程序的编程者来说,要实现哪些具体的功能也是明确的,但是,至于系统为你提供了什么你能够直接使用的组件,这个真的很麻烦,所以,按照作者的话说,没有别的好办法,你必须自己去熟悉系统底层为你提供的东西,否则,你只能自己写,若你跟我一样现在是个菜鸟,那么我想我们同样处于一个什么也做不了的阶段。
至于,编写顶层配置文件部分,这个没有什么好说的,就是将使用组件的接口和提供组件的接口进行连接就可以了,唯一要注意的就是,对于一个组件来说它可以有多个接口,对于一个接口来说它也可以和多个组件相关联。tinyos中组件是分层次的。最底层的组件贴近硬件部分,是经过一层一层封装才有了上层的组件,封装的过程中就使用了配置文件。而一个应用程序需要一个顶级配置文件,在所有其他的配置文件的更高一层,编译时会首先参照该文件进行编译。
在编写module文件部分,主要的原则是实现提供接口中的所有命令,以及使用接口中的所有事件。其余的貌似没什么好说的了吧,哦,一个程序的具体逻辑流程应该清楚。
已投稿到:5704人阅读
TinyOS学习(18)
和大家一样,我是按照 ../tinyos/cygwin/opt/tinyos-1.x/doc/tutorial
中的8个lesson进行操作和学习的。虽然很痛苦,可是还真没有什么别的更好的方法来学习这门奇怪的嵌入式语言。相信绝大多数同学在面对NesC的时候,最大的问题就是不知道从哪里下手,和自己到底要写些什么。以下的步骤,至少可以让你知道,你要使用NesC去做什么。
第一步,我们要根据实际情况去选择使用什么组件。 以编写blink为例:
首先我们需要main, main是程序开始的组件,是每个的TinyOS 程序(application)都必须的组件。或者可以说是NesC程序的入口,类似于C语言的main(),&Main&调用其他的 component以实现程序的功能。
第二,需要一个来控制程序逻辑的组件,或者说具体实现程序逻辑功能的组件。一般表达程序的逻辑思路,用和配置文件一样的名字,但是多了一个M,表示是module文件,本例中就是BlinkM,也就是我们上一篇当中提到的module文件所对应的组件。
第三,因为程序中用到了LED,所以需要系统提供的ledc。 没办法,这个是只有多看系统lib才行。
第四,因为程序需要时间控制,所以用到系统提供的timer(或者是用户定义的singletimer,其实用户定义的singletimer依然是调用了系统的timer. 后面会附上修改好去掉simpletimer的blink代码,需要的同学自己看)
总结,没有任何好方法,只有对系统熟悉,才能完成对底层的控制,必须去了解和学习那些底层的interface,不然是没有办法学习nesC的。
第二步,选择合适的组件之后就需要编写顶层配置文件(configuration)
从逻辑上来说,当你选定了组件之后,就需要顶层配置文件来wiring组件们,让他们协同工作,以完成你需要的程序功能。
事实上,一个程序中可以有多个配置文件,但一定要有一个顶级配置文件,通常会以application的名字来命名。
配置文件configuration首先声明了其应用程序下的组件,关键字:components.
本例中:&components
Main, BlinkM, SingleTimer, LedsC;
声明了组件之后,通过-&可以将两个组件的接口连接起来。
本例中:Main.StdControl -&
BlinkM.StdC
&&&&&&& & Main.StdControl -& SingleTimer.StdC
&BlinkM.Timer
-& SingleTimer.T &&
linkM.Leds
回忆上一篇,我们说到:
有两个关键字来实现wiring,我翻译成&连接&好了。关键字 &&&和&&&永远是将一个使用(uses)的接口于一个提供(provides)的接口相连接。 也就是说只有使用者组件能够调用提供者组件的接口。反过来就不可以。
Tinyos中,组件和接口是一个多对多的关系,即一个组件可以连接到很多接口,反过来说,很多组件都可以提供一个相同的接口!(核心!最难理解的地方!)
前面说,不同的组件可以提供相同的接口,如果组件ComA,ComB都提供了某一个接口InterfaceC, 那么,当组件ComD需要去访问InterfaceC接口时,怎么办? 它访问的到底是ComA提供的InterfaceC还是ComB提供InterfaceC的呢? 要知道,虽然接口的名称是一样的,但是不同组件提供的相同接口却是实现不同的功能。
那么这里, Main.StdControl
-& BlinkM.StdC这行代码就是把组件main和blinkm的stdcontrol连接起来,这样,就建立了两个组件之间的联系。当调用main.stdcontrol的时候就相当于调用了blinkm.stdcontrol。Main.StdControl -& SingleTimer.StdC 这行代码就是把main和singleTimer的stdcontrol连接起来了,也建立了main和singletimer的联系。可以看到main这个user同时和两个provider连接。Main的stdcontrol在被调用的时候,blinkm.stdcontrol和SingleTimer.StdControl都会被调用。
现在,我们已经知道某些组件提供和使用的某些接口,比如blinkM提供StdControl,因为他在箭头的后面(Main.StdControl -&
BlinkM.StdControl),他是提供者;同时他还使用Timer和Leds,因为他在箭头的前面(BlinkM.Timer和linkM.Leds),他是使用者。而SingleTimer和LedsC都是提供者,因为他们都是系统提供的lib,让你去控制灯的闪烁和时间。
总结:在tinyos中组件也是分层次的。最底层的组件贴近硬件部分,是经过一层一层封装才有了上层的组件,封装的过程中就使用了配置文件。而一个应用程序需要一个顶级配置文件,在所有其他的配置文件的更高一层,编译时会首先参照该文件进行编译。
第三步,既然已经有了顶层配置文件,可以写module文件了。
有了顶层配置文件相当于我们的房子已经有图纸,那么你知道我们的房子要建多少层,每层有多少房间,卫生间和厨房在什么位置。那么module文件就是在给你的程序添砖加瓦。让它真的能住人。
前面刚刚提到,blinkM提供StdControl接口,使用singleTimer的Timer接口和LedsC的Leds接口。所以blinkM应该这样写:
module BlinkM {
provides {
interface StdC
interface T
interface L
我们前面说过:
一个组件如果provide某个interface,就必须实现这个interface当中所有的command。
现在blinkM provide StdControl,所以他必须提供StdControl的所有command。分别是init(),start(), stop(). 那么blinkM就变成:
module BlinkM {
provides {
interface StdC
interface T
interface L
implementation {
command result_t StdControl.init() {
return SUCCESS;
command result_t StdControl.start() {
command result_t StdControl.stop() {
原则:在tinyos中,要使用一个组件(模块)必须先要初始化(init)它。
main是整个application的启动的入口,那么当然main可以启动与之相连接的模块。Main已经和谁关联了? 对,main和BlinkM以及SingleTimer都关联了。而main与他们关联的接口是什么呢? 没错,是stdcontrol。前面说了,当调用main.stdcontrol的时候就相当于调用了blinkm.stdcontrol和singleTimer.stdcontrol.那么blinkM和singleTimer都被启动了。
那么可以看到,我们顶层配置文件当中的4个组件,main,BlinkM,SingleTimer都启动了,就剩ledC还没有初始化。 但是问题是ledC没有提供stdControl接口,所以不能用main与之关联的方式去启动它。观察LedsC提供的Leds接口, 发现leds接口中有init() command. 我们通过command result_t StdControl.init() 去call Leds.init();进行ledC的初始化。
command result_t StdControl.init() {
Leds.init();
return SUCCESS;
至此,所有的组件都已经初始化完毕。而且blinkM 提供 stdControl接口,也已经实现它。但是还有一个问题:
&&&&&&&& 一个组件如果use某个interface,就必须实现这个interface当中的event。
blinkM 使用了leds接口和timer接口。
那么必须检查 leds 和timer接口,看是否有event,如果有event就必须实现。观察到leds是没有event,而timer接口是有event。
interface Timer {
command result_t start(char type, uint32_t interval);
command result_t stop();
event result_t fired();
Timer接口有两个command和一个event。Start()命令被用于指定timer 的类型和那些即将过期的时间间隔。我们使用毫秒来计算时间间隔。有TIMER_REPEAT 和TIMER_ONE_SHOT 两种可用的类型。在使用TIMER_REPEAT模式的时候,我们可以用Start()命令形成一个循环,在指定的时间间隔过后,timer 将会结束,下一个重复的timer 将会继续执行,直到被stop()命令所终止。而当一个间隔到来时,事件 fired()就会被触发。
考虑程序的逻辑流程:
在我们需要的所有组件都启动后,Timer然后开始记录时间,当一个时间间隔过后,fired()事件被触发,并控制led,让灯闪烁。
所以把timer的start()放到blinkM的result_t StdControl.start()里,把timer的stop()放到blinkM的result_t StdControl.stop()里。所以最终的代码是:
implementation {
command result_t StdControl.init() {
call Leds.init();
return SUCCESS;
command result_t StdControl.start() {
return call Timer.start(TIMER_REPEAT, 1000) ;
command result_t StdControl.stop() {
return call Timer.stop();
event result_t Timer.fired()
call Leds.redToggle();
return SUCCESS;
看到这里,其实一个标准的NesC程序就差不多明白了。
最后给出用tossim来模拟blink的方法,关键是给手头没有mote的同学看看tinyos程序的运行结果:
在cygwin下,进入目录:c:/cygwin/opt/tinyos-1.x/apps/blink
运行命令:make
然后运行命令:export
最后运行:build/pc/main.exe
3(这里的3指设置了3个传感器节点)
你就在console可以看到节点的输出。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:114654次
积分:1890
积分:1890
排名:第15175名
原创:64篇
转载:43篇
评论:166条
(1)(1)(1)(1)(1)(8)(27)(30)(5)(1)(6)(2)(2)(4)(12)(5)TinyOS是什么_百度知道博客访问: 260746
博文数量: 127
博客积分: 4001
博客等级: 上校
技术积分: 760
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 系统运维
& & ◆TinyOS操作系统、库和程序服务程序是用nesC写的
& & ◆nesC是一种开发组件式结构程序的语言
& & ◆nesC是一种C语法风格的语言,但是支持TinyOS的并发模型,以及组织、命名和连接组件成为健壮的& &  嵌入式网络系统的机制
& && &&&◇nesC应用程序是由有良好定义的双向接口的组件构建的
& && &&&◇nesC定义了一个基于任务和硬件事件处理的并发模型,并能在编译时检测数据流
& & ◆规范
& && &&&◇nesC应用程序由一个或多个组件连接而成
& && &&&◇一个组件可以提供或使用接口
& && && && &●组件中command接口由组件本身实现
& && && && &●组件中event接口由调用者实现
& && && && &●接口是双向的,调用command接口必须实现其event接口
& & ◆实现
& && &&&◇modules
& && && && &●包含应用程序代码,实现接口
& && &&&◇configurations
& && && && &●装配模块,连接模块使用的接口到其提供者
& && && && &●每个nesC应用程序都有一个顶级configuration连接内部模块
& & ◆TinyOS只能运行单个由所需的系统模块和自定义模块构成的应用程序
& & ◆两个线程
& && &&&◇任务
& && && && &●一次运行完成,非抢占式
& && &&&◇硬件事件处理
& && && && &●处理硬件中断
& && && && &●一次运行完成,抢占式
& && && && &●用于硬件中断处理的command和event必须用async关键字声明
& & ◆执行流程(race conditions)
& && &&&◇nesC要避免任务排他性访问共享数据
& && &&&◇nesC要避免所有共享数据访问都通过原子语句
& && &&&◇nesC在编译过程中要检测数据流,但可能误报,可用norace关键字声明不检测,但对其使用
& && &&& 应格外小心
Module of Sense Application
& & SenseM.nc
& && &&&------------------------------------------------
& & |module SenseM {
& && && && && && && && && && &
& & | provides {
& && && && && && && && && && && &
& & |& & interface StdC
& && && && && && && && &| }
& && && && && && && && && && && && && && && & | uses {
& && && && && && && && && && && && && &&&|& & interface T
& && && && && && && && && &&&|& & interface ADC;
& && && && && && && && && && & |& & interface StdControl as ADCC
& && && & |& & interface L
& && && && && && && && && && &|&&}
& && && && && && && && && && && && && && && & |}
& && && && && && && && && && && && && && && && &------------------------------------------------
◆提供StdControl接口
◆使用Timer、ADC、StdControl、Leds接口
& & ◇nesC程序中可以使用同一个接口的多个实例
& && &&&●interface StdControl as ADCControl
& && &&&●ADCControl是StdControl的实例
& & ◇不提供实例名,则实例名与接口名相同
& && &&&●interface ADC相当于interface ADC as ADC
Configuration of Sense Application
& & Sense.nc
& & --------------------------------------------------
& & |configuration Sense {
& && && && && && && && && && &|&&// this module does not provide any interface
& && && && && && && && && && && && && && && && &&&|implementation
& && && && && && && && && && && && & |{
& && && && && && && && && && && && && && && && &&&|&&components Main, SenseM, LedsC, TimerC, P
& && && && && && && && && && && && && && && && && &|&&Main.StdControl -> SenseM;
& && && && && && && &&&|&&Main.StdControl -> TimerC;
& && && && && && && &&&|
& && && && && && && && && && && && && && && && && &|&&SenseM.ADC -> P
& && && && && && && && && &&&|&&SenseM.ADCControl -> P
& && && && && && && & |&&SenseM.Leds -> LedsC;
& && && && && && && && && & |&&SenseM.Timer -> TimerC.Timer[unique("Timer")];
& && && && && && && && && && && && && && && && &&&--------------------------------------------------
◆不提供任何接口
◆使用Main、SenseM、LedsC、TimerC、Photo模块
◆连接Main.StdControl接口到SenseM.StdControl和TimerC.StdControl
◆连接SenseM.ADC接口到Photo.ADC
◆连接SenseM.ADCControl到Photo.StdControl
◆参数化接口
& & ◇组件可以使用相同接口的不同实例,并分别为其命名
& && &&&provides {
& && && && &interface StdControl as fooC
& && && && &interface StdControl as barC
& && &&&◇参数化接口允许组件通过运行时或编译时参数值使用多个该接口的实例
& && &&&provides interface Timer[uint8_t id];
& & ◇每个Timer可以有256实例,每个实例对应一个8位数字
& & ◇unique、uniqueCount函数
& && &&&●产生一个唯一的8位数字与参数关联。
& && &&&●unique("Timer")是产生一个唯一的数字与Timer串关联;unique("Timer")与unique("MyTimer")可能产生相同的数;
& && &&&●uniqueCount返回与参数关联的数的个数
执行应用程序通用后台进程 任务的建立和调度 TinyOS提供任务和硬件事件处理两级调度体系
async关键字声明硬件事件处理的command和event 可以在任意时刻运行 做少量工作,要快速完成
任务用于处理复杂操作,比如后台数据处理,可以被硬件事件处理程序抢占 任务的定义语法 task void taskname() { ... }
taskname是给任务取的符号名字 任务不能有参数,必须返回void 分派任务语法 post taskname();
可以在command中提交任务 可以在event中提交任务 可以在Task中提交任务 post后的任务被放到一个内部FIFO任务队列 TinyOS学习笔记(4)
CntToLedsAndRfm configuration
& && &CntToLedsAndRfm.nc
& & ----------------------------------------------------------
& & |configuration CntToLedsAndRfm {
& && && && && && && && && & |}
& && && && && && && && && && && && && && && && && && && & |implementation {
& && && && && && && && && && && && && && & |&&components Main, Counter, IntToLeds, IntToRfm, TimerC;
& && && && && && && && && && && && && && && && && && && &&&|&&Main.StdControl -> Counter.StdC
& && && && && && & |&&Main.StdControl -> IntToLeds.StdC
& && && && && &&&|&&Main.StdControl -> IntToRfm.StdC
& && && && && && &|&&Main.StdControl -> TimerC.StdC
& && && && && && &&&|&&Counter.Timer -> TimerC.Timer[unique("Timer")];
& && && & |&&IntToLeds <- Counter.IntO
& && && && && && && && &&&|&&Counter.IntOutput -> IntToR
& && && && && && && && && &|}
& && && && && && && && && && && && && && && && && && && & ----------------------------------------------------------
◆使用模块Main、Counter、IntToLeds、IntToRfm和TimerC
◆在Main中初始化Counter、IntToLeds、IntToRfm和TimerC
◆都是标准库
◆Counter处理Timer.fire()事件
◆IntOutput接口
& & ◇output() Command:有一个16位的参数
& & ◇outputComplete() Event:返回一个result_t
◆IntToLeds:在LED上显示值的低三位
◆IntToRrm:通过Radio广播
◆Counter使用IntToLeds和IntToRfm的IntOutput接口
◆箭头总是由使用者指向提供者
◆TinyOS中的radio通信采用Active Message(AM)模型,网络中的每个包都有一个handler ID,接收结点&&会触发这个ID对应的事件,可以认为这个ID是“端口号”,不同的结点可以把不同的事件关联到相同的handler ID。
◆在消息传递层,成功的通信涉及5个方面
& & ◇标明发送数据
& & ◇标明接收结点
& & ◇回收与发送数据相关联的内存
& & ◇缓存接收数据
& & ◇处理消息
IntToRfm configuration
& & IntToRfm.nc
& & ----------------------------------------------
& & |configuration IntToRfm
& && && && && && && && & |{
& && && && && && && && && && && && && && && & |&&provides interface IntO
& && && && && & |&&provides interface StdC
& && && && && &|}
& && && && && && && && && && && && && && && & |implementation
& && && && && && && && && && && &|{
& && && && && && && && && && && && && && && & |&&components IntToRfmM, GenericComm as C
& && && && && && && && && && && && && && && &&&|&&IntOutput = IntToRfmM;
& && && && && && && &&&|&&StdControl = IntToRfmM;
& && && && && && && & |
& && && && && && && && && && && && && && && &&&|&&IntToRfmM.Send -> Comm.SendMsg[AM_INTMSG];
& & |&&IntToRfmM.StdControl -> C
& && && && && & |}
& && && && && && && && && && && && && && && & ----------------------------------------------
◆IntToRfm configuration提供了两个接口IntOputput和StdControl
◆提供了接口的configuration也成为了组件,可以被其它configuartion使用
◆组件别名
& & ◇使用了GenericComm组件
& & ◇取别名(local name)Comm
& & ◇为了能方便地使用其它通信组件替换GenericComm而不用修改每一处作用该组件的代码
◆=(equal sign)
& & ◇IntOutput = IntToRfmM
& & ◇StdControl = IntToRfmM
& & ◇模块中左面接口的实现等价于右边模块中接口的实现
◆AM_INTMSG是定义在tos/lib/Counters/IntMsg.h中的全局常量
IntToRfm module
& & IntToRfmM.nc
& && && &----------------------------------------------------------------
& && && && && && && && && && && && && && && && && & |struct TOS_M
& && && && && && && && && && && && && && && &|
& && && && && && && && && && && && && && && && && && && && && &&&|/* ... */
& && && && && && && && && && && && && && && && && && &&&|
& && && && && && && && && && && && && && && && && && && && && &&&|command result_t IntOutput.output(uint16_t value) {
& && && && &&&|&&IntMsg *message = (IntMsg *)data.
& && && && && && && && & |
& && && && && && && && && && && && && && && && && && && && && &&&|&&if (!pending) {
& && && && && && && && && && && && && && && && &|& & pending = TRUE;
& && && && && && && && && && && && && && && & |
& && && && && && && && && && && && && && && && && && && && && &&&|& & message->val =
& && && && && && && && && && && && && & |& & atomic {
& && && && && && && && && && && && && && && && && &&&|& & message->src = TOS_LOCAL_ADDRESS;
& && && && && && && && && & |& & }
& && && && && && && && && && && && && && && && && && && && &|
& && && && && && && && && && && && && && && && && && && && && &&&|& &
if (call Send.send(TOS_BCAST_ADDR, sizeof(IntMsg), &data))
& & |& && &return SUCCESS;
& && && && && && && && && && && && && && &&&|
& && && && && && && && && && && && && && && && && && && && && &&&|& & pending = FALSE;
& && && && && && && && && && && && && && && &|&&}
& && && && && && && && && && && && && && && && && && && && &&&|&&return FAIL;
& && && && && && && && && && && && && && && && && &|}
& && && && && && && && && && && && && && && && && && && && && & ----------------------------------------------------------------
◆IntMsg结构(tos/lib/Counters/IntMsg.h)
& & ◇Field: val
& & ◇Field: src
◆TOS_LOCAL_ADDRESS
& & ◇全局常量
& & ◇代表local source address
◆TOS_BCAST_ADDR
& & ◇全局常量
& & ◇代表radio广播地址
◆TOS_Msg(tos/system/AM.h)
& & ◇send函数所使用的消息结构
& & ◇IntMsg是对TOS_Msg的封装
◆调用Send.send()发送数据
& & ◇数据分段
& & ◇数据传完触发SendMsg.sendDone()事件
& & ◇发送成功才接收下一个分段消息队列
& & ◇发送不成功就不接受传输消息
◆TinyOS Active Message缓存管理
& & ◇允许并发操作
& & ◇遵守严格的可选所有者协议,避免太大内存管理开销
& & ◇message layer接受send()后,管理缓存,传输完成前不允许请求者再修改缓存
◆pending flag
& & ◇跟踪缓存状态
& & ◇前面的消息没发完,则放弃output(),返回FAIL
& & ◇缓存可用,则发送消息
◆GenericComm网络栈(tos/system/GenericComm.nc)
& & ◇TinyOS generic网络栈的实现
& & ◇使用低级接口实现通信
& & ◇AMStandard实现Active Message的接收与发送
& & ◇UARTNoCRCPacket实现mote的串口通信
& & ◇RadioCRCPacket实现radio通信
◆RfmToLeds
& & ◇ReceiveMsg接口(tos/interfaces/ReceiveMsg.nc)只定义了一个事件: receive()
& & ◇接收消息的内存管理是动态继承的
& & ◇Active Message层解码handler type并进行分派
& & ◇缓存被传递给程序(通过ReceiveMsg.receive()事件),但关键的是,程序必须在处理完后返回指向缓存的指针
& & ◇若是要保存消息内容以后处理,那么应复制消息内容到新的缓存,或向网络栈返回一个新缓存的指针
◆底层细节
& & ◇消息头中包含group ID,使得多个mote组可以共享同一个radio channel
& & ◇group ID是一个8位数
& & ◇默认group ID是0x7D
& & ◇使用DEFAULT_LOCAL_GROUP改变默认group ID
& && &&&●DEFAULT_LOCAL_GROUP = 0x42& & # for example...
& & ◇使用MakeLocal文件改变所有程序胡group ID
& & ◇消息头带有16位的目的结点地址
& & ◇组中的每个通信结点在编译时都分配有惟一一个16位地址
& & ◇TOS_BCAST_ADDR (0xfff)广播通用地址
& & ◇TOS_UART_ADDR (0x007e)串口通用地址
& & ◆TOSSIM是直接从TinyOS代码中编译而来的TinyOS模拟器
& & ◆运行于桌面电脑和笔记本上
& & ◆可同时模拟上千个运行相同程序的结点
& & ◆可在运行时配置调试输出信息
Building and Running an Application
& & ◆make pc编译得到TOSSIM
& & ◆TOSSIM可执行文件是build/pc/main.exe
& & ◆control-C停止模拟
& & ◆默认输出所有调试信息
& & ◆TOSSIM的最高频率为40KHZ
增加调试语句
& & ◆Application components和调试的四种保留模式:usr1、usr2、 usr3、和temp
& & ◆调试信息命令
& && &&&◇语法
& && && && &●dbg(, const char* format, ...);
& && &&&◇指出以那种DBG模式输出调试信息
& && &&&◇tos/types/dbg_modes.h包含全部可用模式
& && &&&◇其它参数与printf()的参数同语义
阅读(1870) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 www.nesc.cn v 的文章

 

随机推荐