嵌入式编程
来源:互联网 发布: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.总结
- 嵌入式编程
- 嵌入式socket编程
- 嵌入式socket编程
- 嵌入式linux多线程编程
- 嵌入式C编程要点
- 嵌入式编程书推荐
- 嵌入式编程笔记
- 嵌入式Linux Web 编程
- 嵌入式编程知识
- 嵌入式linux串口编程
- 嵌入式cgi编程
- 嵌入式系统高效编程
- 嵌入式C编程基础
- 嵌入式编程 经验
- 嵌入式编程中的基本概念
- 嵌入式Linux网络编程
- 嵌入式C编程小结
- 嵌入式Linux网络编程
- cookie和session
- spring 拦截器无法拦截类内部的方法调用
- 第一次作业
- linux下 nexus搭建maven私有库 自动打包
- 类Person和对象
- 嵌入式编程
- 图片的倾斜,点击按钮和鼠标移动到图片上
- JMS基本概念
- CentOS6.5下RabbitMQ安装3 mq使用原理和使用原因
- linux c 一站式学习 标识符
- jquery $(document).ready()与window.onload的区别
- redis持久化的方式 数据备份
- Java 高阶 —— native 关键字与 JNI
- sqoop2安装