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
Post a Comment