嵌入式关键字-面试
1、define--(无参数宏定义)用法
一般形式为:#define 标识符 字符串
1>使用预处理指令#define声明一个常数,表示一年有多少秒(忽略闰年)
#define SENCOND_PER_YEA (365*24*60*60)
注:->习惯上宏定义标识符使用大写表示;
2、define(带参数宏定义)用法
一般形式为:#define 宏名(形参) 字符串
1>写一个”标准“的宏MIN,并且输入两个参数返回一个较小的;
#define MIN( (a),(b) ) ( (a) <= (b) ? (a) : (b) )
注:带参数的宏定义中,将参数用括号括起来,可以省去很多不必要的麻烦;
3、嵌入式系统中经常需要用到死循环,怎样编写;(参考实时操作系统中线程)
while(1)
{
;//做相应的处理操作
}
4、static 的作用:
->在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变;
看一下局部静态变量的详细特性,注意它的作用域。
1)内存中的位置:静态存储区
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没 有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
->在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
全局变量的详细特性,注意作用域,可以和局部静态变量相比较:
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。-
>在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
5、volatile :易变的
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
1 代码一: 2 int a,b,c; 3 //读取I/O空间0x100端口的内容 4 a= inword(0x100); 5 b=a; 6 a=inword(0x100) 7 c=a; 8 代码二: 9 volatile int a; 10 int a,b,c; 11 //读取I/O空间0x100端口的内容 12 a= inword(0x100); 13 b=a; 14 a=inword(0x100) 15 c=a; 16 在上述例子中,代码一会被绝大多数编译器优化为如下代码: 17 a=inword(0x100) 18 b=a; 19 c=a;
从上面来看,volatile关键字是会降低编译器优化力度的,但它保证了程序的正确性,所以在适合的地方使用关键字volatile是件考验编程功底的事情
6、嵌入式系统中对变量或者寄存器进行位操作。
给定一个整形变量a,写两段代码,第一段设置a的bit3,第二段清除a的bit3;
1 #define BIT3 (0x01 << 3) 2 3 static int a; 4 5 void SetBIT3(void) 6 { 7 a=a | BIT3; //a |= BIT3; 8 } 9 10 void ClearBIT3(void) 11 { 12 a=a & ~BIT3;//a &= ~BIT3; 13 }
7、访问特定的内存位置。
决定地址为0x67a9的整形变量值为0x66ff;
1 int *ptr; 2 ptr = (int *)0x67a9; 3 *ptr = 0x66ff;