Electoday 2025

ประกาศ => Projects => Topic started by: AppleIIe on August 22, 2013, 06:16:15 PM

Title: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on August 22, 2013, 06:16:15 PM
   สำหรับน้องๆ เรื่องนี้อาจจะยังไหม่และไม่ใช่เรื่องพื้นฐานแน่ๆ ถ้ายังมือใหม่แนะนำขอให้ข้ามหัวข้อนี้ไปก่อนครับ หากสนใจก็ยินดีครับ
   ข้อดีของการใช้ Co-operative multitasking ด้วย state machine คือใช้กับ cpu/mcu ขนาดเล็ก ที่มี resource น้อย ข้อจำกัดมากได้ดี ทำงานซับซ้อนเกือบเทียบเท่าการใช้ RTOS เลย
   ในการเขียนโปรแกรมแบบ Co-operative multitasking ในเรื่องหนึ่งที่สำคัญคือการใช้ state machine เพื่อใช้การทำการ code
แต่เนื่องด้วย code ที่เป็นพื้นฐานด้านการเขียนในแนว state machine ค่อนข้างจะน้อย หนังสือก็น้อย อาจเป็นเพราะเข้าใจยากและไม่ใช่เรื่องพื้นฐานนัก จึงอยากจะขอแนะนำ code ที่เป็น state machine แบบเบื้องต้น ทำให้ดูง่าย(เท่าที่จะทำได้) และหลายๆท่านในนี้ อาจจะชำนาญแล้วด้วยซ้ำ แต่เห็นว่าน่าจะยังมีอีกส่วนหนึ่งที่ยังไม่มีโอกาศได้รู้จึงนำมาเสนอกัน และผมได้ทำการประยุกต์ปรับปรุงให้ดูง่ายพอที่จะนำเสนอได้ ส่วนถ้าเป็นรายละเอียดทั้งหมดของเรื่องนี้ ขอแนะนำให้ดูจากหนังสือที่ชื่อ Embededded Multitasking โดย Keith E. Curtis จะเหมาะสมกว่าครับ (หา Download ได้จาก web บางแห่ง หรือหาซื้อมาอ่านก็จะเป็นการดีครับ)
   เนื่องจากกระทู้ก่อนหน้านี้ ทำให้ผมพยายามหาตัวอย่างการเขียนในแนวนี้ ซึ่งเคยทำไว้นานมากแล้ว ซึ่งเกิดโดยอาศัยข้อมูลจากนิตยสาร Embedded system programming เพื่อมาเป็นแนวทาง แต่คงหายากมากแล้ว และเ็ป็นบทย่อยๆ ต้องประติดประต่อเอามาก แต่หากสนใจให้อ่านทีุ่่ี่ัั็หนังสือ Embededded Multitasking จะอ่านได้เป็นเรื่องเป็นราวกว่าครับ
  ผมเองได้ทำตัวอย่างไว้กับ MCS-51 แต่อาจนำไปปรับแก้้ให้เป็น CPU หรือ MPU อื่นๆได้เช่น PIC , AVR เพราะใช้แค่ความสามารถของภาษา C ในการทำงาน หากถนัด C อยู่แล้วก็จะง่ายขึ้น แต่ท่านสามารถนำหลักของ state machine ไปประยุกต์กับภาษาือื่นๆก็น่าจะได้ ตามที่ตนถนัดเพียงขอให้เข้าใจในหลักการครับ (แต่พวกหนังสือก็อาจจะอ้างอิงกับ C มากกว่านะครับ)
   ตัวอย่าง Code สาธิตนี้ เพื่อให้ง่ายต่อความเข้่าใจ ผมจึงทำเป็นพวก ไฟกระพริบ กับ Switch กด และใช้ Uart ในการทำงานนะครับ โดย
ผมให้มีการทำงานดังนี้
   1. LED1 กระพริบแบบ Standby mode ( แบบไฟของโทรศัพท์มือถือ )
   2. LED2 กระพริบแบบ Cycle เป็นจังหวะ
   3. LED3 กระพริบแบบ Standby mode หรือ Cycle ตาม Switch กด (กดครั้งที่ 1 เป็น Standby ครั้งที่ 2 เป็น Cycle และสลับไปมา)
   4. Uart ให้รับค่าจาก RS-232 ของ PC (ที่ 9600 BPS) แล้วส่งค่านั้นกลับไปยัง PC อีกครั้ง เหมือน Echo แต่ให้สามารถรับข้อมูลได้ต่อเนื่องได้

Hardware ใช้ MPU กลุ่ม MCS-51 เช่น 89C51 89C2051 อะไรทำนองนี้ จึงขออธิบายเป็นการต่อตามแบบนี้ครับ
(ผมไม่ได้วาดเป็นวงจรไว้่นะครับ คิดว่าน่าจะพอเข้าใจ)

ให้ P1.0 เป็นการควบคุม LED1 , ให้ P1.1 เป็นการควบคุม LED2 , ให้ P1.2 เป็นการควบคุม LED3 โดยการต่อทั้ง 3 ดวงเป็นแบบ กระแส Sink นะครับ  และให้ P1.7 ต่อกับเป็น Switch ส่วนช่อง Uart RXD และ TXD ต่อไปสื่อสารกับ PC ที่ช่อง Comport

เอาละครับ มาดู code กันเลยดีกว่า สำหรับใน Code นี้ผมแก้แล้วให้ใช้ Keil เป็นตัว compile นะครับ (ใครที่ติดเป็น Demo version ก็ใช้ได้เพราะได้ hex file ที่ไม่ใหญ่เลย) หรือท่านอื่นๆอาจจะใช้ compiler ตัวอื่นๆได้ ก็คงแก้ไม่มากนัก
ใน code ผมมีการใช้ Interrupt timer (ช่อง 0) เพียงอย่างเดียวเพื่อทำเรื่องของ state timer แต่ก็มีวิธีที่ไม่ใช้ Interrupt timer ได้ ก็ลองปรับแก้ิูได้ แต่ที่ทำไว้เพื่อความสะดวก และผมคิดว่า้จะมีแง่มุมบางอย่างด้วยครับ ส่วน Uart ไม่ได้ใช้ interrupt เลย อีกอย่าง Code นี้ไม่ได้ทำการ optimize ใดๆ เป็นตัวอย่างเพื่อสร้างความเข้าใจเท่านั้น หากนำไปใช้จริง คงต้องจัดการต่อเองครับ

ผมจะแสดงเน้นเฉพาะ file สำคัญนะครับ

อันนี้เป็น main.c

/*************************************************************************
* File name     : main.c
* Created by    : AppleIIe
* Date created  : 2000/6/26
* Description   : main , io , section
* Notes         : -
*************************************************************************/
/* Include section
* Add all #includes here
*************************************************************************/
#include <REG52.H>              /* special function register declarations   */
                                  /* for the intended 8051 derivative         */
#include "state.h"
#include "main.h"
#include "co_state.h"

/*************************************************************************
* Defines section
* Add all #defines here
*************************************************************************/
#define     XTAL_BASE   110592000
#define     F_CPU       ( XTAL_BASE / 12 )

// timer overflow with 1ms.
#define     T1MS        -( F_CPU / 1000 )

// calculate baud to TH1
#define     UART_BAUD   9600
#define     _BAUD       ( 256 - ( ( F_CPU / 32 ) / UART_BAUD ) )

/*************************************************************************
* Function Prototype Section
* Add prototypes for all functions called by this
* module, with the exception of runtime routines.
*************************************************************************/

/*************************************************************************
                           initialize device
*************************************************************************/
static void init_port(void)
{
    P1 = 0xff;
    P3 = 0xff;
}

//------------------------------------------------------------------------
static void init_uart(void)
{
    SCON = 0x50;                /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD = 0x21;                /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1 = _BAUD;                /* TH1:  reload value for 9600 baud           */
    TR1 = 1;                    /* TR1:  timer 1 run                          */
    TI = 0;                     // CLEAR TI
    ES = 0;                     // uart interrupt
}

//------------------------------------------------------------------------
static void init_timer(void)
{
    // load T1MS
    TMOD = 0x21;                /* TMOD: timer 1, mode 2, 8-bit reload        */
    TL0 = T1MS & 0xff;
    TH0 = T1MS >> 8;
    TR0 = 1;
    ET0 = 1;
}

/*************************************************************************
                         Timer interrupt
*************************************************************************/
static timer_pack _state_time;

void isr_timer0(void) interrupt 1
{
    // load T1MS
    TR0 = 0;
    TL0 = T1MS & 0xff;
    TH0 = T1MS >> 8;
    TR0 = 1;
    _state_time++;
}

timer_pack get_state_timer(void)
{
    timer_pack temp;

    DI;                         // critical
    temp = _state_time;
    EI;                         // end of critical
    return temp;
}

/*************************************************************************
* Function name : void main( void )
* Description   : main loop process
* Notes         : -
*************************************************************************/
void main(void)
{
    timer_pack _time;

    init_port();                // port
    init_uart();                // uart
    init_timer();               // timer with interrupt
    EI;                         // enable interrupt

    // begin of time
    _time = get_state_timer();
    for (;;) {

        // co-operative task without timer
        co_state_task_uart();
        // ... other co-state at here

        // check point of state timer
        {
            if (_time == get_state_timer())
                continue;
            _time++;
        }

        // engine of co-operative task with timer
        co_state_timer_task_led1();
        co_state_timer_task_led2();
        co_state_timer_task_led3();
        co_state_timer_task_button_switch();
        // ... other co-state timer at here
    }
}


file นี้เป็นการทำงานของแต่ละ state machine ครับ co_state.c

/*************************************************************************
* File name     : co_state.c
* Created by    : AppleIIe
* Date created  : 2000/6/26
* Description   : operate with co-state
* Notes         : -
*************************************************************************/
/* Include section
* Add all #includes here
*************************************************************************/
#include <REG52.H>              /* special function register declarations   */
                                  /* for the intended 8051 derivative         */
#include "state.h"
#include "main.h"
#include "co_state.h"

/*************************************************************************
* Defines section
* Add all #defines here
*************************************************************************/
sbit LED1 = P1 ^ 0;
sbit LED2 = P1 ^ 1;
sbit LED3 = P1 ^ 2;

sbit BTN_SW = P1 ^ 7;

#define     ON_LED1     { LED1 = 0; }
#define     OFF_LED1    { LED1 = 1; }

#define     ON_LED2     { LED2 = 0; }
#define     OFF_LED2    { LED2 = 1; }

#define     ON_LED3     { LED3 = 0; }
#define     OFF_LED3    { LED3 = 1; }

/*************************************************************************
* Function Prototype Section
* Add prototypes for all functions called by this
* module, with the exception of runtime routines.
*************************************************************************/

/*************************************************************************
                           Co-state task LED1
*************************************************************************/
void co_state_timer_task_led1(void)
{
    enum { LED_STATE_BEGIN, LED_STATE_1, LED_STATE_2 };
    state_declare;
    state_timer_declare;

    state_timer_process();
    state_switch {
    case LED_STATE_BEGIN:
        // initial co-state at here
        state_jump(LED_STATE_1);        // jump to next state
        return;
    case LED_STATE_1:
        ON_LED1;
        state_delay(T1SEC * 1 / 10, LED_STATE_2);       // delay 100 mS.
        return;
    case LED_STATE_2:
        OFF_LED1;
        state_delay(T1SEC * 1, LED_STATE_1);    // delay 1 Sec.
        return;
    }
}

/*************************************************************************
                           Co-state task LED2
*************************************************************************/
void co_state_timer_task_led2(void)
{
    enum { LED_STATE_BEGIN, LED_STATE_1, LED_STATE_2 };
    state_declare;
    state_timer_declare;

    state_timer_process();
    state_switch {
    case LED_STATE_BEGIN:
        // initial co-state at here
        state_jump(LED_STATE_1);        // jump to next state
        return;
    case LED_STATE_1:
        ON_LED2;
        state_delay(T1SEC * 3 / 10, LED_STATE_2);       // delay 300 mS.
        return;
    case LED_STATE_2:
        OFF_LED2;
        state_delay(T1SEC * 3 / 10, LED_STATE_1);       // delay 300 mS.
        return;
    }
}

/*************************************************************************
                           Co-state task LED3
*************************************************************************/
static bit _led_busy;
void co_state_timer_task_led3(void)
{
    enum { LED_STATE_BEGIN, LED_STATE_MON,
        LED_STATE_STB1, LED_STATE_STB2,
        LED_STATE_BUSY1, LED_STATE_BUSY2
    };
    state_declare;
    state_timer_declare;

    state_timer_process();
    state_switch {
    case LED_STATE_BEGIN:
        // initial co-state at here
        state_jump(LED_STATE_MON);      // jump to next state
        return;
    case LED_STATE_MON:
        if (!_led_busy) {
            state_jump(LED_STATE_STB1);
            return;
        }
        state_jump(LED_STATE_BUSY1);
        return;
    case LED_STATE_STB1:
        ON_LED3;
        state_delay(T1SEC * 1 / 10, LED_STATE_STB2);    // delay 100 mS.
        return;
    case LED_STATE_STB2:
        OFF_LED3;
        state_delay(T1SEC * 1, LED_STATE_MON);  // delay 1 Sec.
        return;
    case LED_STATE_BUSY1:
        ON_LED3;
        state_delay(T1SEC * 3 / 10, LED_STATE_BUSY2);   // delay 300 mS.
        return;
    case LED_STATE_BUSY2:
        OFF_LED3;
        state_delay(T1SEC * 3 / 10, LED_STATE_MON);     // delay 300 mS.
        return;
    }
}

/*************************************************************************
                      co-state task button switch
                    This state will toggle _lcd_busy
*************************************************************************/
static bit get_btn_switch(void);

void co_state_timer_task_button_switch(void)
{
    enum { SW_STATE_BEGIN, SW_STATE_1 };
    state_declare;
    state_timer_declare;

    state_timer_process();
    state_switch {
    case SW_STATE_BEGIN:
        state_jump(SW_STATE_1); // jump to next state
        return;
    case SW_STATE_1:
        if (get_btn_switch())
            _led_busy = !_led_busy;
        state_delay(10, SW_STATE_1);    // debounce 10 ms.
        return;
    }
}

//------------------------------------------------------------------------
// get switch press
static bit get_btn_switch(void)
{
    static bit sw_flg;

    if (BTN_SW) {
        sw_flg = false;
        return false;
    }
    if (sw_flg)
        return false;
    sw_flg = true;
    return true;
}

/*************************************************************************
                           Co-state task uart
*************************************************************************/
static void co_state_task_uart_rx(void);
static void co_state_task_uart_tx(void);

static unsigned char _rx_buff;
static bit _rx_flag;

void co_state_task_uart(void)
{
    co_state_task_uart_rx();
    co_state_task_uart_tx();
}

//------------------------------------------------------------------------
// co-state uart rx
static void co_state_task_uart_rx(void)
{
    enum { RX_STATE_BEGIN, RX_STATE_1 };
    state_declare;

    state_switch {
    case RX_STATE_BEGIN:
        // initial co-state at here
        state_jump(RX_STATE_1); // jump to next state
        return;
    case RX_STATE_1:
        if (RI) {
            RI = 0;
            _rx_buff = SBUF;
            _rx_flag = true;
        }
        return;
    }
}

//------------------------------------------------------------------------
// co-state uart tx
static void co_state_task_uart_tx(void)
{
    enum { TX_STATE_BEGIN, TX_STATE_1, TX_STATE_2 };
    state_declare;

    state_switch {
    case TX_STATE_BEGIN:
        // initial co-state at here
        TI = 0;
        state_jump(TX_STATE_1); // jump to next state
        return;
    case TX_STATE_1:               // wait rx buffer
        if (_rx_flag) {
            SBUF = _rx_buff;
            _rx_flag = false;
            state_jump(TX_STATE_2);     // jump to next state
            return;
        }
        return;
    case TX_STATE_2:               // wait ti flag
        if (TI) {
            TI = 0;
            state_jump(TX_STATE_1);     // jump to next state
            return;
        }
        return;
    }
}


สุดท้าย Header file ที่ชื่อ state.h

#ifndef         STATE_PROCESS_H
#define         STATE_PROCESS_H

/*************************************************************************
* File name     : STATE.H
* Created by    : AppleIIe
* Date created  : 2000/6/26
* Description   : Header of State machine file
* Notes         : define macro for state machine control.
*************************************************************************/
// #include "state_cfg.h"
#define USE_SIMPLE_STATE

#ifdef  USE_SIMPLE_STATE
/*************************************************************************
                Macro for simple state machine control.
*************************************************************************/
typedef unsigned timer_pack;
typedef unsigned char state_pack;

// declare state variable
#define state_declare           static state_pack _state

// jump to other state
#define state_jump( target )  { _state = target; return; }

/*  use this macro in state timer only */
// declare state timer variable
#define state_timer_declare     static timer_pack _state_timer

// process timer of state
#define state_timer_process()  { if ( _state_timer ) { _state_timer--; return; } }
// delay with state timer , alway tmr > 0
#define state_delay(tmr,target) { _state_timer = (tmr)-1; _state = target; return; }
// way of state
#define state_switch    switch ( _state )

/*************************************************************************
                       End of simple state macro
*************************************************************************/
#endif

#endif                          // STATE_PROCESS_H

   
ลองนำไปศึกษาดูก่อนครับ น่าจะไม่ยากนัก
หากท่านใดทดสอบแล้วผลเป็นอย่างไร ก็แนะนำกันได้นะครับ ติชมกันแบบตรงไปตรงมาได้ แต่ขอให้อย่างเป็นประโยชน์และสร้างสรรค์
เพื่อจะได้นำไปเป็นข้อมูลไปทำการปรับปรุงต่อให้สำหรับท่านอื่นๆให้ได้ประโยชน์มากขึ้น และขออภัยหากอธิบายรายละเอียดได้ไม่ดี

Download file ทั้งหมดได้ครับ จากข้างล่างนี้ครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย state machine
Post by: JENG on August 22, 2013, 06:33:16 PM
 :)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย state machine
Post by: AppleIIe on August 22, 2013, 11:54:56 PM
ท่าน Jeng ครับ
จากตัวอย่างนี้ จุดสำคัญของเรื่องที่ท่านสงสัยมาตลอด คือ state ที่ชื่อว่า co_state_task_uart ครับ
ซึ่งจาก Link http://wara.com/article-578.html ที่ท่านเคยแนะนำมาจะทำไม่ได้ดีนักในเรื่องนี้ครับ
ส่วนเรื่อง macro คงไม่มีอะไรใหม่นะครับ เพียงแต่ macro สามารถช่วยให้อธิบายอะไรต่างๆใน code
และนี่คือเสน่ห์ของมัน ซึ่งท่านก็คงจะทราบอยู่แล้ว ถ้าท่านสนใจลองศึกษา macro แบบทำนองนี้ได้จากพวก
Source code จาก Salvo ของ pumpkin  (http://www.pumpkininc.com/) หรือ
OSA ( http://www.pic24.ru/doku.php/en/osa/ref/download/intro ) ซึ่งมีอยู่เยอะครับ และขอบคุณที่ชอบครับ  :)

ใน Code ตัวอย่าง (โชคดีที่ยังเก็บไว้และหาเจอเพราะลืมไปแล้ว แล้วนำมาถกกับท่านได้) ผมได้แฝงมุมมองการเขียน Code เอาไว้ ตามที่เคยถกกันนะครับ เช่น การใช้ Global variable / function โดยใ้ช้เท่าที่จำเป็น , การไม่ได้เรียกว่า task เป็นหลัก และอื่นๆ ลองอ่านดู  เป็นตัวอย่างไว้ในมุมของผมครับ ( อาจไม่ดีที่สุดในทุกเรื่อง แต่ว่าทำให้จัดการอะไรมันง่ายขึ้นครับ และคิดว่าไม่อยากจะอ้างไปที่หลักการใดๆมาก เพราะแนวความคิดที่อาจแตกต่างกันอยู่บ้าง )
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย state machine
Post by: boe on August 22, 2013, 11:57:51 PM
เยี่ยมครับ ขอศึกษาด้วยคน ;)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย state machine
Post by: AppleIIe on August 23, 2013, 05:47:56 AM
Quote from: boe on August 22, 2013, 11:57:51 PM
เยี่ยมครับ ขอศึกษาด้วยคน ;)

เชิญศึกษาได้เลยครับ ต้องขออภัยท่านด้วยที่อาจจะใช้ mpu เก่าไปหน่อย แต่เห็นว่าไม่น่าจะเป็นปัญหา เพราะใช้ภาษา C ที่ไม่ได้อ้างอิงกับ Hardware แบบใด ด้วยหลักการของ State machine นี้ครับ แต่จะให้ดีก็อาจต้องใช้กับพวก Ansi C จะดีกว่า

ความจริงเรื่อง state machine ยังมีแง่มุมในความสามารถทที่ำอะไรได้มากกว่านี้ครับ เช่น การ Call ระหว่าง state  , state ที่มีการ synchronize กันระหว่าง state และอื่นๆ เรียกว่ามี function การทำงานคล้ายๆ RTOS เลยทีเดียว แต่มันจะทำให้เข้าใจได้ยากขึ้น สลับซับซ้อนขึ้น จนอาจทำให้ท้อเสียก่อนครับ เอาเป็นว่าการเริ่มต้นแล้ว เอาเพียงแค่นี้จะดีกว่า

ดังนั้นการเขียน code แบบใช้ state machine จะทำให้เหนื่อยกว่าพวก RTOS มากครับ แต่คุ้มตรงที่ใช้ mcu ตัวเล็กๆได้ดี และในงานที่เหมาะสมครับ ส่วน mcu ระดับกลางๆ เราสามารถใช้ RTOS ร่วมกันกับ state machine ได้ครับ อย่าง FreeRTOS ก็มี state machine นี้แฝงอยู่เรียกว่า Co-routines (http://www.freertos.org/croutine.html) ครับ ทำให้ช่วยในการใช้ Resource ได้น้อยลง (แต่เหนื่อยเพิ่มขึ้นอีกนิดหน่อยครับ)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: jele99 on August 23, 2013, 02:00:28 PM
ขอบคุณ มากเลยครับ ที่สละเวลามาแบ่งปันความรู้ดีๆ
ผมเองก็กำลังจะเริ่มแล้วเหมือนกันครับ เพราะคิดว่าคงอาจจะมีโอกาศได้ใช้บ้างในเร็ววัน
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: ROM on August 23, 2013, 03:37:17 PM
เป็นการใช้ define ที่แปลกดี ไม่เคยเห็นเหมือนกัน  แต่ดูดีจัง คิดได้ไง
ทำให้ใช้ง่ายดี ทำไว้ตั้งแต่ปี 2000 อีกด้วย (เมื่อ 13 ปีก่อนเลย)
เข้าใจแล้วว่าทำไมมันไม่ใช่เรื่องพื้นฐาน แค่ define ก็ยอดเยี่ยมไปเลย
ขอรับไปศึกษาบ้าง ขอบคุณมากครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on August 24, 2013, 07:07:10 AM
ขอบคุณทุกท่านมากครับ ที่ให้ข้อมูลมา และติดตามกัน
ผมจะว่าต่อในเรื่องของการเขียนแบบ state machine ในแบบ simple ตา่มหัวข้อเลยนะครับ
หากท่านได้อ่านจาก code พอเข้าใจแล้วนะครับว่า ใน main จะไปทำ co-state อยู่ 2 แบบ
    1. co-state ที่ไม่ใ้ช้ Timer ใช้กับ co-state task ที่ำทำงานตลอดเวลาไม่อิงกับ Timer ใดๆ
    2. co-state แบบมี Timer เป็นลักษณะของการทำงานแบบ Timer event ใช้สำหรับ co-state task ที่ใช้ีการ Delay มาประกอบกัน
    ส่วนการเขียนใน co-state ต่างๆนั้น เราก็ต้องจัดสรร ให้ถูกว่า จะใช้ co-state แบบไหนให้ตรงกันตามตัวอย่าง
    ส่วนใน function ที่เป็น co_state นั้นท่านก็ใช้ state_jump(next_state) และ state_delay(time,next_state)
ในการกำหนดการทำงานไปสู่ state ต่างๆของ co_state เช่น (ใช้ case ประกอบนะครับ) ในตัวอย่างของ co_state_timer_task_led1


    // ประกาศ ค่าของ state ภายใน co_state ใช้เป็นการภายในเท่านั้น
    enum { LED_STATE_BEGIN, LED_STATE_1, LED_STATE_2 };

    // การทำงานของ state
    case LED_STATE_BEGIN:
        // initial co-state at here
        state_jump(LED_STATE_1);        // jump to next state
        return;
    case LED_STATE_1:
        ON_LED1;
        state_delay(T1SEC * 1 / 10, LED_STATE_2);       // delay 100 mS.
        return;
    case LED_STATE_2:
        OFF_LED1;
        state_delay(T1SEC * 1, LED_STATE_1);    // delay 1 Sec.
        return;


     เริ่มต้นของ co_state_timer_task_led1 นี้ การทำงานจะมาที่ LED_STATE_BEGIN
และจะไปที่ LED_STATE_1 ในรอบต่อไป เมื่อมาถึง LED_STATE_1 ก็ทำการ ON_LED1 และเตรียมตัวไป LED_STATE_2
โดยใช้ state_delay ให้ชลอเวลาไว้จนครบ 100 ms. แล้วไปที่ LED_STATE_2 เมื่อมาถึง LED_STATE_2 ก็ทำการ OFF_LED1
และเตรียมตัวไป LED_STATE_1 โดยใช้ state_delay ให้ชลอเวลาไว้จนครบ 1 Sec. และวนเวียน ใน LED_STATE_1 และ LED_STATE_2 นี้ หวังว่าคงเข้าใจกันนะครับ

    เอาละเดี๋ยวเราเริ่มมาลัดสั้นกันนะครับจะได้ใช้กันอย่างง่ายๆ
    ใน state.h ให้เพิ่ม #define เข้าไปครับ

#define co_state        state_declare;\
                        state_switch

#define co_state_timer  state_declare;\
                        state_timer_declare;\
                        state_timer_process();\
                        state_switch


    ก็จะได้ดังนี้ state.h ใหม่ดังนี้


#ifndef         STATE_PROCESS_H
#define         STATE_PROCESS_H

/*************************************************************************
* File name     : STATE.H
* Version       : 1.001
* Created by    : AppleIIe
* Date created  : 2000/6/26
* Description   : Header of State machine file
* Notes         : define macro for state machine control.
*************************************************************************/
// #include "state_cfg.h"
#define USE_SIMPLE_STATE

#ifdef  USE_SIMPLE_STATE
/*************************************************************************
                Macro for simple state machine control.
*************************************************************************/
typedef unsigned timer_pack;
typedef unsigned char state_pack;

// declare state variable
#define state_declare           static state_pack _state

// jump to other state
#define state_jump( target )  { _state = target; return; }

/*  use this macro in state timer only */
// declare state timer variable
#define state_timer_declare     static timer_pack _state_timer

// process timer of state
#define state_timer_process()  { if ( _state_timer ) { _state_timer--; return; } }
// delay with state timer , alway tmr > 0
#define state_delay(tmr,target) { _state_timer = (tmr)-1; _state = target; return; }
// way of state
#define state_switch    switch ( _state )
// shortcut of co_state/co_state_timer
#define co_state        state_declare;\
                        state_switch

#define co_state_timer  state_declare;\
                        state_timer_declare;\
                        state_timer_process();\
                        state_switch

/*************************************************************************
                       End of simple state macro
*************************************************************************/
#endif

#endif                          // STATE_PROCESS_H


เวลานำไปใช้ใน co-state ก็เพียงแค่ เรียก macro ที่ชื่อ co_state ( ไม่ใช้ Timer event co-state )
หรือ co_state_timer (ใช้ Timer event co-state ) เช่น จากตัวอย่างแก้ code ในส่วน
co_state_timer_task_led1 ได้เป็น


/*************************************************************************
                           Co-state task LED1
*************************************************************************/
void co_state_timer_task_led1(void)
{
    enum { LED_STATE_BEGIN, LED_STATE_1, LED_STATE_2 };

    co_state_timer {
    case LED_STATE_BEGIN:
        // initial co-state at here
        state_jump(LED_STATE_1);        // jump to next state
        return;
    case LED_STATE_1:
        ON_LED1;
        state_delay(T1SEC * 1 / 10, LED_STATE_2);       // delay 100 mS.
        return;
    case LED_STATE_2:
        OFF_LED1;
        state_delay(T1SEC * 1, LED_STATE_1);    // delay 1 Sec.
        return;
    }
}


ส่วน co_state_task_uart_rx ก็จะได้เป็น

//------------------------------------------------------------------------
// co-state uart rx
static void co_state_task_uart_rx(void)
{
    enum { RX_STATE_BEGIN, RX_STATE_1 };

    co_state {
    case RX_STATE_BEGIN:
        // initial co-state at here
        state_jump(RX_STATE_1); // jump to next state
        return;
    case RX_STATE_1:
        if (RI) {
            RI = 0;
            _rx_buff = SBUF;
            _rx_flag = true;
        }
        return;
    }
}


ชีวิตก็จะง่ายขึ้นเยอะเลยครับ

สุดท้ายนี้คงต้องขออภัยหากอธิบายในเรื่องนี้ได้อย่างไม่ดีนัก

Download ตัวอย่างแบบ ลัดสั้นได้เลยครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: amaloma on August 24, 2013, 09:37:26 AM
ติดตามชมครับ
ยังงงๆ ตรง state_delay(T1SEC * 1 / 10, LED_STATE_2) ครับ
ถ้าว่างแวะมาอธิบายเด็กน้อยอย่างผมด้วยนะครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: dynamic on August 24, 2013, 11:32:57 AM
เข้ามาเก็บความรู้ครับ ขอบคุณครับ
;D ;D ;D
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: Lastman on August 24, 2013, 11:45:30 AM
แค่ตรงส่วน Directive นี่ผมเดาอายุออกเลยนะครับเนี่ย อิอิ  ;D
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: firmware.c on August 24, 2013, 12:38:35 PM
เป็นตัวอย่างที่ดีมากครับผมขออนุญาติเสริมนิดหน่อยนะครับสำหรับคนที่จะนำไปใช้งาน

1) co_state_task_uart (ในกรณีที่มีการรับส่งเร็วๆ) จะให้ดีควรทำงานร่วมกันกับ UART interrupt แล้วใช้ buffer เข้ามาช่วย ให้ UART interrupt เป็นตัวจับข้อมูลเข้า buffer ในกรณีรับ หรือเอาข้อมูลออกจาก buffer ในกรณีส่ง แล้ว co_state_task_uart มีหน้าที่ process ค่าของ buffer อย่างเดียว
2) เรื่อง priority ของแต่ละ task ควรจัด priority ให้ดี task ไหนควรมาก่อนหลัง

;)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: bird_ee on August 24, 2013, 02:31:13 PM
(http://www.nopcommerce.com/images/thumbs/0001173_200.jpeg)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on August 24, 2013, 05:59:36 PM
Quote from: amaloma on August 24, 2013, 09:37:26 AM
ติดตามชมครับ
ยังงงๆ ตรง state_delay(T1SEC * 1 / 10, LED_STATE_2) ครับ
ถ้าว่างแวะมาอธิบายเด็กน้อยอย่างผมด้วยนะครับ

ท่าน amaloma สงสัยตรงไหน ของ state_delay ครับ มันมีตั้งหลายอย่าง ขอให้บอกส่วนที่ท่านสงสัยจะได้ตรงจุดครับ
แต่หากกล่าวรวมๆ state_delay ทำหน้าที่เป็นการหน่วงเวลาใน state คล้ายๆ delay ที่เราใช้อยู่นั่นแหละครับ


Quote from: Lastman on August 24, 2013, 11:45:30 AM
แค่ตรงส่วน Directive นี่ผมเดาอายุออกเลยนะครับเนี่ย อิอิ  ;D


ผมแก่แล้วครับท่าน Lastman ผมยังซื้อของโบราณจากท่านเลย จำได้ไหม อิอิ
http://www.electoday.com/index.php?topic=710.msg1804#msg1804
ไม่รู้ว่าทลายคลังแสงสมทบทุนเป็นไงบ้างครับ ได้บุญกันทั่วๆเลย

Quote from: bird_ee on August 24, 2013, 02:31:13 PM
(http://www.nopcommerce.com/images/thumbs/0001173_200.jpeg)
ท่าน bird_ee ขอบคุณที่ท่านสื่อความหมายไว้นะครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on August 24, 2013, 06:00:54 PM
Quote from: firmware.c on August 24, 2013, 12:38:35 PM
เป็นตัวอย่างที่ดีมากครับผมขออนุญาติเสริมนิดหน่อยนะครับสำหรับคนที่จะนำไปใช้งาน

1) co_state_task_uart (ในกรณีที่มีการรับส่งเร็วๆ) จะให้ดีควรทำงานร่วมกันกับ UART interrupt แล้วใช้ buffer เข้ามาช่วย ให้ UART interrupt เป็นตัวจับข้อมูลเข้า buffer ในกรณีรับ หรือเอาข้อมูลออกจาก buffer ในกรณีส่ง แล้ว co_state_task_uart มีหน้าที่ process ค่าของ buffer อย่างเดียว
2) เรื่อง priority ของแต่ละ task ควรจัด priority ให้ดี task ไหนควรมาก่อนหลัง

;)

ขอบคุณท่าน Firmware.c ทั้งคำชม ( ชื่นใจจริงๆ  :) ) และคำแนะนำที่ดีมากต่อท่านอื่นๆด้วย
ผมแค่จะนำตัวอย่างนี้(ที่นานมากแล้ว)ให้เห็นเป็นแนวทางครับ เป็นเรื่องเก่าๆนำมาเล่าใหม่ ว่าการเขียน state machine แบบเริ่มต้นง่ายๆ เป็นอย่างไร
มีแนวคิดอย่างไร สลับสับซอยงานเขียนอย่างไร ในทำนองนี้ อาจไม่ถูกต้องที่สุด แต่คิดว่าน่าจะง่ายพอให้เข้าใจได้ครับ
ในส่วนที่ต่อจากนี้ หลังจากมันมีลักษณะเป็นดั่ง task แล้ว คงต้องไปศึกษาเพิ่มเติมกันต่อแหละครับ ซึ่งตอนนี้หนังสือและข้อมูลมีให้ศึกษาเยอะแยะไปหมด
อย่างที่บอกนั้นแหละครับว่า ทำเป็นตัวอย่างเพื่อความเข้าใจ หากนำไปใช้จริง คงต้องจัดการต่อเองครับ

ขอบคุณท่านอีกครั้งและอยากได้คำแนะนำจากท่านต่อไปเรื่อยๆ อย่าลืมเซ็นลายเซ็นให้ผมด้วยนะครับ อิอิ
ปล. ผมชอบ ARR ของท่านนะครับ มันใช้ง่ายดี แม้มันยังขาดอะไรอยู่บ้าง อย่างไรก็ตาม ผมชอบแบบง่ายๆนี่แหละครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: Original on August 24, 2013, 06:33:09 PM
ขอบคุณมากๆเลยครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: firmware.c on August 24, 2013, 10:21:28 PM
Quoteปล. ผมชอบ ARR ของท่านนะครับ มันใช้ง่ายดี แม้มันยังขาดอะไรอยู่บ้าง อย่างไรก็ตาม ผมชอบแบบง่ายๆนี่แหละครับ
ใช่ครับง่ายเพราะทุก task จะ share timing กันหมดแล้ว priority ก็เท่ากันหมดด้วยครับ แถมแต่ละ task มี stack เป็นของตัวเอง เอาไว้ใช้ save context และใช้สำหรับ local variable ของแต่ละ task ในกรณีที่มีการ switch task เกิดขึ้น  ซึ่งผมมองว่ามันคือ multitasking แบบจริงๆ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on August 25, 2013, 07:15:41 AM
Quote from: firmware.c on August 24, 2013, 10:21:28 PM
Quoteปล. ผมชอบ ARR ของท่านนะครับ มันใช้ง่ายดี แม้มันยังขาดอะไรอยู่บ้าง อย่างไรก็ตาม ผมชอบแบบง่ายๆนี่แหละครับ
ใช่ครับง่ายเพราะทุก task จะ share timing กันหมดแล้ว priority ก็เท่ากันหมดด้วยครับ แถมแต่ละ task มี stack เป็นของตัวเอง เอาไว้ใช้ save context และใช้สำหรับ local variable ของแต่ละ task ในกรณีที่มีการ switch task เกิดขึ้น  ซึ่งผมมองว่ามันคือ multitasking แบบจริงๆ

เห็นด้วยครับผมก็เห็นเช่นนั้น ARR เป็นตัวอย่างหนึ่งที่ดี แอบไล่การทำงานแล้วชอบครับ เลยแอบมาบอกท่านต่อเลย
เสียดายที่ท่านไม่ได้ปรับปรุงมันต่อไป
ถ้าท่านมีเวลาก็อยากให้แนะนำเรื่องราวของ multitasking บ้างนะครับ วันละนิดวันละหน่อยก็ได้ (โดยไม่รบกวนเกินไป)
เพราะนับวันจะเริ่มมีบทบาท มากขึ้นเรื่อยๆ เลยอยากให้ผู้ชำนาญอย่างท่าน ช่วยพิจารณาเผื่อเป็นประโยชน์ต่อน้องๆ เพื่อนๆ ในอนาคตครับ
ผมเองรู้แค่งูๆปลาๆครับ เล่าได้ไม่เก่งไม่ประติดประต่อนัก ข้อมูลต่างๆ ก็ได้แต่จับโน่นต่อนี่ไม่ค่อยเป็นเรื่องเป็นราวอยากได้คนที่เป็น
และมีประสบการณ์มาให้ข้อมูลมากกว่า แค่ในหลักการก็พอแล้วครับ ไม่ต้องลงรายละเอียดก็ได้ หวังว่าท่านคงเมตตาต่อชาวโลกใบนี้ด้วย  ;)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: firmware.c on August 25, 2013, 09:53:21 AM
Quote from: AppleIIe on August 25, 2013, 07:15:41 AM
Quote from: firmware.c on August 24, 2013, 10:21:28 PM
Quoteปล. ผมชอบ ARR ของท่านนะครับ มันใช้ง่ายดี แม้มันยังขาดอะไรอยู่บ้าง อย่างไรก็ตาม ผมชอบแบบง่ายๆนี่แหละครับ
ใช่ครับง่ายเพราะทุก task จะ share timing กันหมดแล้ว priority ก็เท่ากันหมดด้วยครับ แถมแต่ละ task มี stack เป็นของตัวเอง เอาไว้ใช้ save context และใช้สำหรับ local variable ของแต่ละ task ในกรณีที่มีการ switch task เกิดขึ้น  ซึ่งผมมองว่ามันคือ multitasking แบบจริงๆ

เห็นด้วยครับผมก็เห็นเช่นนั้น ARR เป็นตัวอย่างหนึ่งที่ดี แอบไล่การทำงานแล้วชอบครับ เลยแอบมาบอกท่านต่อเลย
เสียดายที่ท่านไม่ได้ปรับปรุงมันต่อไป
ถ้าท่านมีเวลาก็อยากให้แนะนำเรื่องราวของ multitasking บ้างนะครับ วันละนิดวันละหน่อยก็ได้ (โดยไม่รบกวนเกินไป)
เพราะนับวันจะเริ่มมีบทบาท มากขึ้นเรื่อยๆ เลยอยากให้ผู้ชำนาญอย่างท่าน ช่วยพิจารณาเผื่อเป็นประโยชน์ต่อน้องๆ เพื่อนๆ ในอนาคตครับ
ผมเองรู้แค่งูๆปลาๆครับ เล่าได้ไม่เก่งไม่ประติดประต่อนัก ข้อมูลต่างๆ ก็ได้แต่จับโน่นต่อนี่ไม่ค่อยเป็นเรื่องเป็นราวอยากได้คนที่เป็น
และมีประสบการณ์มาให้ข้อมูลมากกว่า แค่ในหลักการก็พอแล้วครับ ไม่ต้องลงรายละเอียดก็ได้ หวังว่าท่านคงเมตตาต่อชาวโลกใบนี้ด้วย  ;)
ด้วยความยินดีครับผม
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on August 25, 2013, 08:08:26 PM
Quote from: firmware.c on August 25, 2013, 09:53:21 AM
Quote from: AppleIIe on August 25, 2013, 07:15:41 AM

เห็นด้วยครับผมก็เห็นเช่นนั้น ARR เป็นตัวอย่างหนึ่งที่ดีแอบไล่การทำงานแล้วชอบครับ เลยแอบมาบอกท่านต่อเลย
เสียดายที่ท่านไม่ได้ปรับปรุงมันต่อไป
ถ้าท่านมีเวลาก็อยากให้แนะนำเรื่องราวของ multitasking บ้างนะครับ วันละนิดวันละหน่อยก็ได้ (โดยไม่รบกวนเกินไป)
เพราะนับวันจะเริ่มมีบทบาท มากขึ้นเรื่อยๆ เลยอยากให้ผู้ชำนาญอย่างท่าน ช่วยพิจารณาเผื่อเป็นประโยชน์ต่อน้องๆ เพื่อนๆ ในอนาคตครับ
ผมเองรู้แค่งูๆปลาๆครับ เล่าได้ไม่เก่งไม่ประติดประต่อนัก ข้อมูลต่างๆ ก็ได้แต่จับโน่นต่อนี่ไม่ค่อยเป็นเรื่องเป็นราวอยากได้คนที่เป็น
และมีประสบการณ์มาให้ข้อมูลมากกว่า แค่ในหลักการก็พอแล้วครับ ไม่ต้องลงรายละเอียดก็ได้ หวังว่าท่านคงเมตตาต่อชาวโลกใบนี้ด้วย  ;)
ด้วยความยินดีครับผม

ท่าาน firmware.c ช่างมีน้ำใจยิ่งนัก ขอบคุณล่วงหน้ามากๆครับ  :)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: ROM on August 27, 2013, 11:28:03 AM
ได้ลองทดสอบแล้วทำงานได้ดีมากครับ Code แค่นี้ทำให้ ทำไฟกระพริบหลายดวงได้อย่างนี้เลย ดีจัง
แต่จะถามว่าถ้าจะทำให้ LED1 กระพริบ 3 ครั้งสั้นๆ แล้วดับ และวนไปเรื่อยๆ จะแก้ใน co_state_timer_task_led1 ยังไงครับ
ยังมือใหม่หัดคิดครับ  ::)
ท่านใดพอจะทราบขอคำแนะนำด้วยครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: VooDooHeRo on August 27, 2013, 11:50:26 AM
ได้ความรู้ ขอบคุณมากครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on August 28, 2013, 07:37:20 AM
Quote from: ROM on August 27, 2013, 11:28:03 AM
ได้ลองทดสอบแล้วทำงานได้ดีมากครับ Code แค่นี้ทำให้ ทำไฟกระพริบหลายดวงได้อย่างนี้เลย ดีจัง
แต่จะถามว่าถ้าจะทำให้ LED1 กระพริบ 3 ครั้งสั้นๆ แล้วดับ และวนไปเรื่อยๆ จะแก้ใน co_state_timer_task_led1 ยังไงครับ
ยังมือใหม่หัดคิดครับ  ::)
ท่านใดพอจะทราบขอคำแนะนำด้วยครับ


ท่าน ROM มีอยู่หลายๆวิธีนะครับ โดยมีข้อดีและัไม่ดี แตกต่างกันไป
แต่้เพื่อให้ง่ายกับการเริ่มต้นแบบนี้ ขอแนะนำเป็นแบบตรงไปตรงมานะครับ
สมมติให้ LED กระพริบสั้นๆ ในช่วง ON 250 ms./OFF 200 ms. และ ดับยาวในเวลา 800 ms.
กำหนดค่าได้ดังนี้ ( กำหนดค่าเวลาที่คำนวณได้จาก T1SEC )

#define     T1_LED_ON       ( T1SEC * 250 / 1000 )
#define     T1_LED_OFF      ( T1SEC * 200 / 1000 )
#define     T2_LED             ( T1SEC * 800 / 1000 )

โดยกำหนด state ที่จะใช้ขึ้นมาจาก enum ได้ดังนี้ (ใช้จำนวน 7 state) ท่านลองค่อยๆวิเคราะห์ดูครับได้ตามนี้ไหม ( รวม state เริ่มต้น ด้วยครับ ) ก็จะได้

    enum {  LED_STATE_BEGIN, LED_STATE_1, LED_STATE_2 ,
            LED_STATE_3 , LED_STATE_4 , LED_STATE_5 , LED_STATE_6 };

โดย LED_STATE_6 จะเป็น state สุดท้ายที่ดับ โดยใช้เวลา T1_LED_OFF รวมกับ T2_LED
ดังนั้น สรุปจะได้ Code ส่วนนี้จะเป็นได้ประมาณดังนี้ครับ


...
/*************************************************************************
                           Co-state task LED1
*************************************************************************/
#define T1_LED_ON       ( T1SEC * 250 / 1000 )
#define T1_LED_OFF      ( T1SEC * 200 / 1000 )
#define T2_LED          ( T1SEC * 800 / 1000 )

void co_state_timer_task_led1(void)
{
    enum {  LED_STATE_BEGIN, LED_STATE_1, LED_STATE_2 ,
            LED_STATE_3 , LED_STATE_4 , LED_STATE_5 , LED_STATE_6 };

    co_state_timer {
    case LED_STATE_BEGIN:
        // initial co-state at here
        state_jump(LED_STATE_1);        // jump to next state
        return;
    case LED_STATE_1:
        ON_LED1;
        state_delay(T1_LED_ON, LED_STATE_2);    // delay by T1_LED_ON
        return;
    case LED_STATE_2:
        OFF_LED1;
        state_delay(T1_LED_OFF, LED_STATE_3);   // delay by T1_LED_OFF
        return;
    case LED_STATE_3:
        ON_LED1;
        state_delay(T1_LED_ON, LED_STATE_4);    // delay by T1_LED_ON
        return;
    case LED_STATE_4:
        OFF_LED1;
        state_delay(T1_LED_OFF, LED_STATE_5);   // delay by T1_LED_OFF
        return;
    case LED_STATE_5:
        ON_LED1;
        state_delay(T1_LED_ON, LED_STATE_6);    // delay by T1_LED_ON
        return;
    case LED_STATE_6:
        OFF_LED1;
        state_delay(T1_LED_OFF + T2_LED, LED_STATE_1);   // delay by T1_LED_OFF , T2_LED
        return;
    }
}

#undef  T1_LED_ON
#undef  T1_LED_OFF
#undef  T2_LED

...


หวังว่าท่านคงเข้าใจมากขึ้น ลองค่อยๆพิจารณาดูครับ
ซึ่งวิธีนี้เป็นวิธีแบบตรงไปตรงมา อาจมีข้อเสียคือใช้ state ค่อนข้างมาก หากให้ LED กระพริบมากๆกว่านี้ Code จะมากตามไปด้วย
โดยจะเห็นว่าัี Code ที่ซ้ำๆคือช่วงที่ LED ติดโดย T1_LED_ON และ T1_LED_OFF ครับ
แต่เพื่อเป็น Guideline และง่ายต่อการให้เกิดความเข้าใจ ก็ใชัวิธีแบบนี้ไปก่อน

นอกจากนี้ยังมีวิธีอื่นๆอีกครับ เอาไว้มีโอกาศจะเล่าต่อในภายหลังครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: ROM on August 28, 2013, 04:12:03 PM
ขอบคุณท่าน AppleIIe มากครับ เข้าใจแล้วครับ
เป็นการเขียนโปรแกรมที่ แหวกแนวดีครับ  :D
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: deejun on August 29, 2013, 10:40:48 AM
มาขุดข้อมูลด้วยคนครับ  ขอบคุณครับ   :D
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on August 29, 2013, 10:46:55 AM
Quote from: ROM on August 28, 2013, 04:12:03 PM
ขอบคุณท่าน AppleIIe มากครับ เข้าใจแล้วครับ
เป็นการเขียนโปรแกรมที่ แหวกแนวดีครับ  :D

การทำงานแบบ state machine และการเขียนโปรแกรมแนวนี้มีมานานมากแล้วครับ
เพียงแต่อาจจะใช้มากในงานบางประเภทมากกว่าครับ ไม่ใช่ของใหม่อะไรนะครับ
ในอดีตก็เป็นวงจร Digital ด้วยซ้ำครับ
http://www.cis.upenn.edu/~palsetia/cit595s07/seqcircuitsPart2.pdf
http://noel.feld.cvut.cz/hw/amd/90005a.pdf 
ใช้แก้ไขปัญหาของงานได้สารพัดทีเดียว
แต่เมื่อเป็นโปรแกรมก็คงต้องอาจจะแปลกตาไปบ้าง แต่ก็มีหลักๆแบบเดียวกัน และอาจทำอะไรได้มากกว่าเป็นวงจร digital ด้วยซ้ำ

Quote from: deejun on August 29, 2013, 10:40:48 AM
มาขุดข้อมูลด้วยคนครับ  ขอบคุณครับ   :D

เชิญได้เลยครับ ท่าน deejun
ผมยังคงติดตามข้อมูลจากท่านอยู่เรื่อยๆนะครับ ท่านให้ข้อมูลได้ดีเลย

โดยความหวังว่า ตัวอย่าง project นี้ จะทำให้เป็นแนวทางสู่ความเข้าใจต่อการทำงานแบบ co-operative multitasking ด้วย state machine แบบเบื้องต้น หากมีโอกาศก็จะปรับปรุงให้เรื่องนี้ มีการใช้งานได้เป็นรูปธรรมมากขึ้น เข้ากับยุคสมัยให้มากขึ้น
และขอขอบคุณทุกท่านที่เข้ามาเยี่ยมชมกับเรื่องนี้ ขอบคุณทาง www.logicthai.net ที่นำเรื่องนี้ไปเผยแพร่ต่อ
หากการเขียนตัวอย่างเรื่องนี้ผิดพลาดประการใด ขอโปรดให้อภัยด้วยสำหรับการเขียนที่ออกจะรวบรัดอยู่พอสมควร
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: unseen on August 30, 2013, 08:29:10 AM
ได้อ่านดูแล้วเป็นตัวอย่างที่ดีและเป็นเรื่องทีเป็นทั้ง Tip และ Trick เลยนะ ให้ Like ไปเลย
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: zilog on August 31, 2013, 09:17:48 AM
แค่ Code การรับปุ่มกด ก็ไม่ธรรมดาแล้วครับ เป็นตัวอย่างที่ดีจริงต้องยอมรับกัน และขอนำเก็บไว้ในคลังข้อมูลด้วยนะครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: amaloma on August 31, 2013, 10:14:25 AM
Quote from: AppleIIe on August 24, 2013, 05:59:36 PM
Quote from: amaloma on August 24, 2013, 09:37:26 AM
ติดตามชมครับ
ยังงงๆ ตรง state_delay(T1SEC * 1 / 10, LED_STATE_2) ครับ
ถ้าว่างแวะมาอธิบายเด็กน้อยอย่างผมด้วยนะครับ

ท่าน amaloma สงสัยตรงไหน ของ state_delay ครับ มันมีตั้งหลายอย่าง ขอให้บอกส่วนที่ท่านสงสัยจะได้ตรงจุดครับ
แต่หากกล่าวรวมๆ state_delay ทำหน้าที่เป็นการหน่วงเวลาใน state คล้ายๆ delay ที่เราใช้อยู่นั่นแหละครับ

ขอโทษนะครับ ที่ตอบช้า
คือผมไม่เข้าใจการทำงานของมันครับ

#define state_delay(tmr,target) { _state_timer = (tmr)-1; _state = target; return; }
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: firmware.c on August 31, 2013, 12:28:34 PM
Quote from: amaloma on August 31, 2013, 10:14:25 AM
Quote from: AppleIIe on August 24, 2013, 05:59:36 PM
Quote from: amaloma on August 24, 2013, 09:37:26 AM
ติดตามชมครับ
ยังงงๆ ตรง state_delay(T1SEC * 1 / 10, LED_STATE_2) ครับ
ถ้าว่างแวะมาอธิบายเด็กน้อยอย่างผมด้วยนะครับ

ท่าน amaloma สงสัยตรงไหน ของ state_delay ครับ มันมีตั้งหลายอย่าง ขอให้บอกส่วนที่ท่านสงสัยจะได้ตรงจุดครับ
แต่หากกล่าวรวมๆ state_delay ทำหน้าที่เป็นการหน่วงเวลาใน state คล้ายๆ delay ที่เราใช้อยู่นั่นแหละครับ

ขอโทษนะครับ ที่ตอบช้า
คือผมไม่เข้าใจการทำงานของมันครับ

#define state_delay(tmr,target) { _state_timer = (tmr)-1; _state = target; return; }

http://www.cprogramming.com/tutorial/cpreprocessor.html

ดูหัวข้อ Macros ครับ เป็นลักษณะ Macro function
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on September 02, 2013, 05:37:40 PM
ตามที่ท่าน firmware.c แนะนำเรื่องการศึกษาและใช้ macro ได้ดีมากครับ
ท่าน amaloma ลองไล่การทำงานของ macro แต่ละชุดประกอบกัน และอ่าน Code ร่วมด้วย
หากได้ทำการ Debug ด้วยก็จะยิ่งเข้าใจการทำงานทั้งหมดได้มากขึ้นเลยครับ
หากติดขัดหรือสงสัยตรงไหน ก็สอบถามกันมาใหม่ได้ครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: sonicm on September 02, 2013, 06:44:47 PM
ท่าน firmware ARR คิออะไรหรือท่าน
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: firmware.c on September 02, 2013, 07:00:27 PM
Quote from: sonicm on September 02, 2013, 06:44:47 PM
ท่าน firmware ARR คิออะไรหรือท่าน
ARR = AVR round robin ครับท่าน sonicm มันคือ full preemptive multitasking แบบ round robin scheduling ที่ผมทำไว้ใช้งานเองครับ ใช้งานง่ายๆ ทุก task share timing และ priority เท่ากันหมดครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: sonicm on September 02, 2013, 08:36:39 PM
Quote from: firmware.c on September 02, 2013, 07:00:27 PM
Quote from: sonicm on September 02, 2013, 06:44:47 PM
ท่าน firmware ARR คิออะไรหรือท่าน
ARR = AVR round robin ครับท่าน sonicm มันคือ full preemptive multitasking แบบ round robin scheduling ที่ผมทำไว้ใช้งานเองครับ ใช้งานง่ายๆ ทุก task share timing และ priority เท่ากันหมดครับ

สุดยอดครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: ROM on September 03, 2013, 09:24:47 AM
ไม่ทราบว่าท่าน firmware.c ทำ ARR ไว้ใช้เอง หรือว่าแจกให้กับผู้สนใจครับ
หากทำแจก ก็อยากรบกวน ท่าน firmware.c โปรดนำเสนอข้อมูลเรื่อง ARR ให้ด้วยนะครับ
ผมคิดว่าคงเป็นข้อมูลที่น่าสนใจไม่น้อยเลย
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: firmware.c on September 03, 2013, 10:35:25 AM
Quote from: ROM on September 03, 2013, 09:24:47 AM
ไม่ทราบว่าท่าน firmware.c ทำ ARR ไว้ใช้เอง หรือว่าแจกให้กับผู้สนใจครับ
หากทำแจก ก็อยากรบกวน ท่าน firmware.c โปรดนำเสนอข้อมูลเรื่อง ARR ให้ด้วยนะครับ
ผมคิดว่าคงเป็นข้อมูลที่น่าสนใจไม่น้อยเลย
จริงๆผมได้ post code เอาไว้แล้วครับตั้งแต่ปีที่แล้ว เดี่ยวจะ up ให้อีกทีก็แล้วกันนะครับ ส่วนข้อมูลเกี่ยวกับการทำงานเดี๋ยวผมขอเวลาหน่อยครับจะอธิบายให้ฟัง (ช่วงนี้งานรัดตัวมากครับ  ;))
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: ROM on September 03, 2013, 06:31:37 PM
Quote from: firmware.c on September 03, 2013, 10:35:25 AM
Quote from: ROM on September 03, 2013, 09:24:47 AM
ไม่ทราบว่าท่าน firmware.c ทำ ARR ไว้ใช้เอง หรือว่าแจกให้กับผู้สนใจครับ
หากทำแจก ก็อยากรบกวน ท่าน firmware.c โปรดนำเสนอข้อมูลเรื่อง ARR ให้ด้วยนะครับ
ผมคิดว่าคงเป็นข้อมูลที่น่าสนใจไม่น้อยเลย
จริงๆผมได้ post code เอาไว้แล้วครับตั้งแต่ปีที่แล้ว เดี่ยวจะ up ให้อีกทีก็แล้วกันนะครับ ส่วนข้อมูลเกี่ยวกับการทำงานเดี๋ยวผมขอเวลาหน่อยครับจะอธิบายให้ฟัง (ช่วงนี้งานรัดตัวมากครับ  ;))

ต้องขอโทษจริงๆครับที่รบกวนท่าน firmware.c ตามแต่ท่านสะดวกดีกว่าครับ เมื่อใดก็ได้
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: v on September 20, 2013, 05:40:31 PM
เมื่อหลายวันก่อนได้เขียนแล้วครั้งหนึ่ง แต่ตอนส่ง internet คงหลุด เลยส่งไม่ออก แล้วก็คิดว่าช่างมันเถอะ แต่เมื่อวานนี้มีคน email มาถามว่าวิธีนี้ work ไหม ผมคิดว่าถ้าเฉยต่อไปคงมีคนหลงตามไปอีกหลายคน แต่เขียนวันนี้คงขี้เกียจเขียนยาวแบบวันก่อน

หนังสือ Embededded Multitasking โดย Keith E. Curtis  จากชื่อหนังสือบอกว่า Multitasking บน Embedded ในคำนำเขียนว่าเป็นการใช้ state machine เพื่อทำ co-operative multitasking คือเป็นการเจาะจงเรื่องให้แคบลงไปอีก

หนังสือแค่ 400 หน้า ใน 100 หน้าแรก มีแต่น้ำ ไม่รู้ว่าจะเอาพื้นฐาน digital มาใส่ไว้ทำไม ใส่มาก็ไม่ครบและไม่ต่อเนื่อง และก็ไม่ได้ใช้อ้างอิงในส่วนอื่นอีกเลยด้วย มีพูดถึง state machine แต่เป็นการอ้างถึงรูปแบบการประยุกต์เขียน code ทั้งสิ้น ไม่ได้เกี่ยวกับเรื่องรูปแบบของ state machine เลย ไม่มีเรื่องส่วนประกอบของ state machine เลย และไม่มี state diagram เลย หลังจาก 100 หน้าแรกแล้วจึงมีเรื่อง multitasking แต่สาระก็น้อยมากและที่เหลือทั้งเล่มเป็นแค่ตัวอย่างการประยุกต์ใช้งานแบบเดียว ตัวอย่าง code แค่กรณีที่ยกตัวอย่างมาเท่านั้น เนื้อหาแคบมาก และทั้งเล่มมี state diagram อยู่กลางเล่มที่เดียว มหัศจรรย์มากที่เขียนหนังสือเกี่ยวกับ state machine แล้วแทบไม่มี state diagram ผมว่าไม่น่าจะมีมหาวิทยาลัยไหนเอามาใช้สอน และผมไม่เพียงไม่แนะนำให้อ่าน ผมแนะนำว่าอย่าอ่านให้เสียเวลา ผมยังสงสัยว่าแล้วมันพิมพ์มาขายได้ยังไง เลยเข้าไปดูใน Amazon อ่านประวัติผู้เขียนเห็นว่ามีประสพการณ์อยู่แค่เรื่องเดียว ไม่ได้มีภูมิรู้อะไรแล้วยังได้เข้าไปทำงาน Microchip อีกแน่ะ ดู review มี 2 ราย รายหนึ่งเขียนชมซะเวอร์  A full introduction to microcontroller design ผมว่าไม่ได้ใกล้เลย เชียร์ไม่ได้ดูเลย  อีกรายหนึ่งบอกได้ว่าหนังสือไม่ได้เรื่อง กรุณาเข้าไป search ดูใน Amazon ด้วยจะได้เห็นว่าผมพูดจริง

ตัวอย่างหนังสือที่ดีเป็นอย่างไร หนังสือ operating system ที่ผมใช้เรียนชื่อ Operating Systems Design and Implementation ของ Andrew S Tanenbaum (Author), Albert S Woodhull (Author) ประมาณ 1000 หน้า เนื้อหาแน่นเอียดตั้งแต่บทแรกจนจบเล่ม ดูใน Amazon ดู review จะเห็นคำวิจารณ์ได้เป็นเรื่องเป็นราว ประวัติ+ประสพการณ์ผู้เขียนน่าเชื่อถือ (สมัยที่อาจารย์ผมเลือกหนังสือมาใช้ยังไม่มี Amazon นะ)

ท่านเจ้าของกระทู้ได้อุทิศเวลาเขียนเพื่อถ่ายทอดความรู้ เป็นเรื่องน่ายกย่องครับ ไม่ว่าท่านจะถ่ายทอดความรู้ในเรื่องอะไรก็เป็นประโยชน์ทั้งนั้น และช่วยนำพาส่วนรวมเจริญขึ้นด้วย ทุกสังคมน่าจะมีคนอย่างท่านมากๆนะครับ แต่ผมว่าเดี๋ยวนี้ไม่ได้ยากที่จะหา multitasking os มาใช้ใน embedded เล็กๆ และไม่ได้ยากที่จะเรียนรู้ ผมว่าเขียนง่ายกว่าการมาใช้ state machine ใน co-operative multitasking อีกนะครับ เอาเวลาที่จะอ่าน หนังสือ Embededded Multitasking โดย Keith E. Curtis ไปอ่าน multitasking os สักตัวจะได้ประโยชน์กว่านะครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: sonicm on September 20, 2013, 10:37:18 PM
Quote from: v on September 20, 2013, 05:40:31 PM


ตัวอย่างหนังสือที่ดีเป็นอย่างไร หนังสือ operating system ที่ผมใช้เรียนชื่อ Operating Systems Design and Implementation ของ Andrew S Tanenbaum (Author), Albert S Woodhull (Author) ประมาณ 1000 หน้า เนื้อหาแน่นเอียดตั้งแต่บทแรกจนจบเล่ม ดูใน Amazon ดู review จะเห็นคำวิจารณ์ได้เป็นเรื่องเป็นราว ประวัติ+ประสพการณ์ผู้เขียนน่าเชื่อถือ (สมัยที่อาจารย์ผมเลือกหนังสือมาใช้ยังไม่มี Amazon นะ)

เรียน OS เล่มเดียวกันเลย
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on September 21, 2013, 08:58:06 PM
ขอบคุณในคำแนะนำของท่าน v มากนะครับ เราจะได้นำเสนอข้อมูลในแต่ละด้านและความคิดความเห็นกัน

Quote from: v on September 20, 2013, 05:40:31 PM
เมื่อหลายวันก่อนได้เขียนแล้วครั้งหนึ่ง แต่ตอนส่ง internet คงหลุด เลยส่งไม่ออก แล้วก็คิดว่าช่างมันเถอะ แต่เมื่อวานนี้มีคน email มาถามว่าวิธีนี้ work ไหม ผมคิดว่าถ้าเฉยต่อไปคงมีคนหลงตามไปอีกหลายคน แต่เขียนวันนี้คงขี้เกียจเขียนยาวแบบวันก่อน
....

เสียดายที่ไม่ได้อ่านฉบับเต็มๆ จะได้เข้าใจความคิดเห็นของท่านได้มากขึ้น
ผมเห็นท่านใช้ "คำว่าคนหลงตาม..." ผมเข้าใจว่า ท่านอาจหมายถึง ใช้แนวทางวิธี state machine นี้เพื่อ การทำ multitask เหมาะสมไหม  ? มันถูกต้องไหม ? สำหรับผมคิดเห็นว่าเป็นความรู้อีกแนวทางหนึ่งมากกว่าครับ เป็นอีกเรื่องหนึ่งที่สามารถช่วยให้เป็น multitask ได้ ที่ใช้ resource ไม่มาก ซึ่งถือว่าเป็นประโยชน์  แต่ก็ไม่ได้เหมาะสมไปทุกอย่าง ยังมีข้่อดีข้อเสียอยู่  จึงเหมาะกับงานบางประเภท ที่มีข้อจำกัดอยู่บ้าง และผมก็ไม่ได้ไปแนะนำไปทดแทน multitask os นะครับ เพราะอย่างไร RTOS ก็ยังเหมาะสมกับงานประเภทนี้อยู่  เพียงแต่อาจใช้ resource ที่มากกว่า


ขอสลับบางประโยคของท่านเพื่อลำดับเรื่องนะครับ

Quoteท่านเจ้าของกระทู้ได้อุทิศเวลาเขียนเพื่อถ่ายทอดความรู้ เป็นเรื่องน่ายกย่องครับ ไม่ว่าท่านจะถ่ายทอดความรู้ในเรื่องอะไรก็เป็นประโยชน์ทั้งนั้น และช่วยนำพาส่วนรวมเจริญขึ้นด้วย ทุกสังคมน่าจะมีคนอย่างท่านมากๆนะครับ แต่ผมว่าเดี๋ยวนี้ไม่ได้ยากที่จะหา multitasking os มาใช้ใน embedded เล็กๆ และไม่ได้ยากที่จะเรียนรู้ ผมว่าเขียนง่ายกว่าการมาใช้ state machine ใน co-operative multitasking อีกนะครับ เอาเวลาที่จะอ่าน หนังสือ Embededded Multitasking โดย Keith E. Curtis ไปอ่าน multitasking os สักตัวจะได้ประโยชน์กว่านะครับ


ความจริงผมเองไม่ได้เป็นนักเขียนอะไร เป็นนักค้นหาข้อมูลมาใช้มาเทียบมากกว่าั เรื่องที่เขียนนี้ออกจะไม่ได้ตั้งใจจะเขียนให้เป็นเรื่องเป็นราวเสียด้วยซ้ำครับ เดิมทีมีสมาชิกท่านหนึ่งได้เขียนตัวอย่าง code ไว้แบบที่เป็นงานลักษณะ multitask โดยไม่มี os ด้วยการแนะนำของ website แห่งหนึ่ง ซึ่งผมเห็นว่าเป็นแบบ Timer event จึงได้แลกข้อมูลกันในเชิงการทำงานและประสิทธิภาพ และก็ได้มีสมาชิกท่านอื่นๆ ก็ได้แนะนำให้ใช้ RTOS อยู่บ้าง แต่สมาชิกท่านนั้นก็ขอใช้แนวทางที่ไม่ิ่พึ่ง RTOS ใดๆ เพราะเหตุผลว่าต้องการให้มันเล็กและย้าย code ไปได้ง่ายไม่ต้องผูกติดกับ RTOS จึงได้มีการแลกเปลี่ยนข้อมูลและวิเคาระห์ code นั้นกันยาวทีเดียว เพื่อให้เห็นว่าจะดึงประสิทธิภาพออกมาได้อย่างไรบ้าง เสียดายที่หากระทู้ดังกล่าวไม่เจอแล้ว โดยสุดท้่ายผมเองจำได้ว่าสมัยหนึ่งเคยเขียน source code ในทำนองนี้้ แต่ผ่านมานานมาก และจำได้ว่าอาศัยข้อมูลจากนิตยสาร Embedded system programming มาใช้ ซึ่งมีเรื่องแนวทางการเขียน code ของ state machine อย่างมีประสิทธิถาพ  ผมจึงไปค้นหา source code นั้นมาและก็ปรับปรุงบ้างเล็กน้อยและเขียนเป็นข้อมูลไว้ที่กระทู้นี้ แต่ด้วยความเป็นนิตยสารมันจึงเป็นบทความย่อยๆ หาได้ยากแล้ว และยังไม่ปะติดปะต่อนัก จึงได้ขอแนะนำหนังสือ Embededded Multitasking แทน ผมคิดเห็นว่าเล่มนี้น่าจะเป็นแนวทางในการทำความเข้าใจแบบเบื้องต้นและง่ายพอทำความเข้าใจสำหรับผู้สนใจ  โดยน่าจะเหมาะสมที่สุดเท่าที่ผมเห็นว่าเป็นเรื่องใกล้เคียงกัน และมีตัวอย่างชัดเจนพอ
แต่ไม่ได้หวังว่าจะเป็นหนังสือที่ดีที่สุดกับทุกๆท่านครับ ผมไม่ได้เน้นที่เล่มหนังสือใดๆนะครับ  เพียงแต่แนะนำเพื่ออ้างอิงในเรื่องราวเหล่านี้ และข้อมูลอาจเพียงคล้ายคลึง คงไม่ตรงเสียทั้งหมด เพราะหนังสือเล่มนี้เป็นการถ่ายทอดประสบการณ์ความรู้ของผู้เขียนหนังสือนั้นเอง
เรื่องแนวการเขียนแบบ state machine เป็นเรื่องที่มีมานานมากแล้ว แต่เป็นการเขียนที่ค่อนข้างจะแตกต่างกว่าการเขียนแบบปกติ  ความนิยมจึงมีไม่ค่อยมาก แต่ด้วยเรื่องที่ใช้ resource น้อยจึงยังมีประโยชน์อยู่บ้าง และปัจจุบันมี RTOS มากมายที่เขียน code ได้ง่ายกว่า มาแทนการทำงานได้่เกือบทั้งหมดอยู่แล้ว ดังนั้นแนวการเขียนแบบ state machine ก็คงลดบทบาทลงไปมากครับ ซึ่งสำหรับผมแล้วก็มีความเห็นส่วนตัวแล้วเรื่องการเขียน code แบบ state machine เป็นความรู้ที่เป็นเรื่องที่มีประโยชน์อยู่บ้างกับงานบางประเภทครับ เพราะมีจุดเด่นอย่างที่กล่าวไว้ แต่คงไม่ได้นำมาใช้ไปเสียทุกงานแน่นอน เพราะมีข้อดีข้อเสียอยู่ นอกจากนี้ยังก็ประยุกต์ร่วมกับการใช้กับ RTOS ได้ด้วย เพื่อให้เกิดความประหยัดดังกล่าวได้ ดังนั้นการเขียน code แบบ state machine ผมว่าหากศึกษาไว้ก็ไม่น่าจะเสีียหายนะครับ เป็นเรื่องที่เสริมกับ RTOS ได้ อย่าง FreeRTOS ก็ยังมีเรื่อง state machine โดยเรียกว่าเป็น coroutine ครับ  http://www.freertos.org/croutine.html ซึ่งก็มีประโยชน์ในเรื่องเดียวกันนี้
ไม่แน่นักบางที ท่านอาจเจอกับข้อจำกัดของงานทำให้ RTOS ไม่เหมาะจะใช้ แต่วิธีจากแนวแบบ state machine อาจช่วยท่านได้จากข้อจำกัดนั้น

หากท่าน v มีความคิดเห็นอื่นๆที่เห็นด้วยหรือแตกต่างก็ร่วมกันเสนอข้อมูลได้นะครับ



Quoteหนังสือ Embededded Multitasking โดย Keith E. Curtis  จากชื่อหนังสือบอกว่า Multitasking บน Embedded ในคำนำเขียนว่าเป็นการใช้ state machine เพื่อทำ co-operative multitasking คือเป็นการเจาะจงเรื่องให้แคบลงไปอีก

หนังสือแค่ 400 หน้า ใน 100 หน้าแรก มีแต่น้ำ ไม่รู้ว่าจะเอาพื้นฐาน digital มาใส่ไว้ทำไม ใส่มาก็ไม่ครบและไม่ต่อเนื่อง และก็ไม่ได้ใช้อ้างอิงในส่วนอื่นอีกเลยด้วย มีพูดถึง state machine แต่เป็นการอ้างถึงรูปแบบการประยุกต์เขียน code ทั้งสิ้น ไม่ได้เกี่ยวกับเรื่องรูปแบบของ state machine เลย ไม่มีเรื่องส่วนประกอบของ state machine เลย และไม่มี state diagram เลย หลังจาก 100 หน้าแรกแล้วจึงมีเรื่อง multitasking แต่สาระก็น้อยมากและที่เหลือทั้งเล่มเป็นแค่ตัวอย่างการประยุกต์ใช้งานแบบเดียว ตัวอย่าง code แค่กรณีที่ยกตัวอย่างมาเท่านั้น เนื้อหาแคบมาก และทั้งเล่มมี state diagram อยู่กลางเล่มที่เดียว มหัศจรรย์มากที่เขียนหนังสือเกี่ยวกับ state machine แล้วแทบไม่มี state diagram ผมว่าไม่น่าจะมีมหาวิทยาลัยไหนเอามาใช้สอน และผมไม่เพียงไม่แนะนำให้อ่าน ผมแนะนำว่าอย่าอ่านให้เสียเวลา ผมยังสงสัยว่าแล้วมันพิมพ์มาขายได้ยังไง เลยเข้าไปดูใน Amazon อ่านประวัติผู้เขียนเห็นว่ามีประสพการณ์อยู่แค่เรื่องเดียว ไม่ได้มีภูมิรู้อะไรแล้วยังได้เข้าไปทำงาน Microchip อีกแน่ะ ดู review มี 2 ราย รายหนึ่งเขียนชมซะเวอร์  A full introduction to microcontroller design ผมว่าไม่ได้ใกล้เลย เชียร์ไม่ได้ดูเลย  อีกรายหนึ่งบอกได้ว่าหนังสือไม่ได้เรื่อง กรุณาเข้าไป search ดูใน Amazon ด้วยจะได้เห็นว่าผมพูดจริง


ในหนังสือเล่มนี้ ผมคงให้ความเห็นว่า ผู้เขียนเขาแต่งจากประสบการณ์ของผู้เขียนเอง และสอดแทรกความรู้เบื้องต้นไว้บ้าง
ส่วนคำวิจารณ์หนังสือหรือผู้เขียน ผมขออยู่ในมุมผู้อ่านและรับรู้ข้อมูลในหนังสือเล่มนั้น ถูกผิดอย่างไร
ก็อยากให้ผู้รู้ มาให้ข้อมูลที่ถูกต้องกัน จะเป็นประโยชน์กว่า และน่าจะได้ความรู้เพิ่มได้เติมมากกว่า
และอย่างที่กล่าวผมได้แนะนำหนังสือเพื่อให้สอดคล้องและเหมาะสมกับกระทู้เท่านั้น
อย่างไรก็ตาม ขอขอบคุณในความคิดเห็นและคำวิจารณ์ต่อหนังสือของท่านด้วยครับ


Quoteตัวอย่างหนังสือที่ดีเป็นอย่างไร หนังสือ operating system ที่ผมใช้เรียนชื่อ Operating Systems Design and Implementation ของ Andrew S Tanenbaum (Author), Albert S Woodhull (Author) ประมาณ 1000 หน้า เนื้อหาแน่นเอียดตั้งแต่บทแรกจนจบเล่ม ดูใน Amazon ดู review จะเห็นคำวิจารณ์ได้เป็นเรื่องเป็นราว ประวัติ+ประสพการณ์ผู้เขียนน่าเชื่อถือ (สมัยที่อาจารย์ผมเลือกหนังสือมาใช้ยังไม่มี Amazon นะ)

ขอบคุณท่านด้วยครับที่ได้แนะนำหนังสือดีๆเอาไว้ให้ศึกษาครับ และหากเทียบ os กับเรื่องแนวความคิด state machine ก็คงเป็นเพียงส่วนหนึ่งของ os เท่านั้น ผมก็เห็นว่าคงไปเปรียบเทียบไม่ได้


และสำหรับเรื่องผู้เขียนหนังสือในด้านความรู้นี้ ผมคงขอไม่วิจารณ์  ผมเคารพทุกๆคนที่แต่งหนังสือ และให้ข้อมูลไว้กับหนังสือที่ท่านเหล่านั้นบรรจงเขียนไว้ ผมมีความคิดเห็นและเชื่อว่า ผู้เขียนหนังสือ ไม่ว่าจะมีชื่อเสียงหรือไม่ ท่านเหล่านั้นได้พยายามนำข้อมูล,ค้นหาแหล่งความรู้ ประสบการณ์  นำมาถ่ายทอดเป็นตัวหนังสือ,เรียบเรียงและแสดงทัศนคติรวมถึงเจตนาให้เราได้รับรู้ ส่วนที่จะเห็นว่าหนังสือนั้นดีหรือไม่ ผมขอให้ความเห็นว่าน่าจะเป็นผู้อ่านแต่ละท่านได้วิเคราะห์และให้ความคิดเห็นว่าเหมาะสมกับตัวผู้อ่านเองหรือไม่มากกว่าครับ
ทั้งนี้เพราะผมมีความเห็นว่าหนังสือความรู้ ในแต่ละเล่ม อาจไม่ได้เหมาะกับทุกๆคนที่อ่านไปเสียทั้งหมด ทั้งนี้เพราะผู้อ่านแต่ละท่านย่อมมีความรุ้ ความคิดความเห็น รวมถึงประสบการณ์ ที่แตกต่างกันอยู่
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: wlasoi on September 22, 2013, 09:39:53 AM
เยอะ! .. งง จับประเด็นกันไม่ถูก ..
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on September 22, 2013, 09:52:32 PM
Quote from: wlasoi on September 22, 2013, 09:39:53 AM
เยอะ! .. งง จับประเด็นกันไม่ถูก ..

ขอโทษด้วยนะครับ  เรื่องมันยาว พยายามให้ข้อมูลไว้เยอะ ประเด็นมันก็เลยอาจจะมาก ขอให้ช่วยอดทนหน่อยครับ
คิดว่าน่าจะมีประโยชน์ต่อไปในอนาคต หวังว่าคงเข้าใจในเจตนานี้นะครับ

ขอขอบคุณที่ติดตามอ่านกัน
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: ROM on September 25, 2013, 08:21:58 AM
เท่าที่ลองดู ผมว่าแนวนี้มันเหมาะกับ ไมโครคอนโทรลเลอร์ ขนาดเล็กนะ
แต่แค่เพียงเท่านี้ ผมว่ามันก็ทำอะไรได้เยอะแล้ว
ต่อไปก็เริ่มจากไฟกระพริบเทพๆ ไม่ต้องกระพริบดวงเดียว จังหวะเดียวกันแล้วละ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: zilog on September 27, 2013, 10:35:56 AM
เพิ่มเติมให้ ลองดูที่นี่ครับ http://www.state-machine.com
อาจจะซับซ้อนกว่าแต่ก็เป็นรูปแบบ state machine เหมือนกัน เหมาะกับการใช้กับ Microcontroller เช่นกัน
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: ROM on November 28, 2013, 11:16:35 AM
ช่วงที่ผ่านมา ผมได้ลองใช้แนวนี้มาหลาย Project แล้ว เป็นวิธีที่ใช้งานได้ดีมากๆ
ขอบคุณท่าน AppleIIe ครับ ที่เผยแพร่เรื่องนี้ให้ทราบ และทำให้เข้าใจง่ายดีครับ

(http://upic.me/i/s7/1278657565.jpg) (http://upic.me/show/35721266)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: unseen on April 09, 2014, 05:20:30 AM
ไม่ได้แวะดูมานาน ยาวจริงๆกว่าจะมีเวลาอ่านให้หมด แต่ได้สาระดีครับ.... 8)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: iAmBeer on May 08, 2014, 06:26:16 AM
เข้ามาเก็บเกี่ยวความรู้ด้วยครับ  :D
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: OoAMDoO on May 11, 2014, 10:50:21 AM
เยี่ยมครับเจ้าของกระทู้ที่มีน้ำใจแบ่งบัน ในเรื่อง State machine ผมใช้ในการเขียน PLC , Arduino , STM32 ผมว่าถ้าเข้าใจลำดับการทำงานของระบบที่เราจะสร้าง เป็นอย่างดี และมานั่งเขียนเป็นภาพ State machine ในกระดาษและไล่เขียนโปรแกรมจะทำให้โปรแกรมเรามีแบบแผนที่ดีครับ เขียนง่าย แก้ง่าย เพิ่มเติมง่าย ถ้าจะให้ดีต้องรู้เรื่อง Combination logic จะพัฒนาระบบ ใหญ่ ได้ไม่ยากครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on May 13, 2014, 06:49:57 AM
ขอขอบคุณทุกท่านที่สนใจและติดตามกัน หากได้ทดลองก็จะได้เข้าใจมากขึ้น

Quote from: OoAMDoO on May 11, 2014, 10:50:21 AM
เยี่ยมครับเจ้าของกระทู้ที่มีน้ำใจแบ่งบัน ในเรื่อง State machine ผมใช้ในการเขียน PLC , Arduino , STM32 ผมว่าถ้าเข้าใจลำดับการทำงานของระบบที่เราจะสร้าง เป็นอย่างดี และมานั่งเขียนเป็นภาพ State machine ในกระดาษและไล่เขียนโปรแกรมจะทำให้โปรแกรมเรามีแบบแผนที่ดีครับ เขียนง่าย แก้ง่าย เพิ่มเติมง่าย ถ้าจะให้ดีต้องรู้เรื่อง Combination logic จะพัฒนาระบบ ใหญ่ ได้ไม่ยากครับ

ขอขอบคุณท่าน OoAMDoO ที่ร่วมกันแสดงความคิดเห็นครับ
เรื่อง State machine นี้จริงๆยังมีอีกหลากหลายแง่มุม ที่ยังคงมีประโยชน์อยู่ครับ และทุกวันนี้ก็ยังคงมีการใช้งานอยู่บ้าง โดยเฉพาะกับส่วนงานที่เป็นด้าน Hardware ที่ยังคงมีใช้อยู่  แต่ถ้าเป็นการเขียนโปรแกรมแบบ State machine สำหรับงาน multitask เห็นมีไม่ค่อยมาก ยิ่งหากเป็นระบบใหญ่ๆแล้ว(อาจมองขนาดงานและชนิดของงานที่ต่างกันอยู่) ทีมักจะมีการสื่อสารระหว่าง Task กันมาก ในความคิดเห็นส่วนตัวแล้วคิดว่าคงไม่เหมาะสมที่จะใช้มากนัก (อาจร่วมใช้ในส่วนที่จำเป็น) แม้ว่าวิธี State machine นี้จะทำได้ดีก็ตาม เพราะมันจะไล่ดูโปรแกรมยาก ปรับแต่งยากและอาจเกิดก่อปัญหาได้ง่ายมากกว่า เช่นการทำ Synchronization ระหว่าง State machine ก็จะดูโปรแกรมไม่ง่ายนัก งานขนาดนี้บางที RTOS น่าจะดูเหมาะสมกว่า
แต่ถ้าเป็นงานทั่วๆไป การใช้แนว State machine สำหรับงาน multitask นี้ก็ดูเหมาะสมดีครับ เพราะใช้ Resource ค่อนข้างน้อยกว่าในหลายๆเรื่อง
อย่างที่กล่าวเป็นความคิดเห็นโดยส่วนตัวอาจมีมุมมองที่แตกต่างกันอยู่บ้าง ไม่มีผิดมีถูกครับ แต่มาแลกเปลี่ยนข้อมูลความรู้ความเข้าใจกันได้ครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: zero on June 17, 2014, 09:21:11 AM
เป็นข้อมูลที่เป็นประโยชน์ดีครับ คงต้องค่อยๆเก็บรายละเอียด เดี๋ยวเอาไปใช้ประโยชน์บ้าง
เรื่อง State machine น่าจะยังคงเอาไปพัฒนาอะไรได้อีกเยอะนะครับ
เห็นหนังสือ digital หลายๆเล่ม พูดถึงบ่อยๆ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: zero on September 12, 2014, 07:25:14 PM
สงสัยว่าในแต่ละ function ของ co_state เปรียบเสมือน Task ใน RTOS ใช้ไหมครับ ?
ดูเหมือน state machine เมื่อทำเป็นโปรแกรมแล้ว จะค่อนข้างดูซับซ้อนกว่าพวกที่เป็น RTOS นะ แต่ก็ดูท้าทายดีครับ
และโปรแกรมแบบ state machine นี้ หากเกิด interrupt จะต้องระวังอะไรเป็นพิเศษ เหมือนพวก RTOS ไหมครับ ?
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: firmware.c on September 13, 2014, 09:33:56 AM
ผมตอบให้แทนแล้วกันนะครับ
Quoteสงสัยว่าในแต่ละ function ของ co_state เปรียบเสมือน Task ใน RTOS ใช้ไหมครับ ?
ใช่ครับ
และโปรแกรมแบบ state machine นี้ หากเกิด interrupt จะต้องระวังอะไรเป็นพิเศษ เหมือนพวก RTOS ไหมครับ ?
หากไม่ไดใช้ตัวแปรร่วมระหว่าง task กับ interrupt ก็ไม่จำเป็นต้องระวังอะไร
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: zero on September 14, 2014, 03:02:26 PM
Quote from: firmware.c on September 13, 2014, 09:33:56 AM
ผมตอบให้แทนแล้วกันนะครับ
Quoteสงสัยว่าในแต่ละ function ของ co_state เปรียบเสมือน Task ใน RTOS ใช้ไหมครับ ?
ใช่ครับ
และโปรแกรมแบบ state machine นี้ หากเกิด interrupt จะต้องระวังอะไรเป็นพิเศษ เหมือนพวก RTOS ไหมครับ ?
หากไม่ไดใช้ตัวแปรร่วมระหว่าง task กับ interrupt ก็ไม่จำเป็นต้องระวังอะไร

ขอบคุณท่าน firmware.c มากๆครับ ที่มาช่วยตอบในความสงสัย สั้นๆแต่ทำให้เข้าใจได้ดีครับ  :)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: AppleIIe on October 16, 2014, 10:55:27 PM
ยอดเยี่ยมเลยครับท่าน firmware

Quote
และโปรแกรมแบบ state machine นี้ หากเกิด interrupt จะต้องระวังอะไรเป็นพิเศษ เหมือนพวก RTOS ไหมครับ ?

ขอเสริมต่ออีกนิด โปรแกรมแบบนี้ มันจะเป็น co-operative เวลาเกิด interrupt จึงไม่ต้องระวังอะไรมากนัก
ต่างกับ RTOS ที่เป็นแบบ preemptive อันนี้ต้องระวังให้มากขึ้นครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: wizardry on November 28, 2014, 01:46:52 PM
ได้ความรู้เยอะเลย ขอบคุณมากค่ะ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: snball on January 14, 2015, 02:56:14 PM
กำลังทะยอย อ่านเลยครับ ขอบคณครับ
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: zero on February 12, 2015, 06:48:45 AM
ได้ลองมาแล้ว ทั้ง AVR , PIC ใช้งานได้หมด ยอดเยี่ยมมากๆเลย 8)
ขอขอบคุณเจ้าของกระทู้มากๆครับ ที่นำเสนอ มันน่าทึ่งมากจริงๆ  :D
ได้ไอเดียใหม่ๆมาทำอะไรได้เยอะครับ สุดยอดไปเลย
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: Noland on February 12, 2015, 12:48:05 PM
ขอบคุณมากๆๆครับ  :)
Title: Re: ตัวอย่าง project เพื่อการทำงาน Co-operative multitasking ด้วย State machine ในแบบ simple
Post by: wozniak on April 23, 2015, 08:28:11 AM
เพิ่งมีเวลามาอ่าน
Code ได้สุดยอดเลยอะ มีเทคนิค
ขอบคุณมากๆ เป็นแนวทางที่มีประโยชน์มากเลย