嵌入式关键字-面试

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;

 

posted on 2016-01-05 15:43  追风*逐浪  阅读(243)  评论(0)    收藏  举报

导航