อืม ทำไม มันไม่คิดเลขให้อ่ะครับ งง @_@!

  • 4 Replies
  • 906 Views
*

Offline TaoTao

  • ***
  • 239
    • View Profile
STM8 นะครับ

คือ ผมสร้าง uint16_t   get_cnt_[2];
ดักไว้ 2 จุดของ Function ใน Interrupt function คือ it.c
เพื่อรับค่า การ นับ TIM1
ตัวแปร get_cnt มันรับค่าได้ปกติ

แต่พอสร้างตัวแปรอีกตัว
เพื่อให้มันลบกัน คือ delta ใน main.c มันไม่ยอมหาค่าให้
ตัวแปร delta เป็น 0 ตลอดเลย

ลองทุกกระบวนท่าละ ลองเป็น volatile ใน local มันก็ไม่ยอมลบให้
มันเป็นเพราะอะไร หรือครับ @_@!

*

Offline dec

  • **
  • 69
    • View Profile
หลังจาก set ค่าให้ delta แล้ว ลองเขียน code เอาตัวแปร delta ไปใช้ดูครับ
ลองเอา delta ไปเซ็ตให้ตัวแปรอื่นก็ได้

บางที compiler มันเห็นว่าตัวแปรไม่ได้ถูกใช้มันก็ตัด code ที่ set ค่าให้ตัวแปรนั้นทิ้งไปดื้อ ๆ

*

Offline TaoTao

  • ***
  • 239
    • View Profile
ขนาด set no optimize ที่ c complier แล้วนะ
จำได้ว่า iar เวอร์ชั่นเก่า อาการนี้ หาย..
iar เวอร์ชั่นล่าสุด layout ดี ใช้ๆ ไป มีมึน @_@!

เดี๋ยวลองๆ ^__^

ขอบคุณมากมายครับ

ได้ลองพิจารณาในเรื่องความไม่เป็น atomic ของตัวแปรหรือยังครับ
เนื่องจาก MCU เป็น 8-bit การเข้าถึงตัวแปร 16-bit จึงไม่สามารถทำให้เสร็จได้ในคำสั่งเดียว
Interrupt อาจเกิดขึ้นในระหว่างกำลังเข้าถึงตัวแปร 16-bit ทำให้ค่าในตัวแปร 16-bit นั้น ไม่เป็นไปอย่างที่ควรจะเป็น :)

*

Offline TaoTao

  • ***
  • 239
    • View Profile
ได้ลองพิจารณาในเรื่องความไม่เป็น atomic ของตัวแปรหรือยังครับ
เนื่องจาก MCU เป็น 8-bit การเข้าถึงตัวแปร 16-bit จึงไม่สามารถทำให้เสร็จได้ในคำสั่งเดียว
Interrupt อาจเกิดขึ้นในระหว่างกำลังเข้าถึงตัวแปร 16-bit ทำให้ค่าในตัวแปร 16-bit นั้น ไม่เป็นไปอย่างที่ควรจะเป็น :)

อืม น่าจะใช่นะครับ มันอาจ ทำไม่ทันจริงๆ
เพราะการ get/set 8 bits ก็ปกติดี

ตอนนี้ แก้ได้ละครับ โดยต้อง
ปรับตัวแปรนั้น เป็นตัวแปรรับค่านั้น เป็น volatile(local)
พร้อมทั้ง ต้องนำค่านั้น มาคำนวนอีกรอบด้วย ตามที่คุณ dec ได้บอกไว้
ที่ใช้ คือ ++var; ง่ายดี มันถึงจะยอมอัพเดทค่าให้  ^__^!

ขอบคุณทุกคนน่ะครับ