Electoday 4.0

ใน Keil มีวิธีดูไหมครับว่าใช้ CPU ไม่กี่ %

ผมเริ่มมาใช้ Keil มากขึ้น อยากทราบว่ามีวิธีดูว่าใช้ CPU ไปกี่ % มันมีไหมครับเหมือนตอนเขียน แอปมือถือ อะไรแบบนั้น  ถ้าไม่มีจาก Keil ท่านอื่นๆใช้วิธีไหนวัดกันบ้าง

Offline dec

หมายถึง % cpu usage รึเปล่าครับ ถ้าใช่สำหรับการโปรแกรม microcontroller แบบ bare metal แล้ว cpu ทำงาน 100% ตลอดครับ เว้นแต่จะลง sleep mode

ต้องเข้าใจก่อนว่าการระบุ % cpu usage ในระบบปฏิบัติการอเนกประสงค์ทั่วไป คือการบอกว่าในเวลา 1 วินาทีนั้น cpu มีการ switch context ไป process task นั้นกี่วิ โดยธรรมชาติของ task บนระบบปฏิบัติการอเนกประสงค์จะมีการ blocking เกิดขึ้นตลอด ถ้าเกิดการ blocking ขึ้น cpu ก็จะ switch context ไป process task อื่น แต่ถ้าขณะนั้นไม่มี task ไหนทำงานเลย cpu จะไป process idle task ซึ่งเป็น task เปล่าๆ ไม่ได้ทำงานอะไรเป็นพิเศษ ซึ่งในสมัยก่อน windows จะมีการโชว์ idle task ใน task manager ด้วย ถ้าปล่อยคอมไว้เฉย ๆ cpu usage ของ idle task จะสูงถึง 99%  (100% - % cpu usage ของ idle task จะได้ % cpu usage ของระบบ) ซึ่งหมายความว่า cpu ไม่มี task ที่ต้อง process เลยในขณะนั้น แต่มันชอบทำให้คนเข้าใจผิดนึกว่าเป็น virus ใน windows version ใหม่ๆ จะซ่อน idle task นี้


ยืมภาพจาก google ตัวอย่าง idle task ใน windows vista

ส่วนใน microcontroller นั้น RTOS บางตัวอาจมีระบบนี้ หรือไม่ก็ต้องใช้ RTOS ร่วมกับ IDE บางตัว เช่น NXP FTF Hands-On with FreeRTOS Task Aware Debugger
https://mcuoneclipse.com/2016/05/18/nxp-ftf-hands-on-with-freertos-task-aware-debugger/

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

ต้องทำความเข้าใจใหม่นะครับ
CPU มันไม่เต็มหรอกครับ มันมีแต่ทำงาน (100%) กับไม่ทำงาน (0%)
เมื่อมันทำงาน ไม่ว่าจะคำสั่งเดียว หรือล้านคำสั่ง มันก็ทำงาน 100% เหมือนกัน
เมื่อไม่ต้องการให้มันทำงาน ก็ต้องเปลี่ยนโหมดมัน เป็น idle mode หรือ sleep mode

ถามว่า
  แล้วทำไมถึงบอกได้ว่า CPU ทำงานกี่ %
ตอบ
  การคำนวนหา % การทำงานของ CPU จะเอาเวลาเป็นตัวกำหนด
เช่น ใน 1 วินาที CPU ทำงานใช้เวลาไปเท่าไหร่ แล้ว เข้า sleep mode ใช้เวลาไปเท่าไหร่
สมมุติว่า ทำงาน 0.2 วินาที่ แล้ว sleep ไป 0.8 วินาที จะได้ 0.2/(0.2+0.8) * 100 = 20%


Offline dec

ถ้าชิป mcu ปกติดี แล้วเราให้ cpu คำนวนอะไรมากเกินไป มันก็แค่จะคำนวนเสร็จช้าครับ สิ่งที่จะเต็มได้ก็น่าจะเป็นพวก memory โดยเฉพาะ stack ถ้าไม่เชี่ยวชาญอาจจะงงได้ ทั้ง ๆ ที่ code ไม่ได้ผิดอะไร แต่อยู่ ๆ ค่าในตัวแปรบางตัวก็เกิดเพี้ยน แล้วก็ hard fault ไปตามระเบียบ ซึ่งส่วนใหญ่จะเป็นเพราะการเขียน code ที่ไม่ดี

Offline TaoTao

  • ***
  • 189
    • View Profile
สำหรับ mcu
ผมเข้าใจว่า มันทำงาน 100% ตลอดเวลา นะครับ
cycle ต่อ cycle เลย

เพียงแต่ว่า การโคดดิ้งบางลักษณะที่แบ่งเวลาออกเป็น ช่วงๆ
หรือ ทำงานโดยอ้างอิงกับเวลา
(แต่ผมว่า คนโคดดิ้งแบบนี้ น่าจะน้อย เพราะวุ่ยวายกว่า)
มันอาจเสร็จก่อน หรือหลัง ที่เราต้องการ เท่านั้นเอง

ถ้าเสร็จก่อน มันก็วิ่งบรรทัดต่อมา และรันคำสั่งต่อไป ทันที
ถ้าเสร็จหลังละก็ เราอาจต้อง บริหาร-จัดการ ใหม่
เพื่อป้องการความผิดพลาดที่อาจเกิดขึ้น

แต่หาก มันไม่ทำงาน
ทีนี้ ได้งานงอกแน่ๆ อิอิ
 ;D

Offline az

  • ***
  • 156
    • View Profile
ทำงานเกี่ยวกับกับ task processor สโคปนี่ขาดไม่ได้เลยนะครับ

โดยปกติจะมี clock รันอยู่ตลอดเวลา เมื่อถึงเวลาตามที่กำหนดก็เกิด event interrupt ให้ทำงานตามต้องการ

ปัจจุบัน mcu เบอร์ใหม่ๆ มันสามารถกำหนดลำดับการเกิดก่อนหลังได้ครับ  หรือแม้แต่สั่งให้ mcu sleep หลังจากทำงานเสร็จ โดยไปรันบน clock อีกตัวหนึ่ง  แต่เมื่อถึง scheduled ก็กลับมาใช้ clock อีกตัวหนึ่งเพื่อให้ทำงานได้เต็มประสิทธิภาพ
เพราะแสวงหา..  มิใช่เพราะรอคอย
เพราะเชี่ยวชาญ..  มิใช่เพราะโอกาส
เพราะสามารถ..  มิใช่เพราะโชคช่วย
ดังนี้แล้ว "ลิขิตฟ้า  หรือจะสู้มานะตน..."

Offline wlasoi

  • *****
  • 739
    • View Profile
ต้องเขียนบน OS ครับ ซึ่ง OS ก็ต้องระดับกลางๆ อย่าง freeRTOS ขึ้นไปจนถึงพวกใหญ่ๆแบบ uCOS eCOS etc. จะมี service ไว้คอยตรวจสอบ ครับ  ถ้า  keil  นี่มี  plugin ให้เลยน่ะถ้าจำไม่ผิดเคยใช้อยู่