realtime process control with RTOS

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

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