嵌入式软件工程师面试题_第1页
嵌入式软件工程师面试题_第2页
嵌入式软件工程师面试题_第3页
嵌入式软件工程师面试题_第4页
嵌入式软件工程师面试题_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式软件工程师面试问题预处理器(Preprocessor )1 .在预处理指令#define中声明常量,以指示一年中有多少秒(忽略闰年问题)define seconds _ per _ year (60 * 60 * 24 * 365 u l )我想在这里看几件事:1. #define语法的基本知识(例如,不能以分号结尾,例如,使用括号)2 .由于预处理器知道如何计算常量表达式的值,因此直接写入如何计算年度的秒数而不是计算实际的值,这更加明确并且不昂贵。3 .因为此表达式识别出16位计算机的整数溢出,所以使用长整数符号l来告知编译器该常数是长整数。4 .在公式中使用UL的话,会有很好的开始。 请记住,第一印象很重要。2 .输入两个参数,并编写返回较小参数的“标准”宏MIN。#define MIN(A,B (A=(B (A : ) )测试CC问题集CC开发是为了以下目的而设置的:1 .适用于识别#define宏的基本知识。 由于该方法是促进宏或嵌入代码的生成直到嵌入行运算符变成标准c的一部分为止的唯一方法,所以为了实现嵌入系统需要嵌入代码。2 .三重条件算子的知识。 理解该使用方法很重要,因为编译器能够生成比if-then-else更优化的代码,所以该运营商存在于c语言中的原因是。3 .知道宏中用括号括起参数4 .我也开始利用这个问题讨论宏观副作用。 例如:你写下面的代码时会发生什么Least=MIN(*p,b;3 .预处理器标志#error的目的是什么?如果您不知道答案,请参见参考文献1。 这个问题有助于区分普通男人和书呆子。 只有书呆子才会读c语言教科书的附录找到这样的东西问题的答案。 当然,如果没有找书呆子,考生希望自己不知道答案。死循环(Infinite loops )4 .嵌入式系统经常使用无限循环。 你是怎么在c做死循环的?这个问题使用几个解决办法。 我推荐的方案是:while(1 一些程序员喜欢下列程序:for (; 这个实现方式让我很为难。 因为这个语法没有正确的表现出正在发生的事情。 如果申请人提出这个建议,我会探索他们所做的一切作为机会基本原理。 他们的基本回答是:的话,“虽然被教了,但是没想到为什么”。 这个会给我留下不好的印象。第三个方案是gotoLoop:goto Loop;报名者提出了上述建议,这表明他是汇编语言程序员(这可能很好,也可能是想进入新领域的BASIC/FORTRAN程序员)。数据声明(Data declarations )5 .用变量a给出以下定义a整数(An integer int a;指向b整数的指针(A pointer to an integer b int *a;指向c指针的指针。 指针指向整数(pointertoapointertoanintegrercint * * a;具有d10个整数的阵列(An array of 10 integersd int a10;指向e整数的十个指针数组(anarrayof 10 pointerstotintegrers )e int *a10; /anarrayof 10 pointerstotintegrers指向f10个整数阵列的指针(pointertoannaarrayof 10 integersfsint (* a 10 ;)指向g函数的指针。 带有整数参数并返回整数(apportiontoafincentthattacksanintegeranarrandreturnsaninteger (* a (int;具有h10个指针的数组,指向具有整数参数并返回整数的函数(anarryoftentpointerstofffincentsthataingannintegerargumentandreturnaninteger )int (*a10(int;人们经常主张这里有几个问题,但是翻书是可以回答的问题,我同意。 我写这篇文章的时候,为了确认语法的正确性,确实查了书。但是接受面试的时候,我希望被问到这个问题(或者接近的问题)。 因为面试时我确信我知道这个问题的答案。 如果考生不知道所有答案(或至少大部分答案都没有准备好这次面试。 如果面试者没有做好这次面试的准备,他为什么会做好准备呢静态公司6 .关键字静态的作用是什么?很少人能完全回答这个简单的问题。 在c语言中,关键字静态有三个重要角色:1 .在函数主体中声明为静态的变量在调用函数时保留其值。2 .在模块中(但是,在函数之外,声明为静态的变量可访问模块中使用的函数,但不能访问模块之外的其他函数)。 这是局部全局变量。3 .在模块中声明为静态的函数只能由该模块中的其他函数调用。 换句话说,此函数限制在声明的模块的本地范围内使用。很多实验对象正确解答了第一部分,一部分正确解答了第二部分,同样知道第三部分的人很少。 这是考生严重的缺点,因为他们不了解本地化数据和代码范围的好处和重要性。Const7 .关键词const是什么意思?面试者对我说:“const意味着常数”,就知道我和业馀爱好者交往了。 去年Dan Saks在他的文章中完全概括了const的所有用法,ESP (译者: embeddedsystemsprogramming )的读者应该很清楚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可以自然保护不希望更改的参数,以防止编译器被意外的代码更改。 简而言之,可以减少错误的发生。Volatile8 .关键字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 )装模作样return *ptr * *ptr;以下称为下面是答案:1 .好的。 一个实例是只读状态寄存器。 我叫volatile。 因为它可能会出乎意料地改变。 我是const。 因为程序不应该尝试修改。2 .好的。 这个不怎么好。 例如,中服务子程序修改了指向buffer的指针。3 .这个代码有恶作剧。 此代码的目的是指针*ptr指向值的平方,但由于*ptr指向volatile参数,编译器将生成如下代码:int square(volatile int *ptr )装模作样int a,b;a=*ptr;b=*ptr;return a * b;以下称为*由于ptr的值可能意外更改,因此a和b可能不同。 因此,此代码可能不是预期的平方值。正确的代码是:长方形(volatile int * ptr )装模作样int a;a=*ptr;return a * a;以下称为位操作(Bit manipulation )9 .嵌入式系统要求用户始终对变量和寄存器进行比特操作。 指定整数变量a,写入两个代码,首先设定a的bit 3,然后清除a的bit 3。 在上述两个操作中,不要更改其他位。这个问题有三个基本反应1 .我不知道如何动手。 这个被实验者没有做过嵌入式系统的工作。使用bit fields。 Bit fields是投入到c语言死角的东西,保证你的代码不能在不同的编译器之间移植,同时保证你的代码不能再利用。 最近遗憾的是看了Infineon写在复杂的通信芯片上的驱动程序,被bit fields使用了,对我完全没有用。 因为我的编译器用其他的方法实现了bit fields。 在道德上,不能将未嵌入的男人粘在实际的硬件边缘。3 .通过3.#definees和bit masks进行操作。 这是一种移植性很高的方法,是应用的方法。 最佳解决方案是:定义位3 (0x 13 )静态inta;void set_bit3(void )装模作样a |=BIT3;以下称为voipper_bit3(void )装模作样a=BIT3;以下称为有些人喜欢定义遮罩或定义常量来设置值或清除值,这也是可以接受的。 我想看一些点:说明常数、|=和=操作。访问固定内存位置(accessingfixedmemorylocationsccdevelopment )10 .嵌入式系统常常具有要求程序员访问特定存储器位的特征。 在某个项目中,绝对地址为0x67a9的整数变量的值需要设为0xaa66。 编译器是纯ANSI编译器。 写代码完成这项任务。该问题测试是否知道为了访问绝对地址而强制转换整数数。 这个问题的实现方法因个人风格而异。 典型的类似代码是:int *ptr;ptr=(int *0x67a9;*ptr=0xaa55;倒霉的方法之一是:*(int * const(0x67a9=0xaa55;即使你的品味接近第二计划,在面试时也建议使用第一计划。中断(Interrupts )11 .中断是嵌入式系统的重要组成部分,它向许多编译开发者提供扩展,使得标准c支持中断。 代表性的事实是生成了新的关键词_interrupt。 下面的代码使用_interrupt关键字定义中断服务子例程(ISR,请注释此代码)。_ _ _ interruptdoublecompute _ area (双radius )装模作样双区域=pi * radius * radius;printf( Area=%f ,area;return area;以下称为这个函数有太多的错误,不知道和:是从哪里说的1. ISR不能返回值。 如果你不知道这个,就不会被雇佣了。2. ISR不能传递参数。 如果没有看到这一点,被雇佣的机会就和第一项一样。3 .许多处理器/编译器通常不能重新输入浮点数。 有些处理器/编译器需要将金额

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论