找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 5997|回复: 7

请教:NXC中是否有阻塞模式和非阻塞模式的区别?

[复制链接]
发表于 2010-11-7 09:40:25 | 显示全部楼层 |阅读模式
假设有如下的情境,机器人听到一个响声后开始前进,直到听到另一个响声后停止移动。 首先,将声音传感器连接到端口 2:
  1. #define THRESHOLD 38 #define SOUND SENSOR_2 Task main() {While(true) {

  2. SetSensorSound(IN_2);
  3. Until(SOUND > THRESHOLD); OnFwd(OUT_AC, 60); Wait(320); Until(SOUND > THRESHOLD); Off(OUT_AC);
  4. Wait(320);
  5. }}
复制代码

我想请教的是:
在NXC提供的API中,像获得传感器值的方法是阻塞式函数调用还是非阻塞式的阿?
比如Until(SOUND > THRESHOLD);这个代码中的SOUND > THRESHOLD是立即返回当前值呢?还是等到有声音的时候再返回?可能这个比喻不对.那我们假设这个是个按钮传感器,能否有个函数在按钮触发的时候再返回,没触发的时候就hold住代码的执行,这样就没必要sleep了.

这两个非常大的区别就是:
1.阻塞式不需要wait或者sleep,或者高级点的不需要while(true){sleep},这样不会出现处理器BusyLoop的情况,BusyLoop会消耗掉CPU资源,因为执行while的时候,代码是运行在用户空间的,而非内核空间.Linux系统是这样处理的.如果有读过epool模型的同学可能会知道我说的意思,就是调度由内核接管,但光线或者按钮触发器到达某个值或者被触发的时候,系统回调你设置的函数,而不需要你while(true)去轮询.

2.如果是非阻塞式,CPU的执行效率不就会大大降低了?大部分时间都在做sleep的循环.那么我们启动多个Task的时候,好像NXC中task和计算机编程中的thread一样(见这段:The NXT supports multi-threading, so a task in NXC directly corresponds to an NXT thread.)那么将有很多个同时sleep或者wait的代码,如果内核调度策略是串行的,那么sleep的时间将是不准确的,比如有10个并行的sleep(5秒),可能会有出现第10个task实际上是sleep(10*5秒).一种假设而已.




刚涉足乐高机器人,很着迷,请大家帮忙入门.谢谢了!


我的MSN是:cuizheng.hz@hotmail.com
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2010-11-7 20:53:12 | 显示全部楼层
楼上朋友好像是嵌入式系统的高人,在下不才,还未了解你的阻塞与不阻塞,但是那个until其实就是一个while的宏定义,另一种写法而已,他是每循环一次查询一次,按照你的讲法应该属于阻塞式,另外你说的非阻塞,我觉得应该是属于中断模式,在这里不是的。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2010-11-7 22:44:26 | 显示全部楼层
本帖最后由 charlescui 于 2010-11-7 22:45 编辑

Regards!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2010-11-7 22:45:18 | 显示全部楼层
糖伯虎 发表于 2010-11-7 20:53
楼上朋友好像是嵌入式系统的高人,在下不才,还未了解你的阻塞与不阻塞,但是那个until其实就是一个while的 ...

谢谢楼上的回答,

我是刚刚在淘宝下了单,买的是8547,等货到了实战一下的时候试试吧.

很高兴能和大家聊这方面的知识,我一直在IT界混,现在想用业余时间专注下机器人这些可爱的东西.

再请教一个问题:

我买的是8547套装,能否和9797以及9695等其他套装配合使用阿?是不是乐高所有的套装接口都通用的?

Regards!

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-11-8 15:50:59 | 显示全部楼层
回复 charlescui 的帖子

乐高的所有积木是肯定通用的(duplo 等baby系列除外...),接口的话是有分种类的.有RCX的积木式接口,NXT的水晶头式接口,还有新能源系列的怪异型接口....
如果你一直买的是NXT和RCX系列的,就不用担心了,因为NXT和RCX接口在9797里面有转换线.
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2010-11-8 21:18:15 | 显示全部楼层
394069341 发表于 2010-11-8 15:50
回复 charlescui 的帖子

乐高的所有积木是肯定通用的(duplo 等baby系列除外...),接口的话是有分种类的.有R ...

谢谢楼上,我说的接口还包括积木对接的接口.
比如8547是否和9797的积木通用?
或者说8547能否和这一套http://item.taobao.com/item.htm?id=4355890232超级跑车积木通用?

我能否用这套超级跑车的积木配合NXT做出跑车机器人呢?我指能否拼接起来,暂时不管通讯接口是水晶头还是USB.

因为我想买一些其他套装积木来补充8547,不知道这样是否可以.
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2010-11-9 15:17:39 | 显示全部楼层
我的8547到了哈哈哈哈!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-11-9 15:49:11 | 显示全部楼层
回复 charlescui 的帖子

乐高的积木和梁都是通用的
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-5-6 00:32 , Processed in 0.079151 second(s), 18 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表