[Tinyos-beta-commits] CVS: tinyos-1.x/beta/teps/html tep106.html, 1.2, 1.3

Ion Yannopoulos ion- at users.sourceforge.net
Mon Jan 31 15:23:21 PST 2005


Update of /cvsroot/tinyos/tinyos-1.x/beta/teps/html
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30256/html

Modified Files:
	tep106.html 
Log Message:
Catching up HTML with text version.


Index: tep106.html
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/teps/html/tep106.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** tep106.html	24 Jan 2005 09:19:21 -0000	1.2
--- tep106.html	31 Jan 2005 23:23:18 -0000	1.3
***************
*** 296,302 ****
  <tr class="field"><th class="docinfo-name">Draft-Created:</th><td class="field-body">10-Dec-2004</td>
  </tr>
! <tr class="field"><th class="docinfo-name">Draft-Version:</th><td class="field-body">1.5</td>
  </tr>
! <tr class="field"><th class="docinfo-name">Draft-Modified:</th><td class="field-body">2005-01-18</td>
  </tr>
  <tr class="field"><th class="docinfo-name">Draft-Discuss:</th><td class="field-body">TinyOS-2.0 Working Group list &lt;tinyos-2.0wg at mail.millenium.berkeley.edu&gt;</td>
--- 296,302 ----
  <tr class="field"><th class="docinfo-name">Draft-Created:</th><td class="field-body">10-Dec-2004</td>
  </tr>
! <tr class="field"><th class="docinfo-name">Draft-Version:</th><td class="field-body">1.7</td>
  </tr>
! <tr class="field"><th class="docinfo-name">Draft-Modified:</th><td class="field-body">2005-01-20</td>
  </tr>
  <tr class="field"><th class="docinfo-name">Draft-Discuss:</th><td class="field-body">TinyOS-2.0 Working Group list &lt;tinyos-2.0wg at mail.millenium.berkeley.edu&gt;</td>
***************
*** 415,419 ****
  <div class="line"><tt class="docutils literal"><span class="pre">interface</span> <span class="pre">TaskParameter</span> <span class="pre">{</span></tt></div>
  <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">async</span> <span class="pre">result_t</span> <span class="pre">command</span> <span class="pre">post(uint16_t</span> <span class="pre">param);</span></tt></div>
  <div class="line"><tt class="docutils literal"><span class="pre">event</span> <span class="pre">void</span> <span class="pre">run(uin16_t</span> <span class="pre">param);</span></tt></div>
  </div>
--- 415,419 ----
  <div class="line"><tt class="docutils literal"><span class="pre">interface</span> <span class="pre">TaskParameter</span> <span class="pre">{</span></tt></div>
  <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">async</span> <span class="pre">error_t</span> <span class="pre">command</span> <span class="pre">post(uint16_t</span> <span class="pre">param);</span></tt></div>
  <div class="line"><tt class="docutils literal"><span class="pre">event</span> <span class="pre">void</span> <span class="pre">run(uin16_t</span> <span class="pre">param);</span></tt></div>
  </div>
***************
*** 424,446 ****
  signal the <tt class="docutils literal"><span class="pre">run</span></tt> event with the passed parameter, which contains
  the task's logic.</p>
! <div class="note">
! <p class="first admonition-title">Note</p>
! <p class="last">Need to settle on exact basic task semantics.</p>
! </div>
  </div>
  <div class="section" id="the-scheduler-in-tinyos-2-x">
  <h1><a name="the-scheduler-in-tinyos-2-x">4. The Scheduler in TinyOS 2.x</a></h1>
  <p>In TinyOS 2.x, the scheduler is a TinyOS component. Every scheduler
! must support basic nesC tasks. It may also support any number of
  additional task interfaces. The scheduler component is resonsible for
  the policy of reconciling different task types (e.g., earliest
  deadline first tasks vs. priority tasks).</p>
! <div class="note">
! <p class="first admonition-title">Note</p>
! <p class="last">The format and implementation of basic tasks greatly depends on their semantics. Need to hash this out.</p>
  </div>
! <div class="note">
! <p class="first admonition-title">Note</p>
! <p class="last">Need a better story on this. Separate component? Main?</p>
  </div>
  </div>
--- 424,574 ----
  signal the <tt class="docutils literal"><span class="pre">run</span></tt> event with the passed parameter, which contains
  the task's logic.</p>
! <p>The semantics of tasks in TinyOS 2.x are different than those in 1.x.
! This change is based on experiences with the limitations and run time
! errors that the 1.x model introduces. In TinyOS 2.x, a basic post will
! only fail if the task has already been posted and has not started
! execution. A task can always run, but can only have one outstanding
! post at any time. If a component needs to post task several times,
! then the end of the task logic can repost itself as need be.</p>
! <p>These semantics prevent several problems, such as the inability to
! signal completion of split-phase events because the task queue is
! full, task queue overflow at initialization, and unfair task
! allocation by components that post a task many times.</p>
  </div>
  <div class="section" id="the-scheduler-in-tinyos-2-x">
  <h1><a name="the-scheduler-in-tinyos-2-x">4. The Scheduler in TinyOS 2.x</a></h1>
  <p>In TinyOS 2.x, the scheduler is a TinyOS component. Every scheduler
! MUST support basic nesC tasks. It MAY also support any number of
  additional task interfaces. The scheduler component is resonsible for
  the policy of reconciling different task types (e.g., earliest
  deadline first tasks vs. priority tasks).</p>
! <p>The basic task in TinyOS 2.x is parameterless and FIFO. Tasks continue
! to follow the nesC semantics of task and post, which are linguistic
! shortcuts for declaring a TaskBasic interface and wiring it to the
! Scheduler component. A scheduler provides a task interface as a
! parameterized interface. Every task that wires to the interface uses
! the unique() function to obtain a unique identifier, which the
! scheduler uses to dispatch tasks.</p>
! <p>For example, the standard TinyOS Scheduler has this signature:</p>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">module</span> <span class="pre">SchedulerBasic</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">provides</span> <span class="pre">interface</span> <span class="pre">Scheduler;</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">provides</span> <span class="pre">interface</span> <span class="pre">TaskBasic[uint8_t</span> <span class="pre">taskID];</span></tt></div>
  </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
! </div>
! <p>The Scheduler interface has commands for initialization and running
! tasks, and is used by TinyOS to execute tasks.</p>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">interface</span> <span class="pre">SchedulerRun</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">command</span> <span class="pre">void</span> <span class="pre">init();</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">command</span> <span class="pre">bool</span> <span class="pre">runNextTask(bool</span> <span class="pre">sleep);</span></tt></div>
! </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
! </div>
! <p>The init() command initializes the task queue and scheduler data
! structures. runNextTask() MUST run to completion whatever task the
! scheduler's policy decides is the next one: the return value indicates
! whether it ran a task. The bool parameter sleep indicates what the
! scheduler should do if there are no tasks to execute. If sleep is
! FALSE, then the command will return immediately with FALSE as a return
! value. If sleep is TRUE, then the command will not return until a task
! is executed, and SHOULD put the CPU to sleep until a new task arrives.
! Calls of runNextTask(FALSE) may return TRUE or FALSE; calls of
! runNextTask(TRUE) always return TRUE.</p>
! <p>The TaskBasic interface is this:</p>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">interface</span> <span class="pre">TaskBasic</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">async</span> <span class="pre">command</span> <span class="pre">error_t</span> <span class="pre">post();</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">void</span> <span class="pre">event</span> <span class="pre">run();</span></tt></div>
! </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
! </div>
! <p>When a component declares a task with the <tt class="docutils literal"><span class="pre">task</span></tt> keyword in nesC, it
! is implicitly declaring that it uses an instance of the TaskBasic
! interface: the task body is the run event. When a component uses the
! <tt class="docutils literal"><span class="pre">post</span></tt> keyword, it calls the post command. Each TaskBasic MUST be
! wired to the Scheduler with a unique identifier.</p>
! <p>The SchedulerBasic implementation uses these identifiers as its queue
! entries.When TinyOS tells the Scheduler to run a task, it pulls the
! next identifier off the queue and uses it dispatches on the
! parameterized TaskBasic interface.</p>
! </div>
! <div class="section" id="replacing-the-scheduler">
! <h1><a name="replacing-the-scheduler">5. Replacing the Scheduler</a></h1>
! <p>The TinyOS scheduler is presented as a component named TinyScheduler.
! The default TinyOS scheduler implementation is a module named
! SchedulerBasic; the default Scheduler component is a configuration
! that provides wire-through of SchedulerBasic.</p>
! <p>To replace the scheduler for a particular application, a developer
! SHOULD put a configuration named Scheduler in the application
! directory: this will replace the default. The Scheduler component
! provides a wire-through of the desired scheduler implementation. All
! scheduler implementations SHOULD provide a parameterize TaskBasic
! interface, as SchedulerBasic does; this supports nesC post statements
! and task declarations. All scheduler implementations MUST provide
! the Scheduler interface.</p>
! <p>For example, imagine a hypothetical scheduler that provides earliest
! deadline first tasks, which are provided through the TaskEDF
! interface:</p>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">interface</span> <span class="pre">TaskEDF</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">async</span> <span class="pre">command</span> <span class="pre">error_t</span> <span class="pre">post(uint16_t</span> <span class="pre">deadline);</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">void</span> <span class="pre">event</span> <span class="pre">run();</span></tt></div>
! </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
! </div>
! <p>The scheduler implementation is named SchedulerEDF, and provides both
! TaskBasic and TaskEDF interfaces:</p>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">module</span> <span class="pre">SchedulerEDF</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">provides</span> <span class="pre">interface</span> <span class="pre">Scheduler;</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">provides</span> <span class="pre">interface</span> <span class="pre">TaskBasic[uint8_t</span> <span class="pre">taskID];</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">provides</span> <span class="pre">interface</span> <span class="pre">TaskEDF[uint8_t</span> <span class="pre">taskID];</span></tt></div>
! </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
! </div>
! <p>An application that wants to use SchedulerEDF instead of
! SchedulerBasic includes a configuration named TinyScheduler, which
! exports all of SchedulerEDF's interfaces:</p>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">configuration</span> <span class="pre">TinyScheduler</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">provides</span> <span class="pre">interface</span> <span class="pre">Scheduler;</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">provides</span> <span class="pre">interface</span> <span class="pre">TaskBasic[uint8_t</span> <span class="pre">taskID];</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">provides</span> <span class="pre">interface</span> <span class="pre">TaskEDF[uint8_t</span> <span class="pre">taskID];</span></tt></div>
! </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">implementation</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">components</span> <span class="pre">SchedulerEDF;</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">Scheduler</span> <span class="pre">=</span> <span class="pre">SchedulerEDF;</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">TaskBasic</span> <span class="pre">=</span> <span class="pre">SchedulerEDF;</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">TaskEDF</span>&nbsp;&nbsp; <span class="pre">=</span> <span class="pre">SchedulerEDF;</span></tt></div>
! </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
! </div>
! <p>For a module to have an earliest deadline first task, it uses the
! TaskEDF interface. Its configuration SHOULD wire it to TinyScheduler,
! using a unique value generated from the key &quot;TaskEDF.&quot; For example:</p>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">configuration</span> <span class="pre">SomethingC</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">...</span></tt></div>
! </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">implementation</span> <span class="pre">{</span></tt></div>
! <div class="line-block">
! <div class="line"><tt class="docutils literal"><span class="pre">components</span> <span class="pre">SomethingM,</span> <span class="pre">TinyScheduler;</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">SomethingM.TaskEDF</span> <span class="pre">-&gt;</span> <span class="pre">TinyScheduler.TaskEDF[&quot;TaskEDF&quot;];</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">TaskBasic</span> <span class="pre">=</span> <span class="pre">SchedulerEDF;</span></tt></div>
! <div class="line"><tt class="docutils literal"><span class="pre">TaskEDF</span>&nbsp;&nbsp; <span class="pre">=</span> <span class="pre">SchedulerEDF;</span></tt></div>
! </div>
! <div class="line"><tt class="docutils literal"><span class="pre">}</span></tt></div>
  </div>
  </div>



More information about the Tinyos-beta-commits mailing list