嵌入式编程

来源:互联网 发布:mac系统锁定快捷键 编辑:程序博客网 时间:2024/06/05 08:15
嵌入式编程面试题汇总

C语言测试是招聘嵌入式系统程序员必须且有效的方法。

1.位制转换

Q:求下列程序的输出结果

 

A:第一个输出是0.000000  

      第二个输出是 一个大数

 

可参考博文:C语言中int到float的强制类型转换


2.嵌入式编程

Q1:中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供了一种扩展--让标准C支持中断,其代表事实是,产生了一个新的关键字_interrupt.

     请看下面的一个中断服务子程序ISR,指出这段代码的错误

 

A: ①ISR不能返回一个值;

       ②ISR不能传递参数;

       ③在很多编译器/处理器中,浮点数一般都是不可重入的(在ISR中做浮点运算是不明确的);

       ④printf()经常有重入和性能上的问题,所以一般不用printf()。

 

 

Q2:在嵌入式系统中,经常使用的关键字”volatile”是什么意思?有何用途?

A:详见本人的另一篇博文Volatile 在程序设计中的作用

       volatile的语法和const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。

不知什么原因,环境正在改变数据(可能通过多任务处理),所以,volatile告诉编译器不要擅自做出有关数据的任何假定--在优化期间是特别重要的。如果编译器说:“我已经把数据读进寄存器,而且再没有与寄存器接触。”在一般情况下,它不需要再读这个数据。但是,如果数据是被volatile修饰的,编译器则不能做出这样的假设,因为数据可能被其他进程改变了,编译器必须重读这个数据而不是优化这个代码。

     PS:就像建立const对象一样,也可以建立volatile对象,甚至还可以建立const volatile对象(这个对象不能被程序员改变,但可以通过外面的工具改变)。


Q3:关键字volatile有什么含意?并给出3个不同的例子。

 A:一个定义为volatile的变量是说这个变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确的说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

      3个例子:

1) 并行设备的硬件寄存器(如状态寄存器);

2) 一个中断服务子程序中会访问到的非自动变量;

3) 多线程应用中被几个任务共享的变量。


Q4:关键字const有什么含意?下面的声明都是什么意思?

A:前两个的作用是一样的。a 是一个常整数型(不可修改值的整数型)。

       第三个意味这a是一个指向常整数型的指针(整数型是不可修改的,但指针可以修改)。

       第四个的意思是a是一个指向整数型的常指针(指针指向的整数型是可以修改的,但指针是不可修改的)。

       最后一个意味着a是一个指向常整数型的常指针(指针指向的整数型、指针都是不可修改的)。


Q5:一个参数可以既是const又是volatile吗?一个指针可以是volatile吗?

 A:可以。举例-只读的状态寄存器。它是volatile,因为它可能被意想不到地改变;它又是const,因为程序不应该试图去修改它。

   可以。尽管这并不常见,举例-当一个中断服务子程序修改一个指向一个buffer的指针时。


Q6:下面的函数有什么错误?

 

A:这段代码的目的是用来返回指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

 

由于*ptr的值可能被意想不到地改变,因此a和b可能是不同的。结果这段代码可能无法返回期望的平方值。

正确代码如下:

 


Q7:嵌入式系统经常要求程序员去访问某特定位置的内存。如,在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。

A:

 


Q8:下面的代码输出是什么?

 

A:注意malloc(0)的含义

 


Q9:下面代码的输出是什么?

 

A:注意大端模式(MAC的Power系列处理器,对操作数的存放方式是从高字节到低字节)和小端模式(大部分PC,操作数的存放方式从低字节到高字节)

 


3.static

Q1:关键字static的作用是什么?

A:在C语言中,static关键字至少有下列几个作用

      i. 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

      ii. 在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问;

      iii. 在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内;

      iv. 在类中的static成员变量属于整个类所拥有,对类的所有对象都只有一份拷贝;

      v. 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。


Q2:写出下面程序的运行结果。

 

A:注意b是static变量,每次调用sum函数时都会使用上次保存的b值。

 


4.总结

      嵌入式编程平时系统接触得较少,但像const、volatile、static等关键字其实是经常碰到的,趁此机会在这里总结一番(另外浮点数的表示方式很值得一探究竟,类型转换等均与内存的分配有很大的关联···)。
     



原创粉丝点击