1.volitile关键字的作用
1.表示直接存取原始地址
2.告诉编译器不要进行编译优化
例子的话:
并行设备的硬件寄存器,多线程应用中被几个任务共享的变量,中断子程序中访问到的全局变量。
2.位操作,给定一个整型变量,第一个设置a的bit3,第二个清除a的bit3,保持其他位不变。
int main()
{
int |=(0x01<<3);//第三位置1
int &=~(0x01<<3);//第三位清零
}
3.设置一绝对地址为0x67a9整形变量的值为0xaa66
unsigned int *ptr=(volatile unsigned int *)0x67a9;//第一步定义一个指针指向地址
*ptr=0xaa66 //解引用
这种题还是很常见的。。
4.中断子程序使用的注意
1.ISR是处理器独占,传递参数应该通过中断上下文
2.ISR应该短而有效,而浮点数需要额外的入栈?
这里考到了中断子程序的特点,让我们来复习一下,中断子程序一般分为上半部和底半部
上半部的时间短,主要用来配置启用低半部。而底半部才是用来实现具体的功能业务的。
中断的底半部一般有3种处理模式
1.tasklet(小任务处理)
2.woker 工作队列
3.内核线程 kthread
5.用一句语句实现x是否是2的若干次幂的计算
return(x&(x-1))?false:true //x&x-1为1的时候返回false,为0的时候返回true;
6.写出strcpy函数的实现方式
略
7.写出strcmp函数的实现方式,相等返回0,不相等返回1.
int strcmp(char *dest,char *source)
{
if(NULL==dest||NULL==source)
{
return NULL;
}
while(*dest!='/0'||*source!='/0')
{
if(*dest++!=*source++)
{
return -1;
}
}
return 0;
}
这种题第一 先进行异常判断,第二 有个很坑的地方,就是||前一定不要有自加符号,因为||号如果前面条件成立,就不会对第二个条件进行判断。