2016年5月22日日曜日

mbedのRTOSとprintf(メモ)

#include "mbed.h"
#include "rtos.h"

#define TICKER_PERIOD   (0.5)

Ticker toggle_pin_ticker;
Timer timer;
DigitalOut led(LED1);

//RTOSを使ったプログラムでSerialオブジェクトを実体化すると割り込み(toggle_pin())が効かなくなる。
//Thread(led_thread())は動作する。
//Serial pc(SERIAL_TX, SERIAL_RX);

void led_thread(void const *argument)
{
    while (true) {
        Thread::signal_wait(0x1);
        //Serialのメソッドではなくstdioのprintf()を使う。
        printf("in led_thread: %f\r\n", timer.read());
    }
}

void toggle_pin()
{
    led = !led;
    //ISR内でprintf()は使わないこと。
    //printf("in toggle_pin() isr: %f\r\n", timer.read());
}

int main()
{
    Thread thread(led_thread);
    timer.start();
    toggle_pin_ticker.attach(&toggle_pin, TICKER_PERIOD);
    while (true) {
        Thread::wait(1000);
        thread.signal_set(0x1);
    }
}