NLe*_*Led 10 c for-loop sensor infinite
我有一个重要的无限循环,允许传感器不断更新其值.但是,当另一个传感器带来新值时,我想打破这个循环.如何从一个无限循环切换到另一个?
当前代码:
for(;;){
SON_Start();
// Wait 65ms for max range time
delay10ms(7);
// Read Range
i = SON_Read(SON_ADDRESSES[sonarReading]);
// pause
delayMs(100);
if(i<15)
drive(200, RadCW);
}
Run Code Online (Sandbox Code Playgroud)
我想补充一下:
如果Sensor2返回一个读数(例如Sensor2 > 20),那么我想打破循环并转到另一个无限for循环来开始一个新函数.
Lih*_*ihO 28
如果您正在寻找"在2个无限循环之间切换",它可以被第三个循环"包裹",这个"切换"可以通过简单的方式完成break.
但是因为你希望你的程序有一天停止,所以这个循环可以放在函数中,你可以return;用来结束它:
void myMagicLoop()
{
for(;;)
{
for(;;)
{
if ( I should stop )
return;
if ( I should switch to second loop )
break;
}
for(;;)
{
if ( I should stop )
return;
if ( I should switch back to first loop)
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在某个地方,你只需要打电话:
myMagicLoop();
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
这将在循环A和循环B之间切换.
for (;;)
{
// Loop A
for (;;)
{
if WANT_TO_SWITCH
{
break;
}
}
// Loop B
for (;;)
{
if WANT_TO_SWITCH
{
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你break;用来打破一个循环并将控制权传递到它的右大括号之外.例如
for(;;) {
if( whatever ) {
break;
}
}
//break gets you here
Run Code Online (Sandbox Code Playgroud)
或者,您可以考虑使用事件驱动的方法来重写它。当然,这将取决于硬件的能力,但是至少您应该能够产生一些计时器事件。
然后代码将如下所示:
static volatile bool sensor_1_ready;
static volatile bool sensor_2_ready;
for(;;)
{
switch(state_machine)
{
case READING_SENSOR_1:
if(sensor_2_ready)
{
state_machine = READING_SENSOR_2;
}
else if(sensor_1_ready)
{
process sensor 1
}
break;
case READING_SENSOR_2:
if(!sensor_2_ready && some_timeout_etc)
{
state_machine = READING_SENSOR_1;
}
else if(sensor_2_ready)
{
process sensor 2
}
break;
}
}
void callback_sensor_1 (void) // some sort of interrupt or callback function
{
sensor_1_ready = true;
}
void callback_sensor_2 (void) // some sort of interrupt or callback function
{
sensor_2_ready = true;
}
Run Code Online (Sandbox Code Playgroud)
(在对volatile变量发表评论之前,请注意volatile可以防止危险的编译器优化,而不用作某些互斥保护/原子访问/内存屏障等。)
| 归档时间: |
|
| 查看次数: |
16441 次 |
| 最近记录: |