FreeRTOS acting strange inside C++ Wrappers


code: [select]
hello everyone,

 i trying build simple radar servo motor , ultrasonic sensor. when not use c++ wrappers code works fine.



[code language="cpp"]
#include <servo.h>
#include <arduino_freertos.h>
#include <radar.h>
#include <ultrasonicsensor.h>

#define trigpin 52
#define echopin 53
#define servopin 10

servo servomotor;
ultrasonicsensor ultrasonicsensor(trigpin, echopin);
radar radar(&ultrasonicsensor, &servomotor);

void ultrasonicsensorthread(void* pvparameters)
{
  uint8_t distance;
 
  while (true)
  {
    ultrasonicsensor.read(&distance);
    serial.print("distance: ");
    serial.println(distance);
  }
}

void servothread(void* pvparameters)
{
  uint8_t angle;
 
  while (true)
  {
    ( angle = 0; angle < 180; ++angle )
    {
      servomotor.write(angle);
      vtaskdelay(20 / porttick_period_ms);
    }
   
    ( angle = 180; angle > 0; --angle )
    {
      servomotor.write(angle);
      vtaskdelay(20 / porttick_period_ms);
    }
  }
}


void setup()
{
  serial.begin (9600);
  pinmode(trigpin, output);
  pinmode(echopin, input);

  servomotor.attach(servopin);

  xtaskcreate(
  servothread
  ,  (const portchar *)"servo"   // name humans
  ,  128  // stack size
  ,  null
  ,  2  // priority
  ,  null );
 
  xtaskcreate(
  ultrasonicsensorthread
  ,  (const portchar *)"ultrasonic"   // name humans
  ,  128  // stack size
  ,  null
  ,  2  // priority
  ,  null );

  vtaskstartscheduler();
}

void loop()
{
   
}



when try use same code inside cpp wrappers, servo doesn't work propery (moving clockwise) , ultrasonic detects objects delay.

[code language="cpp"]
#include <servo.h>
#include <arduino_freertos.h>
#include <radar.h>
#include <ultrasonicsensor.h>

#define trigpin 52
#define echopin 53
#define servopin 10

servo servomotor;
ultrasonicsensor ultrasonicsensor(trigpin, echopin);
radar radar(&ultrasonicsensor, &servomotor);

void radarthread(void* pvparameters)
{
  uint8_t distance;
  uint8_t angle;
 
  while (true)
  {
    radar.read(&distance, &angle);
    serial.print("distance: ");
    serial.println(distance);
    serial.print("angle: ");
    serial.println(angle);
  }
}

void setup()
{
  serial.begin (9600);
  pinmode(trigpin, output);
  pinmode(echopin, input);

  servomotor.attach(servopin);

  xtaskcreate(
  radarthread
  ,  (const portchar *)"raar"   // name humans
  ,  128  // stack size
  ,  null
  ,  2  // priority
  ,  null );
 
  vtaskstartscheduler();
}

void loop()
{
   
}

[/code]

here radar class


[code language="cpp"]


[/code]
#ifndef _radar_h_
#define _radar_h_

#include <stdint.h>

class servo;
class ultrasonicsensor;

class radar
{
   private:
      ultrasonicsensor* ultrasonicsensor;
      servo* servo;
      static radar* sinstance;
      uint8_t objectdistance;
      uint8_t objectangle;
   
   public:
      radar(ultrasonicsensor* ultrasonicsensor, servo* servo);
      static int8_t read(uint8_t* distance, uint8_t* angleindegres);
   
   private:
      static void ultrasonicthread(void* parameter);
      static void servothread(void* parameter);
};

#endif


[code language="cpp"]

/*
 * radar.cpp
 *
 * created: 7/30/2017 2:06:20 pm
 *  author: fairenough
 */

#include <util/delay.h>
#include "radar.h"
#include <arduino_freertos.h>
#include <servo.h>
#include "ultrasonicsensor.h"

radar* radar::sinstance = nullptr;

radar::radar(ultrasonicsensor* ultrasonicsensor, servo* servo)
{
   this->ultrasonicsensor = ultrasonicsensor;
   this->servo = servo;
   
   this->objectangle = 0;
   this->objectdistance = 0;
   
   radar::sinstance = this;
      
   xtaskcreate(
   radar::ultrasonicthread
   ,  null  // name humans
   ,  128  // stack size
   ,  null
   ,  2  // priority
   ,  null );
   
   xtaskcreate(
   radar::servothread
   ,  null  // name humans
   ,  128  // stack size
   ,  null
   ,  2  // priority
   ,  null );
}

int8_t radar::read(uint8_t* distance, uint8_t* angleindegres)
{   
   *angleindegres = radar::sinstance->objectangle;   
   *distance = radar::sinstance->objectdistance;
   
   return 0;
}

void radar::ultrasonicthread(void* parameter)
{
   while (true)
   {
      radar::sinstance->ultrasonicsensor->read( &(radar::sinstance->objectdistance) );
   }
}

void radar::servothread(void* parameter)
{
   int8_t angle;
   
   while (true)
   {
      for ( angle = 0; angle < 180; ++angle )
      {
        radar::sinstance->servo->write(angle);
        radar::sinstance->objectangle = angle;
        vtaskdelay(20 / porttick_period_ms);
      }
      
      for ( angle = 180; angle > 0; --angle )
      {
        radar::sinstance->servo->write(angle);
        radar::sinstance->objectangle = angle;
        vtaskdelay(20 / porttick_period_ms);
      }
   }
}


[/code]

do need use rtos library ?


Arduino Forum > Using Arduino > Programming Questions > FreeRTOS acting strange inside C++ Wrappers


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts