8.关键字volatile含义,并给出三个不同的例子。
一个定义为volatile的变量是说这个变量可能会被意想不到的改变。因此,优化器在每次用到这个变量时都要重新读取这个值,而不是使用在寄存器里的备份。
实例:
1.并行设备的硬件寄存器,如状态寄存器;
2.一个ISR中会访问到的非自动变量;
3.多线程中被几个任务共享的变量;
深入:
1.一个参数可以即是const变量又是volatile变量吗?
可以,如状态寄存器,他是const是因为程序不会主动去改变它,它是volatile是因为它可能被意外地改变;
2.一个指针可以是volatile吗?
可以,虽然这并不常见。例如一个ISR修改一个指向一个buffer的指针时。
3.下面代码有什么错误?
- int square(volatile int *ptr)
- {
- return *ptr**ptr;
- }
这个代码是用来返回指针所指内容的平方。但是由于指针是volatile型,编译器会生成类似如下的代码:
- a = *ptr;
- b = *ptr;
- return a*b;
这样就可以明显地看到错误在哪儿了。即a不一定等于b。正确的写法应该是:
- int a = *ptr;
- return a*a;
9.位操作试题:给定一个整型变量,写两段代码,第一个设置a的bit3,第二段清楚a的bit3。并且在操作过程中不能改变其他位的值。
这道题几乎没难度,就直接写上代码了。[ps:我做的时候关键代码对了,但没原作者这么好的代码风格,看看人家原作者是怎么写的吧!]
- #define BIT3(0x1<<3)
- static int a;
- void set_bit3(void)
- {
- a |= BIT3;
- }
- void clear_bit3(void)
- {
- a &=~ BIT3(); //a = a & (~BIT3());
- }
转载于:https://blog.51cto.com/4893836/1012448