原因:

  由于编译器会自动将变量从内存拷贝到寄存器里面,编译器优化就是让cpu读取数据时从寄存器里面读取数据,内存变量改变了,但是寄存器的变量还是以前的。

① 编译器很聪明,会帮我们做些优化,比如:

int a;
a = 0; // 这句话可以优化掉,不影响 a 的结果
a = 1; 

② 有时候编译器会自作聪明,比如:

int *p = ioremap(xxxx, 4); // GPIO 寄存器的地址
*p = 0; // 点灯,但是这句话被优化掉了
*p = 1; // 灭灯 

③ 对于上面的情况,为了避免编译器自动优化,需要加上 volatile,告诉它“这是容易出错的,别乱优化”:

volatile int *p = ioremap(xxxx, 4); // GPIO 寄存器的地址
*p = 0; // 点灯,这句话不会被优化掉
*p = 1; // 灭灯

 

 
posted on 2021-04-22 11:30  ღ惟吾德馨ღ  阅读(57)  评论(0)    收藏  举报