关键词不能为空

当前您在: 主页 > 高中公式大全 >

婆娑世界嵌入式工程师经典面试题

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-01-21 03:39
tags:

关于国庆的手抄报-古交一中

2021年1月21日发(作者:钟赤兵)
嵌入式工程师经典面试题

上个星期
,
去深圳一家搞
ARM
开发的公司面试
, HR
叫我做了一份卷子
,
里面都

C
编程
,
心中暗喜
,
因为这些题基本上都在程序员面试宝典里见过。后来回到学

,
在网上搜索
,


来这些题都是嵌入式工程师的经典面试题目
,
很多网站上都可以
找得到。

现把他贴出来
,


上网上的答案
,
跟大家分享
,
因为这些题实在太经典了。

预处理器
(Preprocessor
1 .
用预处理指令
#define
声明一个常数
,
用以表明
1
年中有多少秒
(


略闰年
问题

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL
我在这想看到几件事情
:
1 #define
语法的基本知识
(
例如
:
不能以分号结束
,
括号的使用
,




2
懂得预处理器将为你计算常数表达式的值
,
因此直接写出你如何计

算一年中
有多少秒而不是计算出实际的值
,
是更清晰而没有代价的。
3
意识到这个表达式将
使一个
16
位机的整型数溢出
-
因此要用到长整

型符号
L,
告诉编译器这个常数是的
长整型数。

4
如果你在你的表达式中用到
UL (
表示无符号长整型
,
那么你有了

一个好的起
点。记住
,
第一印象很重要。

2 .
写一个

标准


MIN ,
这个宏输入两个参数并返回较小的一个。
#define
MIN(A,B ((A <= (B ? (A : (B
这个测试是为下面的目的而设的
:
1
标识
#define
在宏中应用的基本知识。这是很重要的。因为在

嵌入

(inline
操作符

变为标准
C
的一部分之前
,
宏是方便产生嵌入代码的唯

一方法
,
于嵌入式系统来说
,
为了能达到要求的性能
,
嵌入代码经常< br>
是必须的方法。

嵌入式工程师经典面试题

2
三重条件操作符的知识。这个操作符存在
C
语言中的原因是它使得

编译器
能产生比
if-then-else
更优的代码
,
了解这个用法是很重要的。

3
懂得在宏中小心地把参数用括号括起来

4
我也用这个问题开始讨论宏的副 作用
,
例如
:
当你写下面的代码时

会发生什么

?
least = MIN(*p++, b;
3.
预处理器标识
#error
的目的是什么
?
如果你不知道答案
,
请看参考文献
1


这问题对区分一个正常的伙

计和一个书
呆子是很有用的。

只有书呆子才会读
C
语言课本的附录去找

出象这种问题的答< br>案。当然如果你不是在找一个书呆子
,
那么应试者最

好希望自己不要知道答案。

死循环
(Infinite loops
4.
嵌入式系统中经常要用到无限循环
,
你怎么样用
C
编写死循环呢
?
这个问题
用几个解决方案。我首选的方案是
:
while(1
{
}
一些程序员更喜欢如下方案
:
for(;;
{
}
嵌入式工程师经典面试题

这个实现方式让我为难
,
因为这个语法没有确切表达到底怎么回

事。

如果一个
应试者给出这个作为方案
,
我将用这个作为一个机会去探

究他们这样做的基本原
理。

如果他们的基本答案是
:
我被教着这样做
,
但从没有想到过为什么。

这会给
我留下一个坏印象。

第三个方案是用
goto
Loop:
...
goto Loop;
应试者如给出上面的方案
,
这说明或者他是一个汇编语言程序员
(
这也

许是好事
或者他是一个想进入新领域的
BASIC/FORTRAN
程序员。

数据声明
(Data declarations
5.
用变量
a
给出下面的定义

a
一个整型数
(An integer
b
一个指向整型数的指针
(A pointer to an integer
c
一个指向指针的的指针
,
它指向的指针是指向一个整型数
(A pointer to a
pointer to an intege r
d
一个有
10
个整型数的数组
(An array of 10 integers
e
一个有
10
个指针的数组
,
该指针是指向一个整型数的。
(An array of 10
pointers to integers
f
一个指向有
10
个整型数数组的指针
(A pointer to an array of 10 integers
嵌入式工程师经典面试题

g
一个指向函数的指针
,
该函数有一个整型参数并返回一个整型数
(A pointer to
a function that takes an integer as an argument and returns an integer
h
一个有
10
个指针的数组
,
该指针指向一个函数
,
该函数有一个整型

参数并返
回一个整型数
(An array of ten pointers to functions that take an integer argument and
return an integer
答案是
:
a int a; // An integer
b int *a; // A pointer to an integer
c int **a; // A pointer to a pointer to an integer
d int a[10]; // An array of 10 integers
e int *a[10]; // An array of 10 pointers to integers
f int (*a[10]; // A pointer to an array of 10 integers
g int (*a(int; // A pointer to a function a that takes an integer argument and returns
an integer
h int (*a[10](int; // An array of 10 pointers to functions that take an
integer argument and return an integer
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题
,
我同意这种
说法。当我写这篇文章时
,
为了确定语法的正确性
,
我的确
查了一下书。但是当我被
面试的时候
,
我期望被问到这个问题
(
或者相

近的问题。因为在被面试的这段时间里
,
我确定我知道这个问题的答

案。应试者如果不知道所有的答案
(
或至少大部分答案
,
那么也就没

有为这次面试做准备
,
如果该面试者没有为这次面试做准备
,
那么他又

能为什么出准备呢
?
嵌入式工程师经典面试题

Static
6.
关键字
static
的作用是什么
?
这个简单的问题很少有人能回答完全。


C
语言中
,
关键字
static
有三个明显
的作用
:
1
在函数体
,
一个被声明为静态的变量在这一函数被调用过程中维持

其值不
变。

2
在模块内
(
但在函数体外
,
一个被声明为静态的变量可以被模块

内所用函数访

,
但不能被模块外其它函数访问。

它是一个本地的全局

变量。

3
在模块内
,
一个被声明为静态的函数只可被这一模块内的其它函数

调用。那
就是
,
这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分
,
一部分能正确回答第二部分
,
同是很少的人能懂得第三部分。这是一个应试者的严重的缺点
,
因为他

显然不
懂得本地化数据和代码范围的好处和重要性。

Const
7.
关键字
const
有什么含意
?
我只要一听到被面试者说
:
意味着常数

我就知道我正在

和一个业余者
打交道。去年
Dan Saks
已经在他的文章里完全概括了
const
的所有用法
,
因此

ESP(
译者
:Embedded Systems Programming
的每一位读者应该非常熟悉
const
能做什
么和不能做什么
.
如果你从没

有读到那篇文章
,
只要能说出
const
意味着

只读


可以了。尽管这个

答案不是完全的答案
,
但我接受它作为一个正确的答案。
(
如果
你想知

道更详细的答案
,
仔细读一下
Saks
的文章吧。

嵌入式工程师经典面试题

如果应试者能正 确回答这个问题
,
我将问他一个附加的问题
:
下面的声明都是什
么意 思
?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
/******/
前两个的作用是一样
, a
是一个常整型数。

第三个意味着
a
是一个

指向常整型
数的指针
(
也就是
,
整型数是不可修改的
,但指针可以。

第四个意思
a
是一个指向整型数的常指针
(
也就是说
,
指针指向的整型

数是可
以修改的
,
但指针是不可修改的。最后一个意味着
a
是一个指

向常整型数的常指针
(
也就是说
,
指针 指向的整型数是不可修改的
,


时指针也是不可修改的。如果应试
者能正确回答这些问题
,
那么他就

给我留下了一个好印象。顺带提一句
,
也许你可能
会问
,
即 使不用关键


const ,
也还是能很容易写出功能正确的程序
,
那么我为什么还
要如

此看重关键字
const

?
我也如下的几下理由
:
1
关键字
const
的作用是为给读你代码的人传达非常有用的信息
,


际上
,
声明
一个参数为常量是为了告诉了用户这个参数的应用目的。如

果你曾花很多时间清
理其它人留下的垃圾
,
你就会很快学会感谢这点多

余的信息。
(
当然
,
懂得用
const

程序员很少会留下的垃圾让别人来

清理的。

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

凑的代码。

嵌入式工程师经典面试题

3
合理地使用关键字
const
可以使编译器很自然地保护那些不希望被

改变的参

,
防 止其被无意的代码修改。简而言之
,
这样可以减少
bug
的出现。

Volatile
8.
关键字
volatile
有什么含意
?
并给出三个不同的例子。

一个定义为
volatile
的变量是说这变量可能会被意想不到地改变
,
这样
,
编译器
就不会去假设这个变量的值了。精确地说就是
,
优化器在

用到这个变量时必须每次都小心地重新读取这个变量的值
,
而不是使用

保存在
寄存器里的备份。下面是
volatile
变量的几个例子
:
1
并行设备的硬件寄存器
(

:
状态寄存器

2
一个中断服务子程序中会访问到的非自动变量
(Non-automatic variables
3
多线程应用中被几个任务共享的变量

回答不出这个问题的人是不会被雇佣的。我认为这是区分
C
程序

员和嵌入式
系统程序员的最基本的问题。

搞嵌入式的家伙们经常同硬件、

中断、
RTOS
等等
打交道
,
所有这些都要求用到
volatile
变量。不懂得
volatile
的内容将会带来灾难。

假设被面试者正确地回答了这是问题
(

,
怀疑是否会是这样
,
我将稍微深究一

,
看一下这家伙是不是直正懂得
volatile
完全的重要

性。

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

?
解释为什么。

2
一个指针可以是
volatile

?
解释为什么。

3
下面的函数有什么错误
:
int square(volatile int *ptr
{

关于国庆的手抄报-古交一中


关于国庆的手抄报-古交一中


关于国庆的手抄报-古交一中


关于国庆的手抄报-古交一中


关于国庆的手抄报-古交一中


关于国庆的手抄报-古交一中


关于国庆的手抄报-古交一中


关于国庆的手抄报-古交一中



本文更新与2021-01-21 03:39,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/542085.html

嵌入式工程师经典面试题的相关文章