C ++:这两个类不同时运行

时间:2017-03-22 17:58:39

标签: c++ multithreading mbed

这是我第一次来这里。我的代码假设使用mbed使两个超声波传感器同时起作用。但是,我似乎无法使两个类在同时运行的代码中使us_right()和void us_left()无效。请帮助:(

#include "mbed.h"
DigitalOut triggerRight(p9); 
DigitalIn echoRight(p10);
DigitalOut triggerLeft(p13); 
DigitalIn echoLeft(p14);
//DigitalOut myled(LED1); //monitor trigger
//DigitalOut myled2(LED2); //monitor echo
PwmOut steering(p21);
PwmOut velocity(p22);
int distanceRight = 0, distanceLeft = 0;
int correctionRight = 0, correctionLeft = 0;
Timer sonarRight, sonarLeft;

float vo=0;

// Velocity expects -1 (reverse) to +1 (forward)
void Velocity(float v) {
    v=v+1;
    if (v>=0 && v<=2) {
        if (vo>=1 && v<1) {                 //
            velocity.pulsewidth(0.0014);    // this is required to
            wait(0.1);                      //
            velocity.pulsewidth(0.0015);    // move into reverse
            wait(0.1);                      //
        }                                   //
        velocity.pulsewidth(v/2000+0.001);
        vo=v;
    }
}

// Steering expects -1 (left) to +1 (right)
void Steering(float s) {
    s=s+1;
    if (s>=0 && s<=2) {
        steering.pulsewidth(s/2000+0.001);
    }
}

void us_right() {
    sonarRight.reset();
    sonarRight.start();
    while (echoRight==2) {};
    sonarRight.stop();
    correctionRight = sonarLeft.read_us();
    triggerRight = 1;
    sonarRight.reset();
    wait_us(10.0);
    triggerRight = 0;
    while (echoRight==0) {};
  //  myled2=echoRight;
    sonarRight.start();
    while (echoRight==1) {};
    sonarRight.stop();
    distanceRight = ((sonarRight.read_us()-correctionRight)/58.0);
    printf("Distance from Right is: %d cm \n\r",distanceRight);
}

void us_left() {
    sonarLeft.reset();
    sonarLeft.start();
    while (echoLeft==2) {};
    sonarLeft.stop();
    correctionLeft = sonarLeft.read_us();
    triggerLeft = 1;
    sonarLeft.reset();
    wait_us(10.0);
    triggerLeft = 0;
    while (echoLeft==0) {};
  //  myled2=echoLeft;
    sonarLeft.start();
    while (echoLeft==1) {};
    sonarLeft.stop();
    distanceLeft = (sonarLeft.read_us()-correctionLeft)/58.0;
    printf("Distance from Left is: %d cm \n\r",distanceLeft);
}

int main() {
    while(true) {
        us_right();
        us_left();
    }
   if (distanceLeft < 10 || distanceRight < 10) {
            if (distanceLeft < distanceRight) {
                for(int i=0; i>-100; i--) {       // Go left
                    Steering(i/100.0);
                    wait(0.1);
                }
            }
            if (distanceLeft > distanceRight) {
                for(int i=0; i>100; i++) {       // Go Right
                    Steering(i/100.0);
                    wait(0.1);
                }
            }              
    }
        wait(0.2);
}

3 个答案:

答案 0 :(得分:0)

您需要使用某种机制来创建新线程或进程。您的实现是顺序的,没有任何操作可以告诉代码并发运行。

你应该看看一些线程库(例如pthreads,或者如果你有权访问c ++ 11,那里有线程功能)或者如何创建新进程以及某些消息传递接口这些过程。

答案 1 :(得分:0)

Create two threads, one for each ultrasonic sensor:

void read_left_sensor() {
    while (1) {
        // do the reading
        wait(0.5f);
    }
}

int main() {
    Thread left_thread;
    left_thread.start(&read_left_sensor);

    Thread right_thread;
    right_thread.start(&read_right_sensor);

    while (1) {
        // put your control code for the vehicle here
        wait(0.1f);
    }
}

You can use global variables to write to when reading the sensor, and read them in your main loop. The memory is shared.

答案 2 :(得分:0)

你的第一个问题是你已经将代码置于无限while(true)循环之外。以后的代码永远不会运行。但也许你知道这一点。

int main() {

    while(true) {
        us_right();
        us_left();
    } // <- Loops back to the start of while()

   // You Never pass this point!!!

   if (distanceLeft < 10 || distanceRight < 10) {
            // Do stuff etc.
   }
   wait(0.2);
}

但是,我认为你期望us_right()和us_left()完全同时发生。您无法在顺序环境中执行此操作。

Jan Jongboom建议你可以使用Threads是正确的。这允许&#39; OS&#39;为每段代码指定运行时间。但它仍然不是真正平行的。每个函数(类都是不同的东西)都有机会运行。一个将运行,当它完成(或在等待期间)时,另一个函数将有机会运行。

当您使用mbed时,我建议您的项目是 MBED OS 5项目 (您在开始新项目时选择此项)。否则,您将需要使用RTOS库。有一个使用线程的眨眼示例应该很好地总结。 Here is more info

线程对没有经验的人来说可能是危险的。所以坚持一个简单的实现开始。确保您了解您的行为/原因/方式。

旁白:从硬件角度来看,并行运行超声波传感器实际上并不理想。它们都以相同的频率广播,并且可以互相听到。同时触发它们,它们互相干扰。

想象一下,两个人在一个封闭的房间里大喊大叫。如果他们轮流,他们所说的将是显而易见的。如果他们同时大声喊叫,那将非常困难!

实际上,不能并行运行可能是一件好事。