millis () รีเซ็ตตัวเองเป็น 0 ได้อย่างไร


14

ดูที่เอกสารสำหรับmillis()ฟังก์ชั่นกล่าวว่า:

ส่งคืนจำนวนมิลลิวินาทีนับตั้งแต่บอร์ด Arduino เริ่มทำงานโปรแกรมปัจจุบัน จำนวนนี้จะล้น (กลับไปที่ศูนย์) หลังจากประมาณ 50 วัน

เป็นไปได้อย่างไร? Arduino ตรวจจับเมื่อmillis()โอเวอร์โฟลว์แล้วรีเซ็ตค่าเป็น 0 หรือไม่ ถ้าเป็นเช่นนั้นมันจะทำอย่างไร ฉันแค่อยากรู้ว่าเกิดอะไรขึ้นภายใต้ประทุนกับตัวแปรที่millis()ฟังก์ชันส่งคืน

คำตอบ:


25

millis()มันไม่ได้เป็นคุณสมบัติพิเศษของ ตัวนับใด ๆ ที่มีตัวเลข จำกัด ในที่สุดก็กลับไปที่ศูนย์ ยกตัวอย่างเช่น 4 9999หลักเคาน์เตอร์นับกลับไปที่ศูนย์หลัง

ภายใต้ประทุนตัวแปรสำหรับmillis()ประเภทunsigned longนั้นคือ 32 บิตบน Arduino ในกรณีนี้ 32 บิต (ไบนารี 0 และ 1 ของ) คล้ายกับหลัก (0 ถึง 9) บนเคาน์เตอร์นับ

11111111 11111111 11111111 11111111สูงสุดคือ เมื่อมีการกลับไปที่ศูนย์เมื่อคุณเพิ่มmillis() 1ค่าสูงสุด (32 "ค่า") คือ2^32 - 1ซึ่งเท่ากับ4294967295ในระบบเลขทศนิยม ดังนั้นค่าสูงสุดสำหรับตัวนับคือ 4,294,967,295 มิลลิวินาที แปลงเป็นวันคุณจะได้รับประมาณ 49.71 วัน

นับสำคัญ


5
Windows รุ่นเก่ายังคงมีการนับเป็นมิลลิวินาทีเป็นจำนวนเต็ม 32 บิตทำให้ซอฟต์แวร์จำนวนมากทำงานผิดพลาดหลังจากเวลาผ่านไป 49 วัน
รัสเซล Borogove

ขอบคุณ JURAJ! ตอบคำถามที่ฉันสงสัย อัปเดต;)
โทนี่กิล

PS: ฉันหวังว่าคุณจะอนุมัติการแก้ไขฉันรู้สึกว่าพวกเขาเพิ่มคำตอบที่ยอดเยี่ยมของคุณโดยการอธิบายโครงสร้างประโยคสองสามข้อ
โทนี่กิล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.