嵌入式面试试题附答案
2016年嵌入式面试试题(附答案)
嵌入式系统中,动态分配内存可能发生的问题是什么
尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆 (heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内 存可能发生的问题是什么?
这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的 持行时间等等。这个主题己经在ESP杂志中被广泛地讨论过了(主要 是P. J. Plauger,他的解释远远超过我这里能提到的任何解释),所 有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后, 我拿出这么一个小节目:下面的代码片段的输出是什么,为什么?
char*ptr;
辻((ptr=(char*)malloc(0))==NULL)
puts ( 4<Gotanullpoi nt er” );
else
puts ( uGotavalidpointer n ;
这是一个有趣的问题。最近在我的一个同事不经意把0值传给了 函数malloc,得到了一个合法的指针之后,我才想到这个问题。这 就是上面的代码,该代码的输出是"Gotavalidpointer"。我用这 个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做 是正确。得到正确的答案固然重要,但解决问题的方法和你做决定 的基本原理更重要些。
关键字volatile有什么含意并给出三个不同的例子
一个定义为volatile的'变量是说这变量可能会被意想不到地改 变,这样,编译器就不会去假设这个变量的值了。精确地说就是, 优化器在用到这个变量时必须每次都小心地重新读取这个变量的值, 而不是使用保存在寄存器里的备份。下面是volatile变量的几个例 子:
1).并行设备的硬件寄存器(如:状态寄存器)
2). —个中断服务子程序中会访问到的非自动变量(Nonautomat icvariables)
3).多线程应用中被几个任务共享的变量
嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环 呢?
这个问题用几个解决方案。我首选的方案是:
while(1) {}
一些程序员更喜欢如下方案:
for(;;){}
嵌入式多线程编程这个实现方式让我为难,因为这个语法没有确切表达到底怎么回 事。如果一个应试者给出这个作为方案,我将用这个作为一个机会 去探究他们这样做的基木原理。如果他们的基本答案是:“我被教 着这样做,但从没有想到过为什么。”这会给我留下一个坏卬象。
第三个方案是用goto
Loop:
gotoLoop;
应试者如给出上而的方案,这说明或者他是一个汇编语言程序员 (这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAX程序 员。
嵌入式系统中关于中断的问题
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商 提供一种扩展一让标准C支持中断。具代表事实是,产生了一个新 的关键字_interrupto下面的代码就使用了—interrupt关键字去 定义了一个中断服务子程序(ISR),请评论一下这段代码的。
_interruptdoublecompute_area(doubletadius)
{doublearea^PI^radius^radius;
printf(” Area=%f n ,area);
returnarea;
}
这个函数有太多的错误了,以至让人不知从何说起了:
1).ISR不能返回一个值。如果你不懂这个,那么你不会被雇用 的。
2).ISR不能传递参数。如果你没有看到这一点,你被雇用的机 会等同第一项。
3).在许多的处理器/编译器中,浮点一般都是不可重入的。有些 处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是 不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在 ISR中做浮点运算是不明智的。
4).与第三点一脉相承,printf ()经常有重入和性能上的问题。 如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你 能得到后两点,那么你的被雇用前景越来越光明了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。