8.关键字volatile含义,并给出三个不同的例子。

一个定义为volatile的变量是说这个变量可能会被意想不到的改变。因此,优化器在每次用到这个变量时都要重新读取这个值,而不是使用在寄存器里的备份。

实例:

1.并行设备的硬件寄存器,如状态寄存器;

2.一个ISR中会访问到的非自动变量;

3.多线程中被几个任务共享的变量;

深入:

1.一个参数可以即是const变量又是volatile变量吗?

        可以,如状态寄存器,他是const是因为程序不会主动去改变它,它是volatile是因为它可能被意外地改变;

2.一个指针可以是volatile吗?

        可以,虽然这并不常见。例如一个ISR修改一个指向一个buffer的指针时。

3.下面代码有什么错误?

  1. int square(volatile int *ptr) 
  2.  return *ptr**ptr;

这个代码是用来返回指针所指内容的平方。但是由于指针是volatile型,编译器会生成类似如下的代码:

 

  1. a = *ptr; 
  2. b = *ptr; 
  3. return a*b; 

这样就可以明显地看到错误在哪儿了。即a不一定等于b。正确的写法应该是:

  1. int a = *ptr; 
  2. return a*a; 

9.位操作试题:给定一个整型变量,写两段代码,第一个设置a的bit3,第二段清楚a的bit3。并且在操作过程中不能改变其他位的值。

这道题几乎没难度,就直接写上代码了。[ps:我做的时候关键代码对了,但没原作者这么好的代码风格,看看人家原作者是怎么写的吧!]


  1.     #define BIT3(0x1<<3)  
  2.     static int a;  
  3.       
  4.     void set_bit3(void)  
  5.     {  
  6.     a |= BIT3; 
  7.     }  
  8.  
  9. void clear_bit3(void
  10. a &=~ BIT3(); //a = a & (~BIT3());