realtime process control with RTOS

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

Revision:
21:967504024346
Parent:
20:13fcc82f4cab
Child:
22:f0164a2a09b0
--- a/main.cpp	Tue Oct 02 03:04:57 2018 +0000
+++ b/main.cpp	Thu Oct 04 02:05:55 2018 +0000
@@ -3,6 +3,7 @@
 //
 //  20161027 ... v1.0 ... originally written by Y.Kuroda for Mechatronics
 //  20180917 ... v2.0 ... customised for Jikken1(mbed LPC1768専用)
+//  20181004 ... v2.1 ... RtosTimer
 //
 #include "mbed.h"
 
@@ -37,12 +38,16 @@
 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;
     }
 }
 
@@ -65,6 +70,8 @@
     pulsewave.period_ms(delta_t);   // パルス波の周期の設定
     squarewave.write(0.5F);         // duty比
     pulsewave.write(0.1F);          // duty比
+    rt->stop();
+    rt->start(delta_t);
 }
 
 //  デジタル入力割り込みハンドラ...デジタル入力信号の状態が変化した時に呼び出される
@@ -73,12 +80,20 @@
     led2 = din2;
 }    
 
+void rtos_catcher(void const* n) {
+    led4=1;
+    thread_dt->signal_set(SIG_MYT);  // スレッドへ再開シグナルを送る
+}
+
 int main() {
     squarewave.period_ms(delta_t);  // 初期周期の設定
     pulsewave.period_ms(delta_t);   // 初期周期の設定
     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.rise(pinstate_handler);// 周期設定ハンドラの設定.
     samplingtime_MSB.fall(pinstate_handler);// 設定ピンの状態変化で
     samplingtime_LSB.rise(pinstate_handler);// ハンドラが呼び出される
@@ -92,11 +107,11 @@
     din2.rise(&din_handler);            // が呼ばれる
     din2.fall(&din_handler);
 
-    Thread thread_dt(sampling_thread);  // サンプリング処理スレッドを起動
+    thread_dt = new Thread(sampling_thread);  // サンプリング処理スレッドを起動
 
     while(true){
         Thread::wait(delta_t);          // mainスレッドの時間間隔の設定[ms]
-        thread_dt.signal_set(SIG_MYT);  // スレッドへ再開シグナルを送る
-        led4 = !led4;                   // 処理の先頭でLEDをを点滅
+//        thread_dt.signal_set(SIG_MYT);  // スレッドへ再開シグナルを送る
+//        led4 = !led4;                   // 処理の先頭でLEDをを点滅
     }
 }
\ No newline at end of file