Я написал следующую программу на C ++ для MBED в качестве эксперимента для более детального проекта, над которым я работаю для своего микроконтроллера Nucleoboard:
#include "mbed.h"
DigitalOut greenLed(PA_5);
#include "mbed.h"class TimedLED
{
public:
TimedLED()
{
Ticker t;
t.attach_us(this, &TimedLED::flip, 1000000);
}
void flip(void)
{
static int count = 0;
greenLed.write(count%2); //-- toggle greenLed
count++;
}
};
int main()
{
TimedLED flash;
while (1);
}
Все ссылки, на которые я смотрел, показывали, что t.attach_us (это, &TimedLED :: flip, 1000000) должен вызывать метод, «переворачивать» каждую секунду, поэтому светодиод должен включаться и выключаться. Однако этого не происходит. Я не вижу, в чем проблема. Я надеюсь, что кто-то может помочь мне прояснить это.
Я получаю следующее предупреждающее сообщение о том, что этот формат устарел, но ссылка на документацию не работает, поэтому я не могу получить более подробную информацию:
Function "mbed::Ticker::attach_us(T *, M, us_timestamp_t) [with T=TimedLED, M=void(TimedLED::*)()]" (declared at /extras/mbed_fd96258d940d/drivers/Ticker.h:122) was declared "deprecated" "t.attach_us(this, &TimedLED::flip, 1000000);"
Даже если он устарел, он все равно должен работать, не так ли? Кроме того, предположительно, если сообщение об устаревании является правильным, есть более новый способ сделать то же самое. Я не могу найти ссылку на альтернативный метод, хотя нигде.
Вы заявляете Ticker t;
в вашем конструкторе в стеке, когда конструктор выходит, он очистит объект, и, следовательно, код не будет запущен.
Объявите переменную в вашем классе, и она будет работать как положено:
class TimedLED
{
public:
TimedLED()
{
t.attach(callback(this, &TimedLED::flip), 1.0f);
}
void flip(void)
{
static int count = 0;
greenLed.write(count%2); //-- toggle greenLed
count++;
}
private:
Ticker t;
};
Также обратите внимание на изменение в конструкторе, это предпочтительный (не осуждаемый) способ присоединения обратных вызовов в mbed OS 5.
Других решений пока нет …