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

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

实例:

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

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

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

深入:

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

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

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

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

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

  1. int square(volatile int *ptr)
  2. {
  3. return *ptr**ptr;
  4. }

这个代码是用来返回指针所指内容的平方。但是由于指针是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. void set_bit3(void)
  4. {
  5. a |= BIT3;
  6. }
  7. void clear_bit3(void)
  8. {
  9. a &=~ BIT3(); //a = a & (~BIT3());
  10. }