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

Started by TaoTao, July 24, 2018, 08:18:07 AM

Previous topic - Next topic

TaoTao

STM8 นะครับ

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

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

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

dec

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

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

TaoTao

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

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

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


mr.mai

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

TaoTao

Quote from: mr.mai on July 26, 2018, 02:59:50 AM
ได้ลองพิจารณาในเรื่องความไม่เป็น atomic ของตัวแปรหรือยังครับ
เนื่องจาก MCU เป็น 8-bit การเข้าถึงตัวแปร 16-bit จึงไม่สามารถทำให้เสร็จได้ในคำสั่งเดียว
Interrupt อาจเกิดขึ้นในระหว่างกำลังเข้าถึงตัวแปร 16-bit ทำให้ค่าในตัวแปร 16-bit นั้น ไม่เป็นไปอย่างที่ควรจะเป็น :)

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

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

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