Changes between Version 11 and Version 12 of ESP32


Ignore:
Timestamp:
06/12/21 10:12:23 (3 years ago)
Author:
krit
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ESP32

    v11 v12  
    2525ขอยกตัวอย่างครับ เช่นว่า เราต้องการเขียนโปรแกรมสั่ง ESP32 ให้ทำงานอยู่ 2 งาน คือ [ 1 – สั่งให้ไปเก็บค่าจาก Sensor ] และ [ 2 - สั่งให้ส่ง SMS รายงานผล] ตามรูปนี้…
    2626
    27 [[Image(task.png, 50%)]]
     27[[Image(task.png, 30%)]]
    2828
    2929ทั่วไป เราจะเขียนโปรแกรมแบบข้อ 1 เริ่มต้นโดยการสั่งให้ทำฟังก์ชั่นอ่านค่าจาก Analog sensor ก่อน แล้วใส่ Delay() เพื่อรออ่านค่าจาก sensor หลังจากนั้นจึงทำฟังก์ชันส่ง SMS ต่อ ซึ่งก็ใส่ Delay() อีกครั้งเพื่อรอ GSM module ทำงานให้เสร็จ
     
    185185ส่วนใน func2_Task() และ func3_Task() ก็จะสร้าง infinite loop ไว้ปริ้นค่า Hello from task ไว้เช่นกัน และ มี Delay ไว้ 2 วินาทีค่อยทำงานใหม่อีกครั้ง
    186186
     187[[Image(result_task1.png, 30%)]]
     188
    187189การทำงานของ code นี้
    188190{{{
     
    196198STATE ของ TASK
    197199
    198 [[Image(state_task.jpeg, 50%)]]
     200[[Image(state_task.jpeg, 30%)]]
    199201
    200202เพื่อความเข้าใจในการจัดการ Task เพิ่มขึ้น ควรจะมาดูเรื่อง State การทำงานของ Task กันต่อ ซึ่งมี 4 State ดังนี้
     
    219221}}}
    220222มาลองดู code ตัวอย่างกันครับ
    221 
     223{{{
     224TaskHandle_t Task1 = NULL;
     225TaskHandle_t Task2 = NULL;
     226TaskHandle_t Task3 = NULL;
     227TaskHandle_t Task4 = NULL;
     228
     229void setup() {
     230  Serial.begin(115200); 
     231  delay(2000); 
     232  // Created 4 Task here 
     233  xTaskCreatePinnedToCore(f4_Task,"func4_Task",1000,NULL,4,&Task3,0);
     234  xTaskCreatePinnedToCore(f3_Task,"func3_Task",1000,NULL,3,&Task3,0);
     235  xTaskCreatePinnedToCore(f2_Task,"func2_Task",1000,NULL,2,&Task2,0);
     236  xTaskCreatePinnedToCore(f1_Task,"func1_Task",1000,NULL,1,&Task1,0);
     237}
     238
     239void loop() {
     240
     241}
     242
     243void f4_Task(void *pvParam){       
     244 
     245  Serial.println(String("Hello from TASK4 , Priority is : ") + uxTaskPriorityGet(Task4));
     246  int newPriority = uxTaskPriorityGet(Task4) - 4;
     247  Serial.println(String("NOW WE CHANGE PRIORITY OF TASK4 TO BE : ") + newPriority );     
     248  vTaskPrioritySet(Task4,newPriority);
     249 
     250  Serial.println(String("Hello again from TASK4 , then delete TASK4 !"));
     251  vTaskDelete(NULL);
     252 
     253}
     254
     255void f3_Task(void *pvParam){
     256       
     257  Serial.println(String("Hello from TASK3 , then Suspend TASK2 & TASK3 !"));
     258  vTaskSuspend(Task2);
     259  vTaskSuspend(NULL);       
     260
     261  Serial.println(String("Hello again from TASK3 , then delete TASK3 !"));
     262  vTaskDelete(NULL);
     263 
     264}
     265
     266void f2_Task(void *pvParam){
     267       
     268  Serial.println(String("Hello from TASK2 , then Resume TASK3 !"));
     269  vTaskResume(Task3);       
     270
     271  Serial.println(String("Hello again from TASK2 , then delete TASK2 !"));
     272  vTaskDelete(Task2);
     273 
     274}
     275
     276void f1_Task(void *pvParam){
     277       
     278  Serial.println(String("Hello from TASK1 , then Resume TASK2 !"));
     279  vTaskResume(Task2);       
     280
     281  Serial.println(String("Hello again from TASK1 , then delete TASK1 !"));
     282  vTaskDelete(NULL);
     283 
     284}
     285
     286}}}
    222287คร่าวๆการทำงานของ code ตัวอย่าง เราจะสร้าง Task มาลองทำงานแบบสลับ State เมื่อทำงานจบ ก็จะลบ Task ทิ้งไป
    223288{{{
     
    302367    ลบ Task1 ทิ้ง โดยคำสั่ง `vTaskDelete(…)`
    303368
     369[[Image(result_task2.png, 30%)]]
    304370การทำงานของตัวอย่าง code นี้
    305371{{{