以下是回答所提供的例子:
unsigned int const volatile *status_reg; // assume these are assigned to point to the
unsigned char const volatile *recv_reg; // correct hardware addresses
#define UART_CHAR_READY 0x00000001
int get_next_char()
{
while ((*status_reg & UART_CHAR_READY) == 0) {
// do nothing but spin
}
return *recv_reg;
}
因為不希望這支程式改動到 status_reg 跟 recv_reg 指到的值,所以把他們設定為 const。
但並不表示其他程序不會動到 status_reg 跟 recv_reg 所指到的值,以這個例子來說就是硬體會改變那兩個記憶體位置的值。
如果 compiler 在這支程式做最佳化的話,那 while 迴圈可能就只會讀取 status_reg 一次,那就有可能面臨到無窮迴圈跳不出來的問題,所以只好把他們設定為 volatile,叫 compiler 不要偷懶,每次乖乖的去取值。
https://read01.com/oONo5Q.html 提到的一些觀念釐清:
- const: 含意是「請做為常數使用,這個值只能讀不能寫」,而並非「這個值只是個常數而他不會變」
- volatile: 含意是「請不要做最佳化,因為這個值可能會變」,而並非「你可以修改這個值」
所以其實 const 跟 volatile 是不矛盾的。
勉強になった。
沒有留言:
張貼留言