Quote from: dec on September 11, 2018, 08:12:45 AMขอบคุณคร๊าบบบQuote from: TaoTao on September 11, 2018, 02:38:22 AMจริงๆ มันก็ต้องซ้ายไปขวาแหละครับ อันนี้ผมสับสนเอง ต้องขอโทษด้วยครับ ยังงงตัวเองเหมือนกัน
ตอนแรก เคยเข้าใจว่า มันประมวลผล ตามลำดับที่เราโค้ดเลย
คือ ซ้ายไปขวา บนลงล่่าง
เข้าใจละ ต้องเข้าถึงทีละ volatile
ตอนนี้ หายแล้วๆ ผมทำแบบนี้อ่ะครับ
tim1_rec_[0] = TIM1->CNTRH << 8;
tim1_rec_[0] |= TIM1->CNTRL;
อ่อ ต้องเก็บ High ก่อน ค่าจะได้ไม่ผิดเพี้ยนเยอะ
ขอบคุณค๊าบบบบ
ว่าทำไมถึงคิดออกมาได้ว่ามันอาจไม่ซ้ายไปขวา
จริงๆ ต้องบอกว่าใน 1 statement มันก็ต้องใช้คำสั่ง assembly มากกว่า 1 คำสั่ง
มันเสี่ยงที่จะเกิดเหตุการณ์ อ่านค่า volatile ตัวแรกมาแล้ว แล้วก่อนจะอ่านค่าอีกตัว มันเกิด interrupt
หรือเกิด context switch กรณีใช้ os ขึ้น แล้วทำให้ volatile อีกตัวเปลี่ยนค่าไปก่อนจะอ่านมันนั่นแหละครับ
เรื่องแบบนี้เกิดได้กับตัวแปรทุกตัว แต่ถ้านิยามเป็น volatile แล้ว compiler มันจะเอาใจใส่เป็นพิเศษกว่า
หลายคนยังเข้าใจผิดว่า 1 statement มันจะประมวลผลจนเสร็จ แล้วค่อยเกิด interrupt หรือ context switch
แต่ในความเป็นจริงมันเกิดในระดับภาษา assembly มันจึงมีความเสี่ยงที่ statement นั้น จะไม่ได้ผลลัพธ์ตามที่เขียนนั่นเอง
สุดท้ายแล้วถ้าแยกมาเขียน เป็นหลาย statement แทนมันจะต่างอะไร ก็ต้องบอกว่าไม่ต่างกันครับ แต่มันจะคาดเดาผลลัพธ์
ของแต่ละ statement ได้ชัดเจนกว่าแค่นั้นเอง