constหมายความว่าไม่สามารถแก้ไขตัวแปรด้วยรหัส c ไม่ใช่ว่าไม่สามารถเปลี่ยนแปลงได้ หมายความว่าไม่มีคำสั่งใดสามารถเขียนถึงตัวแปรได้ แต่ค่าของมันอาจยังเปลี่ยนแปลง
volatileหมายความว่าตัวแปรอาจเปลี่ยนแปลงได้ตลอดเวลาดังนั้นจึงไม่มีการใช้ค่าแคช การเข้าถึงตัวแปรแต่ละรายการจะต้องดำเนินการไปยังที่อยู่หน่วยความจำ
เนื่องจากคำถามถูกแท็ก "ฝังตัว" และสมมติว่าtempเป็นตัวแปรที่ผู้ใช้ประกาศไม่ใช่รีจิสเตอร์ที่เกี่ยวข้องกับฮาร์ดแวร์ (เนื่องจากโดยปกติจะจัดการในไฟล์. h แยกต่างหาก) ให้พิจารณา:
หน่วยประมวลผลแบบฝังตัวซึ่งมีทั้งหน่วยความจำข้อมูลแบบอ่าน - เขียนข้อมูล (RAM) และหน่วยความจำข้อมูลแบบอ่านอย่างเดียวที่ไม่ลบเลือนตัวอย่างเช่นหน่วยความจำ FLASH ในสถาปัตยกรรมฟอน - นอยมันน์ที่ข้อมูลและพื้นที่โปรแกรมใช้ข้อมูลร่วมกันและบัสแอดเดรส
หากคุณประกาศว่าconst tempมีค่า (อย่างน้อยถ้าแตกต่างจาก 0) คอมไพเลอร์จะกำหนดตัวแปรให้กับแอดเดรสในช่องว่าง FLASH เนื่องจากแม้ว่าจะกำหนดให้กับที่อยู่ RAM แต่ก็ยังต้องใช้หน่วยความจำ FLASH เพื่อเก็บค่าเริ่มต้น ของตัวแปรทำให้ที่อยู่ RAM เสียพื้นที่เนื่องจากการดำเนินการทั้งหมดเป็นแบบอ่านอย่างเดียว
ด้วยเหตุนี้:
int temp;เป็นตัวแปรที่เก็บไว้ใน RAM เริ่มต้นเป็น 0 เมื่อเริ่มต้น (cstart) อาจใช้ค่าแคช
const int temp;เป็นตัวแปรที่เก็บไว้ใน FLASH (อ่านอย่างเดียว) เริ่มต้นเป็น 0 ณ เวลาคอมไพเลอร์อาจใช้ค่าแคช
volatile int temp; เป็นตัวแปรที่เก็บไว้ใน RAM เริ่มต้นเป็น 0 เมื่อเริ่มต้น (cstart) ค่าที่แคชจะไม่ถูกใช้
const volatile int temp; เป็นตัวแปรที่เก็บไว้ใน FLASH (อ่านอย่างเดียว) เริ่มต้นเป็น 0 ณ เวลาคอมไพเลอร์ค่าแคชจะไม่ถูกใช้
นี่คือส่วนที่เป็นประโยชน์:
ปัจจุบันโปรเซสเซอร์แบบฝังตัวส่วนใหญ่มีความสามารถในการเปลี่ยนแปลงหน่วยความจำแบบไม่ลบเลือนแบบอ่านอย่างเดียวโดยใช้โมดูลฟังก์ชันพิเศษซึ่งในกรณีนี้const int tempสามารถเปลี่ยนได้ที่รันไทม์ แต่ไม่ควรเปลี่ยนโดยตรง กล่าวอีกนัยหนึ่งฟังก์ชันอาจแก้ไขค่าตามที่อยู่ที่tempจัดเก็บ
ตัวอย่างที่ใช้ได้จริงจะใช้tempสำหรับหมายเลขซีเรียลของอุปกรณ์ ในครั้งแรกที่โปรเซสเซอร์แบบฝังตัวทำงานtempจะเท่ากับ 0 (หรือค่าที่ประกาศ) และฟังก์ชันสามารถใช้ข้อเท็จจริงนี้เพื่อรันการทดสอบระหว่างการผลิตและหากประสบความสำเร็จขอให้กำหนดหมายเลขซีเรียลและแก้ไขค่าtempโดยวิธีการ ของฟังก์ชันพิเศษ โปรเซสเซอร์บางตัวมีช่วงแอดเดรสพิเศษพร้อมหน่วยความจำ OTP (โปรแกรมครั้งเดียว) สำหรับสิ่งนั้น
แต่นี่คือความแตกต่าง:
หากconst int tempเป็น ID ที่ปรับเปลี่ยนได้แทนที่จะเป็นหมายเลขซีเรียลที่ตั้งโปรแกรมได้ครั้งเดียวและไม่ได้ประกาศvolatileไว้อาจมีการใช้ค่าที่แคชไว้จนถึงการบูตครั้งต่อไปซึ่งหมายความว่า ID ใหม่อาจใช้ไม่ได้จนกว่าจะรีบูตครั้งถัดไปหรือแย่กว่านั้นคือบางฟังก์ชัน อาจใช้ค่าใหม่ในขณะที่ค่าอื่นอาจใช้ค่าแคชที่เก่ากว่าจนกว่าจะรีบูต หากconst int tempประกาศ IS voltaileการเปลี่ยนแปลง ID จะมีผลทันที
const volatile int temp;ที่ขอบเขตการบล็อก (เช่นภายใน{ }) ไม่มีประโยชน์ที่นั่น