Changes between Version 3 and Version 4 of ESP32


Ignore:
Timestamp:
06/12/21 08:50:36 (3 years ago)
Author:
krit
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ESP32

    v3 v4  
    8888}}}
    8989มาถึงส่วนของฟังก์ชั่น setup(…) เราจะประกาศ Created Task กันในฟังก์ชันนี้ โดยใช้คำสั่ง xTaskCreatePinnedToCore(…)
    90 
     90{{{
    9191    Task ที่ 1 : ผูกกับฟังก์ชั่น func1_Task() , ตั้งชื่อ Task ว่า “func1_Task”,DepthStack = 1000 ,ส่งตัวแปร PassValue เข้าไปใน Task นี้ด้วย , มีค่า Priority = 1 , ผูกกับ TaskHandle ชื่อว่า Task1 และให้ Task นี้ทำงานอยู่บน Core 0
    9292    Task ที่ 2 และ 3 : ผูกกับ func2_Task() และ func3_Task() ตามลำดับ โดยไม่มีการส่งตัวแปรเข้าไปใน Task , มี Priority = 1 และให้ Task ทำงานอยู่บน Core 0 เหมือนกัน
     93}}}
     94
    9395{{{
    9496void loop() { }
     
    111113    อัพเดทค่า f1param +1 เข้าไป ซึ่งตัวแปร passValue ก็จะถูกอัพเดทค่าใหม่นี้ด้วย เพราะเป็น pointer ของ f1param
    112114    ทำการ Delay Task1 ไว้ 2 วินาที แล้วจะวนมาทำงานใหม่
    113 
     115{{{
    114116void func2_Task(void *pvParam){
    115117    while(1){     
     
    123125    }   
    124126  }
     127}}}
    125128
    126129ส่วนใน func2_Task() และ func3_Task() ก็จะสร้าง infinite loop ไว้ปริ้นค่า Hello from task ไว้เช่นกัน และ มี Delay ไว้ 2 วินาทีค่อยทำงานใหม่อีกครั้ง
    127130
    128131การทำงานของ code นี้
    129 
     132{{{
    130133    Task ถูกสร้างไล่เรียงลำดับเป็น Task1 , Task2 และ Task3 ภายใน Setup()
    131134    เนื่องจากทุกTask มีค่า Priority เท่ากัน Task 1 ที่สร้างขึ้นมาก่อนจึงได้ทำงานก่อน และ Task2 และ Task3 จะทำงานเรียงต่อกันไป
     
    134137    หลังจาก Task2 ถูก Blocked แล้ว Task3 จะเริ่มทำงาน โดยการปริ้น “Hello from Task3” แล้วทำการ blocked Task3 ให้หยุดทำงานชั่วคราว 2 วินาที
    135138    เมื่อ ครบ 2 วินาที Task1,Task2 และ Task3 จะกลับมาทำงานปกติ ทำงานวนไปเรื่อยๆ
    136 
     139}}}
    137140STATE ของ TASK
    138141
    139142เพื่อความเข้าใจในการจัดการ Task เพิ่มขึ้น ควรจะมาดูเรื่อง State การทำงานของ Task กันต่อ ซึ่งมี 4 State ดังนี้
    140 
     143{{{
    1411441) Running state : Task ที่มี Priority สูงสุด จะได้ทำงานใน State นี้ และเป็น Task เดียวที่ได้ทำงานในเวลานั้นๆ
    142145
     
    146149
    1471504) Suspended state : Task ที่อยู่ใน state นี้คือ Task ที่โดนสั่งให้พักการทำงาน โดยใช้คำสั่ง vTaskSuspend() และหาต้องการให้ Task นั้นๆ กลับมาทำงานตามปกติ เราต้องส่งคำสั่ง vTaskResume() เพื่อปลดล็อค
    148 
     151}}}
    149152RTOS API บางส่วนที่เราจะมาดูกันเพิ่ม เพื่อลองเขียนโปรแกรมเปลี่ยน State ของ Task มีดังนี้
    150 
     153{{{
    151154    xTaskCreated(…) : สร้าง Task ใหม่
    152155    vTaskDelete(…) : ลบ Task ที่เคยสร้างไว้ ( เลิกใช้งาน Task )
     
    156159    vTaskPriorityGet(…) : อ่านค่า Priority ของ Task
    157160    vTaskPrioritySet(…) : เปลี่ยนค่า Priority ของ Task
    158 
     161}}}
    159162มาลองดู code ตัวอย่างกันครับ
    160163
    161164คร่าวๆการทำงานของ code ตัวอย่าง เราจะสร้าง Task มาลองทำงานแบบสลับ State เมื่อทำงานจบ ก็จะลบ Task ทิ้งไป
    162 
     165{{{
    163166TaskHandle_t Task1 = NULL;
    164167TaskHandle_t Task2 = NULL;
    165168TaskHandle_t Task3 = NULL;
    166169TaskHandle_t Task4 = NULL;
    167 
     170}}}
    168171เริ่มต้นด้วยการสร้างตัวแปรมาเก็บค่า TaskHandle ของแต่ละ Task
    169 
     172{{{
    170173void setup() {
    171174  Serial.begin(115200); 
     
    177180  xTaskCreatePinnedToCore(f1_Task,"func1_Task",1000,NULL,1,&Task1,0);
    178181}
    179 
     182}}}
    180183ใน Setup() เราประกาศสร้าง Task จำนวน 4 Task โดยแต่ละ Task มี Priority ต่างกัน
    181 
     184{{{
    182185void f4_Task(void *pvParam){       
    183186 
     
    191194 
    192195}
    193 
     196}}}
    194197ฟังก์ชั่น f4_Task() ที่ผูกกับ Task4
    195198
     
    197200    เปลี่ยน Priority ของ Task4 จาก 4 ให้เป็น 0 ( ต่ำสุด ) ด้วยฟังก์ชัน vTaskPrioritySet(…)
    198201    ลบ Task4 ทิ้ง โดยคำสั่ง vTaskDelete(…)
    199 
     202{{{
    200203void f3_Task(void *pvParam){
    201204       
     
    206209 
    207210}
    208 
     211}}}
    209212ฟังก์ชั่น f3_Task() ที่ผูกกับ Task3
    210213
     
    212215    Suspend Task2 และ Task3 ด้วยคำสั่ง vTaskSuspend(…)
    213216    ลบ Task3 ทิ้ง โดยคำสั่ง vTaskDelete(…)
    214 
     217{{{
    215218void f2_Task(void *pvParam){
    216219       
     
    220223 
    221224}
    222 
     225}}}
    223226ฟังก์ชั่น f2_Task() ที่ผูกกับ Task2
    224227
     
    226229    Resume Task3 ด้วยคำสั่ง vTaskResume(…)
    227230    ลบ Task2 ทิ้ง โดยคำสั่ง vTaskDelete(…)
    228 
     231{{{
    229232void f1_Task(void *pvParam){
    230233       
     
    233236  vTaskDelete(NULL);
    234237 
    235 }x
    236 
     238}
     239}}}
    237240ฟังก์ชั่น f1_Task() ที่ผูกกับ Task1
    238241
     
    286289Mar 29, 2019
    287290MQL4 : เริ่มต้นเขียน Expert Advisor
    288 
    289291สวัสดีครับทุกท่าน ผมคิดว่าใครที่เข้ามาอ่านบทความนี้น่าจะกำลังสนใจที่จะศึกษาการเขียน Expert Advisor เพื่อเป็นตัวช่วยในการเทรด Forex ( ตลาดซื้อขายคู่เงินตราต่างประเทศ ) ซึ่งใครที่เพิ่งจะเริ่มต้นเทรด ผมขอแนะนำให้ไปศึกษาหลักการและวิธีการเทรดจาก Blog อื่นๆ ก่อนนะครับ ข้อมูลมันเยอะมาก
    290292โปรแกรม Meta Trader ( MT4 ) ซึ่งใช้ในการเทรดค่าเงินต่างประเทศ