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;
ที่ขอบเขตการบล็อก (เช่นภายใน{ }
) ไม่มีประโยชน์ที่นั่น