realtime process control with RTOS
Fork of mbed-os-example-mbed5-blinky by
Diff: main.cpp
- Revision:
- 22:f0164a2a09b0
- Parent:
- 21:967504024346
- Child:
- 23:bc5ad77d56bb
--- a/main.cpp Thu Oct 04 02:05:55 2018 +0000 +++ b/main.cpp Thu Oct 04 03:23:22 2018 +0000 @@ -3,21 +3,20 @@ // // 20161027 ... v1.0 ... originally written by Y.Kuroda for Mechatronics // 20180917 ... v2.0 ... customised for Jikken1(mbed LPC1768専用) -// 20181004 ... v2.1 ... RtosTimer +// 20181004 ... v3.0 ... uses EventQueue // #include "mbed.h" -const int DELTA_T = 1; // mainスレッドの時間間隔の設定[ms](デフォルトは1ms) +const int DELTA_T = 1000; // mainスレッドの時間間隔の設定[ms](デフォルトは1ms) int delta_t = DELTA_T; int qbits = 6; // 量子化シフト値 -const int SIG_MYT = 0x1; // signal番号 DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); // p11,12 サンプリング周期設定ピン(デフォルトは0) -// p11上位ビット,p12下位ビット.0:1kHz, 1: 100Hz, 2: 10Hz, 3: 1Hz +// p11上位ビット,p12下位ビット.0:1kHz, 1: 100Hz, 2: 10Hz, 3: 1Hz InterruptIn samplingtime_MSB(p11); InterruptIn samplingtime_LSB(p12); @@ -38,17 +37,11 @@ PwmOut squarewave(p23); PwmOut pulsewave(p24); -RtosTimer* rt; -Thread* thread_dt; // サンプリング処理スレッドを起動 - // サンプリング処理をするスレッド(時間管理された処理) -void sampling_thread(const void* arg) { - while(true){ - Thread::signal_wait(SIG_MYT); // シグナルを待つ - unsigned short a_data = ain.read_u16(); // AD入力(ADは12ビット) - aout.write_u16((a_data>>qbits)<<qbits);// DA出力(量子化粒度はピンにより設定) - led4=0; - } +void sampling_job(const void* arg) { + unsigned short a_data = ain.read_u16(); // AD入力(ADは12ビット) + aout.write_u16((a_data>>qbits)<<qbits);// DA出力(量子化粒度はピンにより設定) + led4=!led4; } // 量子化粒度設定ハンドラ @@ -58,31 +51,24 @@ int quantization = (quantization_MSB<<1)&0x2|quantization_LSB&0x1; qbits = 6+quantization*4; // 量子化サイズの決定 // (デジタル出力時の量子化サイズは 0:1024, 1:256, 2:64, 3:16 steps) -} +} // サンプリングタイム設定割り込みハンドラ...時間設定ピンの状態が変化した時に呼び出される void pinstate_handler(void) { // ピンの状態を読み取り,2ビット値に変換 int samplingtime = (samplingtime_MSB<<1)&0x2|samplingtime_LSB&0x1; - // 制御周期を10^nとする(n=0:1s, n=1:0.1s, n=2:0.01s, n=3:0.001s) + // 制御周期を10^nとする(n=0:1s, n=1:0.1s, n=2:0.01s, n=3:0.001s) delta_t = (int)pow(10.0,(double)samplingtime); squarewave.period_ms(delta_t); // 方形波の周期の設定 pulsewave.period_ms(delta_t); // パルス波の周期の設定 squarewave.write(0.5F); // duty比 pulsewave.write(0.1F); // duty比 - rt->stop(); - rt->start(delta_t); } // デジタル入力割り込みハンドラ...デジタル入力信号の状態が変化した時に呼び出される void din_handler(void) { led1 = din1; // ピンの状態をそのままLEDの点灯状態にする led2 = din2; -} - -void rtos_catcher(void const* n) { - led4=1; - thread_dt->signal_set(SIG_MYT); // スレッドへ再開シグナルを送る } int main() { @@ -91,13 +77,18 @@ squarewave.write(0.5F); // 初期duty比(方形波=50%) pulsewave.write(0.1F); // 初期duty比(パルス波=10%) - rt = new RtosTimer(rtos_catcher, osTimerPeriodic, (void*)0); - rt->start(delta_t); - + samplingtime_MSB.disable_irq(); + samplingtime_MSB.mode(PullDown); samplingtime_MSB.rise(pinstate_handler);// 周期設定ハンドラの設定. samplingtime_MSB.fall(pinstate_handler);// 設定ピンの状態変化で + samplingtime_MSB.enable_irq(); + + samplingtime_LSB.disable_irq(); + samplingtime_LSB.mode(PullDown); samplingtime_LSB.rise(pinstate_handler);// ハンドラが呼び出される samplingtime_LSB.fall(pinstate_handler);// ようにする + samplingtime_LSB.enable_irq(); + quantization_MSB.rise(qsize_handler); // 量子化粒度設定ハンドラの設定 quantization_MSB.fall(qsize_handler); quantization_LSB.rise(qsize_handler); @@ -107,11 +98,7 @@ din2.rise(&din_handler); // が呼ばれる din2.fall(&din_handler); - thread_dt = new Thread(sampling_thread); // サンプリング処理スレッドを起動 - - while(true){ - Thread::wait(delta_t); // mainスレッドの時間間隔の設定[ms] -// thread_dt.signal_set(SIG_MYT); // スレッドへ再開シグナルを送る -// led4 = !led4; // 処理の先頭でLEDをを点滅 - } + EventQueue queue; + queue.call_every(DELTA_T, sampling_job, (void*)0); + queue.dispatch(); } \ No newline at end of file