嵌入式软件常见笔试面试题总结

时间:2022-07-18 14:41:47

1。中断与异常区别:

异常:在产生时必须考虑与处理器的时钟同步,实际上异常也称为同步中断。在处理器执行到由于编程失误而导致的错误指令时,或者在执行期间出现特殊情况(如缺页),必须靠内核处理的时候,处理器就会产生一个异常。

所谓中断就是外部硬件产生的一个电信号,从CPU的中断引脚进入,打断当前CPU的运行

所谓异常就是软件运行中发生了一些必须作出处理的事件,CPU自动产生一个陷入来打断当前运行,转入异常处理流程。

 

2。进程与线程的区别:

a:调度:线程作为调度与分配的基本单位,进程作为拥有资源的基本单位

b:并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

c:拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源

d:系统开销:在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销

 

3。volatile关键字有什么含义

volatile说明这个变量可能会被意想不到的改变,这样在使用之前都要去内存里重新读取它的值,并告诉编译器不要随意对变量做优化

用到场合:并行设备的硬件寄存器(如状态寄存器),一个中断服务子程序会访问到的非自动变量,多线程应用中被几个任务共享的变量

 

4。static作用

a:在函数体中,一个被声明为静态的变量在这一函数被调用过程中维持其值不变

b:在模块内(但在函数体外),一个被声明为静态变量的变量,可以被这个模块内的所有函数使用,但不能被模块外的函数使用,它是一个本地的全局变量,

c:在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,那就是这个函数被限制在声明它模块的本地范围内使用

后注问题:static全局变量与普通的全局变量有何不同?static局部变量和普通局部变量有何区别?static函数与普通函数有什么区别?

答:static全局变量只初始化一次,防止在其它文件单元中被引用;static局部变量只被初始化一次,下一次依据上一次结果值;static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

 

5。关键字const是什么含义?

答案一:

a:它可以定义const常量

b:const可以修饰函数的参数,返回值,甚至是函数的定义体,被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

答案二:

const意味着只读

 

如:int const *p  指向常整型的指针;

int *const p 指向整型的常指针

int *const *p 指向常整型的常指针  或者等同于const int * const p

 

a:关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多于的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的)

b:通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码

c:合理地使用关键字const可以使编译器很自然的保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

 

6:对变量或寄存器进行位操作,给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。在以上两个操作中,要保持其他位不变。

代码如下:

#define BIT3 (0x1<<3)

static int a;

void set_bit3(void)

{

a|=BIT3;

}

void clear_bit3(void)

{

a&=~BIT3;

}

 

7:用C语言实现大小端的测试

void checkcpu()

{

union{

int a;

char b;

}c;

c.a=1;

if(c.b==1)

printf("xiaoduan");

else

printf("daduan");

}

 

8:引用与指针有什么区别?

a:引用必须初始化,指针不必

b:引用初始化不能改变,指针可以被改变

c:不存在指向空值的引用,但存在指向空值的指针

 

注:用const限定引用的目的是:用这种形式的引用不能通过引用对目标变量的值进行修改

形式为const 类型标识符 &引用名=目标变量名

eg:Example(const Example &x)

 

引用的主要目的:当参数传递的数据量较大时,用引用比用一般变量传递参数的效率和空间占有率较好

 

9:写出float,int ,bool类型与零的比较,假设变量为x

float:if(x>0.000001&&x<-0.000001)

int :if(x==0)

bool: if(x==false)

 

10:OSI七层网络协议,TCP/IP协议

OSI:物理层-数据链路层-网络层-传输层-会话层-表示层-应用层

TCP/IP:网络接口层-互连网络层-传输层-应用层

 

11:对于一个频繁使用的短小函数,在C语言与C++中分别用什么实现?

C中用宏定义,C++用inline

注:inline作用:当在程序中调用一个内联函数时,是将该函数的代码直接插入到调用点,然后执行该段代码,所以在调用过程中不存在程序的跳转与返回问题,而对于普通函数的调用,程序是从主调函数点转去执行被调函数,待被调函数执行完毕后,再返回到主调函数的调用点的下一语句继续执行。从调用机理看,内联函数可以加快程序代码的执行速度和效率,减少调用开销。但这是以增加程序代码为代价来求得速度的。

 

12:堆与栈的区别

Heap是堆,Stack是栈;

Stack的空间由操作系统自动分配/释放,Heap上的空间是手动分配/释放;

C中的malloc函数分配的内存空间在堆上,C++对应的是new操作符;

程序在编译期间对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行;

 

13:用宏定义写出swap(x,y);用define声明一个常数,用以表明1年中有多少秒;写出宏MIN,这个宏输入两个参数并返回较小的一个

#define swap(x,y)/

x=x+y;/

y=x-y;/

x=x-y;

 

#define SECOND_PER_YEAR (60*60*24*365)UL

 

#define MIN(A,B) (A<B)?A:B