假设有如下的情境,机器人听到一个响声后开始前进,直到听到另一个响声后停止移动。 首先,将声音传感器连接到端口 2: - #define THRESHOLD 38 #define SOUND SENSOR_2 Task main() {While(true) {
- SetSensorSound(IN_2);
- Until(SOUND > THRESHOLD); OnFwd(OUT_AC, 60); Wait(320); Until(SOUND > THRESHOLD); Off(OUT_AC);
- Wait(320);
- }}
复制代码
我想请教的是:
在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
|