今天面试了一家公司,主要做嵌入式开发,之前不知道,去了才知道,说说笔试题,记录下以前没有学习到的东西。

1、volatile关键字,这个真没用过,百度结果就是这个关键字修饰的变量不会存入缓存,而是一直放在内存中,以方便其他程序的修改,博客园里面有位叫中土的哥们对此作了比较详细的解释,学习了,在此,抄录一部分:

  一个参数既可以是const还可以是volatile。

  一个指针可以是volatil。

 

2、setjmp,和longjmp,这两个函数也没见过,一直做上层,学习路程略短,今天涨姿势了。

  这两个函数的作用类似于goto的功能,不同的是他们可以跨函数调用,从百度抄一段过来留作学习:

  1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。
  2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的    话)。(记住,setjmp()不能在这种情况时返回0。)
 
  通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。你可以用longjmp()来终止异常,用  setjmp()标记相应的异常处理程序。
 
  #include <setjmp.h>
  #include <stdio.h>
  jmp_buf j;
  void raise_exception(void)
  {
    printf("exception raised\n");
    longjmp(j, 1);           // jump to exception handler 
    printf("this line should never appear\n");
  }
  int main(void)
  {
    if(setjmp(j) == 0)
  {
    printf("\''setjmp\'' is initializing \''j\''\n");
    raise_exception();
    printf("this line should never appear\n");
  }
  else
  {
    printf("''setjmp'' was just jumped into\n");
    //this code is the exception handler 
  }
  return 0;
}
运行结果:
  ''setjmp'' is initializing ''j''
  exception raised
  ''setjmp'' was just jumped into
 
3、关于中断的上下部分:
  由于同一时刻里面,cpu只能处理一个中断,那么在同一时间里面,如果有多个中断过来,就必须先存进中断队列里面,这个过程就是中断的上半部分。
  当cpu执行完当前中断请求之后,从队列里面取出一个中断请求进行处理,这个就是中断的下半部分。
  
  上下部分的划分可以按照中断的优先级进行划分,一个中断的优先级高,那么可以将其放在上半部分执行,优先级低的,可以放在下半部分推迟执行。我是这么理解的。