Changes between Version 3 and Version 4 of ESP32
- Timestamp:
- 06/12/21 08:50:36 (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
ESP32
v3 v4 88 88 }}} 89 89 มาถึงส่วนของฟังก์ชั่น setup(…) เราจะประกาศ Created Task กันในฟังก์ชันนี้ โดยใช้คำสั่ง xTaskCreatePinnedToCore(…) 90 90 {{{ 91 91 Task ที่ 1 : ผูกกับฟังก์ชั่น func1_Task() , ตั้งชื่อ Task ว่า “func1_Task”,DepthStack = 1000 ,ส่งตัวแปร PassValue เข้าไปใน Task นี้ด้วย , มีค่า Priority = 1 , ผูกกับ TaskHandle ชื่อว่า Task1 และให้ Task นี้ทำงานอยู่บน Core 0 92 92 Task ที่ 2 และ 3 : ผูกกับ func2_Task() และ func3_Task() ตามลำดับ โดยไม่มีการส่งตัวแปรเข้าไปใน Task , มี Priority = 1 และให้ Task ทำงานอยู่บน Core 0 เหมือนกัน 93 }}} 94 93 95 {{{ 94 96 void loop() { } … … 111 113 อัพเดทค่า f1param +1 เข้าไป ซึ่งตัวแปร passValue ก็จะถูกอัพเดทค่าใหม่นี้ด้วย เพราะเป็น pointer ของ f1param 112 114 ทำการ Delay Task1 ไว้ 2 วินาที แล้วจะวนมาทำงานใหม่ 113 115 {{{ 114 116 void func2_Task(void *pvParam){ 115 117 while(1){ … … 123 125 } 124 126 } 127 }}} 125 128 126 129 ส่วนใน func2_Task() และ func3_Task() ก็จะสร้าง infinite loop ไว้ปริ้นค่า Hello from task ไว้เช่นกัน และ มี Delay ไว้ 2 วินาทีค่อยทำงานใหม่อีกครั้ง 127 130 128 131 การทำงานของ code นี้ 129 132 {{{ 130 133 Task ถูกสร้างไล่เรียงลำดับเป็น Task1 , Task2 และ Task3 ภายใน Setup() 131 134 เนื่องจากทุกTask มีค่า Priority เท่ากัน Task 1 ที่สร้างขึ้นมาก่อนจึงได้ทำงานก่อน และ Task2 และ Task3 จะทำงานเรียงต่อกันไป … … 134 137 หลังจาก Task2 ถูก Blocked แล้ว Task3 จะเริ่มทำงาน โดยการปริ้น “Hello from Task3” แล้วทำการ blocked Task3 ให้หยุดทำงานชั่วคราว 2 วินาที 135 138 เมื่อ ครบ 2 วินาที Task1,Task2 และ Task3 จะกลับมาทำงานปกติ ทำงานวนไปเรื่อยๆ 136 139 }}} 137 140 STATE ของ TASK 138 141 139 142 เพื่อความเข้าใจในการจัดการ Task เพิ่มขึ้น ควรจะมาดูเรื่อง State การทำงานของ Task กันต่อ ซึ่งมี 4 State ดังนี้ 140 143 {{{ 141 144 1) Running state : Task ที่มี Priority สูงสุด จะได้ทำงานใน State นี้ และเป็น Task เดียวที่ได้ทำงานในเวลานั้นๆ 142 145 … … 146 149 147 150 4) Suspended state : Task ที่อยู่ใน state นี้คือ Task ที่โดนสั่งให้พักการทำงาน โดยใช้คำสั่ง vTaskSuspend() และหาต้องการให้ Task นั้นๆ กลับมาทำงานตามปกติ เราต้องส่งคำสั่ง vTaskResume() เพื่อปลดล็อค 148 151 }}} 149 152 RTOS API บางส่วนที่เราจะมาดูกันเพิ่ม เพื่อลองเขียนโปรแกรมเปลี่ยน State ของ Task มีดังนี้ 150 153 {{{ 151 154 xTaskCreated(…) : สร้าง Task ใหม่ 152 155 vTaskDelete(…) : ลบ Task ที่เคยสร้างไว้ ( เลิกใช้งาน Task ) … … 156 159 vTaskPriorityGet(…) : อ่านค่า Priority ของ Task 157 160 vTaskPrioritySet(…) : เปลี่ยนค่า Priority ของ Task 158 161 }}} 159 162 มาลองดู code ตัวอย่างกันครับ 160 163 161 164 คร่าวๆการทำงานของ code ตัวอย่าง เราจะสร้าง Task มาลองทำงานแบบสลับ State เมื่อทำงานจบ ก็จะลบ Task ทิ้งไป 162 165 {{{ 163 166 TaskHandle_t Task1 = NULL; 164 167 TaskHandle_t Task2 = NULL; 165 168 TaskHandle_t Task3 = NULL; 166 169 TaskHandle_t Task4 = NULL; 167 170 }}} 168 171 เริ่มต้นด้วยการสร้างตัวแปรมาเก็บค่า TaskHandle ของแต่ละ Task 169 172 {{{ 170 173 void setup() { 171 174 Serial.begin(115200); … … 177 180 xTaskCreatePinnedToCore(f1_Task,"func1_Task",1000,NULL,1,&Task1,0); 178 181 } 179 182 }}} 180 183 ใน Setup() เราประกาศสร้าง Task จำนวน 4 Task โดยแต่ละ Task มี Priority ต่างกัน 181 184 {{{ 182 185 void f4_Task(void *pvParam){ 183 186 … … 191 194 192 195 } 193 196 }}} 194 197 ฟังก์ชั่น f4_Task() ที่ผูกกับ Task4 195 198 … … 197 200 เปลี่ยน Priority ของ Task4 จาก 4 ให้เป็น 0 ( ต่ำสุด ) ด้วยฟังก์ชัน vTaskPrioritySet(…) 198 201 ลบ Task4 ทิ้ง โดยคำสั่ง vTaskDelete(…) 199 202 {{{ 200 203 void f3_Task(void *pvParam){ 201 204 … … 206 209 207 210 } 208 211 }}} 209 212 ฟังก์ชั่น f3_Task() ที่ผูกกับ Task3 210 213 … … 212 215 Suspend Task2 และ Task3 ด้วยคำสั่ง vTaskSuspend(…) 213 216 ลบ Task3 ทิ้ง โดยคำสั่ง vTaskDelete(…) 214 217 {{{ 215 218 void f2_Task(void *pvParam){ 216 219 … … 220 223 221 224 } 222 225 }}} 223 226 ฟังก์ชั่น f2_Task() ที่ผูกกับ Task2 224 227 … … 226 229 Resume Task3 ด้วยคำสั่ง vTaskResume(…) 227 230 ลบ Task2 ทิ้ง โดยคำสั่ง vTaskDelete(…) 228 231 {{{ 229 232 void f1_Task(void *pvParam){ 230 233 … … 233 236 vTaskDelete(NULL); 234 237 235 } x236 238 } 239 }}} 237 240 ฟังก์ชั่น f1_Task() ที่ผูกกับ Task1 238 241 … … 286 289 Mar 29, 2019 287 290 MQL4 : เริ่มต้นเขียน Expert Advisor 288 289 291 สวัสดีครับทุกท่าน ผมคิดว่าใครที่เข้ามาอ่านบทความนี้น่าจะกำลังสนใจที่จะศึกษาการเขียน Expert Advisor เพื่อเป็นตัวช่วยในการเทรด Forex ( ตลาดซื้อขายคู่เงินตราต่างประเทศ ) ซึ่งใครที่เพิ่งจะเริ่มต้นเทรด ผมขอแนะนำให้ไปศึกษาหลักการและวิธีการเทรดจาก Blog อื่นๆ ก่อนนะครับ ข้อมูลมันเยอะมาก 290 292 โปรแกรม Meta Trader ( MT4 ) ซึ่งใช้ในการเทรดค่าเงินต่างประเทศ