TinyOS 同步与异步处理学习心得
2014-01-21 09:55
190 查看
TinyOS中的同步处理是指同步代码从运行开始一直占用CPU直到运行完毕,同步的缺点在于在此期间其他代码没有任何运行的机会,若一段代码长期占用CPU,则相当于是“死循环”,如在例子程序BlinkTask中,有下面这段代码:
event void Timer0.fired(){
unit32_t i;
for(i=0; i<400001; i++)
call Leds.led0Toggle();
}
该例子程序所要实现的效果是红绿蓝三个灯按自己的循环周期进行闪烁,但由于上面的代码中,for循环了400000次,从而大量占据了CPU,使得led1和led2被阻塞,则最后实现的效果是红灯长亮,绿蓝两个灯无反应。具体的CPU相关参数,可以查询TI公司的msp430说明。
解决阻塞的办法之一是可以使用Task,Task使用post来调用,有些类似于单片机的delay()。post 操作把任务放置到一个以先进先出为处理方式的内部任务队列中去,当一个任务开始执行的时候,只有它运行结束,下一个任务才能开始运行。因此,一个任务不应该占用或阻塞太长时间。例子代码如下:
implementation{
…
task void computeTask() {
uint32_t i;
for (i = 0; i < 400001; i++) {}
}
event void Timer0.fired() {
call Leds.led0Toggle();
post computeTask();
}
...
实现效果是红灯闪烁,绿灯蓝灯仍不会亮。原因还是因为40000次循环占用了太多的CPU。
更好地解决办法是split-phase操作。在阻塞系统中,当一个调用长时间运行的操作时,只有操作完成时调用才会返回;而在split-phase系统中,调用会立即返回,当操作完成会发出一个回调函数告知运算完毕。例子代码如下:
uint32_t i;
task void computeTask() {
uint32_t start = i;
for (;i < start + 10000 && i < 400001; i++) {}
if (i >= 400000) {
i = 0;
}
else {
post computeTask();
}
}
实现效果是各灯都正常闪烁。split-phase操作将400001次计算分片成若干个片,让每一片分别执行post操作,使得一个大任务分割成各个小任务,从而解决了因为大量的计算而造成的阻塞问题。
event void Timer0.fired(){
unit32_t i;
for(i=0; i<400001; i++)
call Leds.led0Toggle();
}
该例子程序所要实现的效果是红绿蓝三个灯按自己的循环周期进行闪烁,但由于上面的代码中,for循环了400000次,从而大量占据了CPU,使得led1和led2被阻塞,则最后实现的效果是红灯长亮,绿蓝两个灯无反应。具体的CPU相关参数,可以查询TI公司的msp430说明。
解决阻塞的办法之一是可以使用Task,Task使用post来调用,有些类似于单片机的delay()。post 操作把任务放置到一个以先进先出为处理方式的内部任务队列中去,当一个任务开始执行的时候,只有它运行结束,下一个任务才能开始运行。因此,一个任务不应该占用或阻塞太长时间。例子代码如下:
implementation{
…
task void computeTask() {
uint32_t i;
for (i = 0; i < 400001; i++) {}
}
event void Timer0.fired() {
call Leds.led0Toggle();
post computeTask();
}
...
实现效果是红灯闪烁,绿灯蓝灯仍不会亮。原因还是因为40000次循环占用了太多的CPU。
更好地解决办法是split-phase操作。在阻塞系统中,当一个调用长时间运行的操作时,只有操作完成时调用才会返回;而在split-phase系统中,调用会立即返回,当操作完成会发出一个回调函数告知运算完毕。例子代码如下:
uint32_t i;
task void computeTask() {
uint32_t start = i;
for (;i < start + 10000 && i < 400001; i++) {}
if (i >= 400000) {
i = 0;
}
else {
post computeTask();
}
}
实现效果是各灯都正常闪烁。split-phase操作将400001次计算分片成若干个片,让每一片分别执行post操作,使得一个大任务分割成各个小任务,从而解决了因为大量的计算而造成的阻塞问题。
相关文章推荐
- zookeeper学习心得二:同步与异步
- Linux学习心得之——Rsync同步配置
- C#文件同步学习心得
- mysql主从同步延迟方案解决的学习心得
- 学习数据库同步个人心得
- mysql主从同步延迟方案解决的学习心得
- 单片机中断学习心得
- 学习TLD一点心得
- vue 学习心得
- syslog-ng学习心得之一
- WEB表单设计学习心得
- java学习之心得体会
- CPPUnit 学习心得
- 3ds max sdk学习心得(一)
- acegi学习心得:httpSessionContextIntegrationFilter
- 【Java学习心得】之编程计算1!+2!+3!+...+100!
- 毕业设计制作过程中的学习心得(有asp和jsp)
- Java I/O学习心得一
- DMA及cache一致性的学习心得
- 关于iOS自动布局学习心得