16道嵌入式C语言面试题--genius
嵌入式面试题大全
嵌入式面试题大全在嵌入式领域,面试题是评估应聘者技能和经验的重要方式。
嵌入式系统工程师需要掌握的知识面广泛,包括硬件和软件方面的技能。
下面列举了一些常见的嵌入式面试题,希望对准备面试的应聘者有所帮助。
1. 什么是嵌入式系统?嵌入式系统和普通计算机有什么区别?嵌入式系统是集成了硬件和软件的特定用途的计算机系统,通常被嵌入到其他设备中,用于控制设备的运行。
与普通计算机相比,嵌入式系统通常具有小巧、低功耗、实时性要求高等特点。
2. 什么是RTOS?RTOS和一般操作系统有何区别?RTOS(Real-Time Operating System)是一种专门设计用于实时系统的操作系统。
与一般操作系统相比,RTOS具有更高的实时性能、更低的延迟和更小的内存占用。
3. 请解释一下中断的概念,并说明中断处理的流程。
中断是一种用于处理外部事件的机制,可以在程序执行的任何时候打断当前的执行流程。
当系统发生中断时,会保存当前的上下文状态,跳转到中断处理程序中执行相应的操作,处理完中断后再返回到中断发生的地方继续执行。
4. 什么是嵌入式系统的裸机编程?请举例说明。
裸机编程是指在嵌入式系统中直接操作硬件,不依赖操作系统的编程方式。
例如,在裸机编程中,可以直接对寄存器进行操作来控制设备的运行。
5. 什么是嵌入式系统的外设?请举例说明。
外设是指嵌入式系统中与主处理器相连的其他设备,如串口、定时器、ADC 等。
外设可以扩展系统的功能,实现与外部设备的通信和控制。
6. 请解释一下嵌入式系统中的通信总线的概念,并说明常见的通信总线类型。
通信总线是连接嵌入式系统中各个设备的传输介质,用于实现设备之间的数据传输和通信。
常见的通信总线类型包括I2C总线、SPI总线、CAN总线等。
7. 请解释一下嵌入式系统中的嵌入式存储器的概念,并说明常见的嵌入式存储器类型。
嵌入式存储器是嵌入式系统中用于存储程序和数据的存储设备,通常包括闪存、EEPROM、RAM等。
2022年度嵌入式C语言面试题库(含答案)
2022年度嵌入式C语言面试题库(含答案)1、什么是嵌入式C?/ 你对嵌入式C 语言的理解是什么?嵌入式 C 是 C 标准委员会指定的 C 编程语言的一组语言扩展。
它通常用于解决不同嵌入式系统的 C 扩展之间存在的共性问题。
嵌入式 C 编程通常需要对 C 语言进行非标准扩展,以支持增强的微处理器功能,例如定点算术、多个不同的内存库和基本I/O 操作。
2、你对嵌入式系统的理解是什么?嵌入式系统是一种基于微处理器的计算机硬件系统和软件,旨在执行特定的功能。
嵌入式系统要么是一个独立的系统,要么是一个大型系统的一部分。
3、C语言和嵌入式C之间的主要区别是什么?C语言是一种通用的高级编程语言,用于设计任何基于桌面的应用程序。
另一方面,嵌入式C 是 C 语言的扩展,用于开发基于微控制器的应用程序。
在这里,嵌入式是指主机或微控制器,而不是编程语言。
让我们在下表中来看看C语言和嵌入式C 之间的主要区别。
C语言和嵌入式C 的区别:C语言嵌入式C C编程语言是一种通用编程语言,用于设计任何基于桌面的应用程序。
嵌入式C 只是一种扩展C 编程语言,它用于开发基于微控制器的应用程序。
C编程语言是一种高级编程语言。
嵌入式4、嵌入式C 是一种编程语言吗?嵌入式C 不是核心编程语言。
它是 C 编程语言的扩展,用于开发基于微控制器的应用程序。
嵌入式 C 语言从普通 C 编程语言引入的扩展是I/O 硬件寻址、定点算术运算、访问地址空间等。
5、嵌入式C 的主要优点是什么?嵌入式C 是 C 编程语言的扩展。
让我们看看嵌入式 C 的主要优势:嵌入式 C 的主要优势:嵌入式C的编码速度快,简单易懂。
它不需要任何硬件更改,例如额外的内存或存储空间,因为它始终执行相同的任务。
它专注于其特定任务,一次只执行一项任务。
它主要用于现代自动化应用。
嵌入式应用程序非常适合工业用途。
6、嵌入式C 的主要缺点是什么?嵌入式C 的缺点:嵌入式C 一次只执行一项任务,因此当我们必须同时执行多项任务时,它不是首选。
嵌入式面试题目及答案
嵌入式面试题目及答案嵌入式系统是当今科技领域中不可或缺的一部分,它在我们日常生活和工业生产中起到了重要的作用。
而嵌入式系统的开发与设计需要专业的技术和知识,因此在面试过程中,相应的题目是必不可少的。
本文将为您提供一些常见的嵌入式面试题目并给出相应的答案,以供参考。
1. 请简要解释什么是嵌入式系统?嵌入式系统(Embedded System)是一种特定功能电子设备中的计算机系统,它嵌入到其他产品中,以执行特定的任务或控制特定的功能。
嵌入式系统的关键特点包括实时性、低功耗、体积小、成本低以及对于硬件和软件的高度整合。
2. 嵌入式系统与通用计算机有何区别?嵌入式系统与通用计算机之间存在以下区别:- 功能:嵌入式系统的设计旨在执行特定任务,如控制、数据采集、嵌入式通信等,而通用计算机则具备更多的通用性,能够执行各种不同的任务。
- 硬件:嵌入式系统通常使用嵌入式处理器,集成了所需的硬件接口和外设,以适应特定的功能要求,而通用计算机则侧重于提供更高的计算和存储能力。
- 实时性:嵌入式系统通常需要满足实时性需求,能够及时响应输入和输出,而通用计算机则更关注处理复杂的用户交互和计算任务。
3. 请列举一些常见的嵌入式操作系统。
常见的嵌入式操作系统包括:- 实时操作系统(RTOS):如FreeRTOS、VxWorks、QNX等,具有实时性、可靠性和可嵌入性等特点。
- Linux嵌入式系统:如Linux内核、Debian、Buildroot等,提供了完整的开发环境和强大的功能。
- 嵌入式Windows系统:如Windows CE、Windows Embedded等,提供了Windows桌面操作系统的子集。
4. 请简要介绍一下嵌入式系统的调试方法。
常用的嵌入式系统调试方法包括:- 打印调试:通过在代码中插入打印语句,输出调试信息,用于查看程序流程以及变量的值。
- 软件仿真调试:使用仿真器或调试器连接到目标硬件上,在宿主机上进行调试操作,方便观察和跟踪代码的执行。
16道嵌入式C语言面试题
16道嵌入式C语言面试题1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4). 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。
记住,第一印象很重要。
2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) (A) : (B))这个测试是为下面的目的而设的:1). 标识#define在宏中应用的基本知识。
这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2). 三重条件操作符的知识。
这个操作符存在C语言中的原因是它使得编译器能产生比if- then-else更优化的代码,了解这个用法是很重要的。
3). 懂得在宏中小心地把参数用括号括起来4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。
这问题对区分一个正常的伙计和一个书呆子是很有用的。
只有书呆子才会读C语言课本的附录去找出象这种问题的答案。
当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
死循环(Infinite loops)4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。
考查嵌入式C开发人员的最好的16道题
考查嵌入式C开发人员的最好的16道题约定:1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了2)数据类型char 一个字节 1 byteint 两个字节 2 byte (16位系统,认为整型是2个字节)long int 四个字节 4 bytefloat 四个字节4 byetdouble 八个字节 8 bytelong double 十个字节 10 bytepointer 两个字节 2 byte(注意,16位系统,地址总线只有16位)第1题: 考查对volatile关键字的认识#include<setjmp.h>static jmp_buf buf;main(){volatile int b;b =3;if(setjmp(buf)!=0){printf("%d ", b);exit(0);}b=5;longjmp(buf , 1);}请问,这段程序的输出是(a) 3(b) 5(c) 0(d) 以上均不是第1题: (b)volatile字面意思是易于挥发的。
这个关键字来描述一个变量时,意味着给该变量赋值(写入)之后,马上再读取,写入的值与读取的值可能不一样,所以说它"容易挥发"的。
这是因为这个变量可能一个寄存器,直接与外部设备相连,你写入之后,该寄存器也有可能被外部设备的写操作所改变;或者,该变量被一个中断程序,或另一个进程改变了.volatile variable isn't affected by the optimization. Its value after the longjump is the last value variable assumed.b last value is 5 hence 5 is printed.setjmp : Sets up for nonlocal goto /* setjmp.h*/Stores context information such as register values so that the lomgjmp function can return control to the statement following the one calling setjmp.Returns 0 when it is initially called.Lonjjmp: longjmp Performs nonlocal goto /* setjmp.h*/Transfers control to the statement where the call to setjmp (which initialized buf) was made. Execution continues at this point as if longjmp cannot return the value 0.A nonvolatile automatic variable might be changed by a call tolongjmp.When you use setjmp and longjmp, the only automatic variables guaranteed to remain valid are those declared volatile.Note: Test program without volatile qualifier (result may very)第2题:考查类型转换main(){struct node{int a;int b;int c;};struct node s= { 3, 5,6 };struct node *pt = &s;printf("%d" , *(int*)pt);}这段程序的输出是:(a) 3(b) 5(c) 6(d) 7第2题: (a)The members of structures have address in increasing order of their declaration. If a pointer to a structure is cast to the type of a pointer to its first member, the result refers to the first member.第3题:考查递归调用int foo ( int x , int n){int val;val =1;if (n>0){if (n%2 == 1) val = val *x;val = val * foo(x*x , n/2);}return val;}这段代码对x和n完成什么样的功能(操作)?(a) xn(b) x*n(c) nx(d) 以上均不是第3题: (a)Non recursive version of the programint what ( int x , int n){int val;int product;product =1;val =x;while(n>0){if (n%2 == 1)product = product*val;n = n/2;val = val* val;}}/* Code raise a number (x) to a large power (n) using binary doubling strategy */Algorithm description(while n>0){if next most significant binary digit of n( power) is onethen multiply accumulated product by current val ,reduce n(power) sequence by a factor of two using integer division .get next val by multiply current value of itself}第4题:考查指针main(){int a[5] = {1,2,3,4,5};int *ptr = (int*)(&a+1);printf("%d %d" , *(a+1), *(ptr-1) );}这段程序的输出是:(a) 2 2(b) 2 1(c) 2 5(d) 以上均不是第4题: (c)type of a is array of inttype of &a is pointer to array of intTaking a pointer to the element one beyond the end of an array is sure to work. 第5题:考查多维数组与指针void foo(int [][3] );main()int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}}; foo(a);printf("%d" , a[2][1]);}void foo( int b[][3]){++ b;b[1][1] =9;}这段程序的输出是:(a) 8(b) 9(c) 7(d)以上均不对第5题: (b)第6题目:考查逗号表达式main(){int a, b,c, d;a=3;b=5;c=a,b;d=(a,b);printf("c=%d" ,c);printf("d=%d" ,d);}这段程序的输出是:(a) c=3 d=3(b) c=5 d=3(c) c=3 d=5(d) c=5 d=5第6题: (c)The comma separates the elements of a function argument list. The comma is also used as an operator in comma expressions. Mixing the two uses of comma is legal, but you must use parentheses to distinguish them. the left operand E1 is evaluated as a void expression, then E2 is evaluated to give the result and type of the comma expression. By recursion, the expressionE1, E2, ..., Enresults in the left-to-right evaluation of each Ei, with the value and type of En giving the result of the whole expression.c=a,b; / *yields c=a* /d=(a,b); /* d =b */第7题:考查指针数组main(){int a[][3] = { 1,2,3 ,4,5,6};int (*ptr)[3] =a;printf("%d %d " ,(*ptr)[1], (*ptr)[2] );++ptr;printf("%d %d" ,(*ptr)[1], (*ptr)[2] );}这段程序的输出是:(a) 2 3 5 6(b) 2 3 4 5(c) 4 5 0 0(d) 以上均不对第7题: (a)/* ptr is pointer to array of 3 int */第8题:考查函数指针int *f1(void){int x =10;return(&x);}int *f2(void){int*ptr;*ptr =10;return ptr;}int *f3(void){int *ptr;ptr=(int*) malloc(sizeof(int));return ptr;}上面这3个函数哪一个最可能引起指针方面的问题(a) 只有 f3(b) 只有f1 and f3(c) 只有f1 and f2(d) f1 , f2 ,f3第8题: (c)f1 and f2 return address of local variable ,when function exit local variable disappeared第9题:考查自加操作(++)main(){int i=3;int j;j = sizeof(++i+ ++i);printf("i=%d j=%d", i ,j);}这段程序的输出是:(a) i=4 j=2(b) i=3 j=2(c) i=3 j=4(d) i=3 j=6第9题: (b)sizeof operator gives the number of bytes required to store an object of the type of its operand . The operands is either an expression, which is not evaluated( (++i + ++ i ) is not evaluated so i remain 3 and j is sizeof int that is 2) or a parenthesized type name.第10题:考查形式参数,实际参数,指针和数组void f1(int *, int);void f2(int *, int);void(*p[2]) ( int *, int);main(){int a;int b;p[0] = f1;p[1] = f2;a=3;b=5;p[0](&a , b);printf("%d\t %d\t" , a ,b);p[1](&a , b);printf("%d\t %d\t" , a ,b);}void f1( int* p , int q){int tmp;tmp =*p;*p = q;q= tmp;}void f2( int* p , int q){int tmp;tmp =*p;*p = q;q= tmp;}这段程序的输出是:(a) 5 5 5 5(b) 3 5 3 5(c) 5 3 5 3(d) 3 3 3 3第10题: (a)void(*p[2]) ( int *, int);define array of pointer to function accept two argument that is pointer to int and return int. p[0] = f1; p[1] = f2 contain address of function .function name without parenthesis represent address of function Value and address of variable is passed to function only argument that is effected is a (address is passed). Because of call by value f1, f2 can not effect b第11题:考查自减操作(--)void e(int );main(){int a;a=3;e(a);}void e(int n){if(n>0){e(--n);printf("%d" , n);e(--n);}}这段程序的输出是:(a) 0 1 2 0(b) 0 1 2 1(c) 1 2 0 1(d) 0 2 1 1第11题: (a)第12题:考查typedef类型定义,函数指针typedef int (*test) ( float * , float*)test tmp;tmp 的类型是(a) 函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments)Pointer to function of having two arguments that is pointer to float(b) 整型(c) 函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型Pointer to function having two argument that is pointer to float and return int(d) 以上都不是第12题: (c)C provide a facility called typedef for creating new data type names, for example declarationtypedef char stringMakes the name string a synonym for int .The type string can be used in declaration, cast, etc, exactly the same way that the type int can be. Notice that the type being declared in a typedef appears in the position of a variable name not after the word typedef.第13题:数组与指针的区别与联系main(){char *p;char buf[10] ={ 1,2,3,4,5,6,9,8};p = (buf+1)[5];printf("%d" , p);}这段程序的输出是:(a) 5(b) 6(c) 9(d) 以上都不对第13题: (c)If the type of an expression is "array of T" for some type T, then the value of the expression is a pointer to the first object in the array, and the type of the expression is altered to "pointer to T"So (buf+1)[5] is equvalent to *(buf +6) or buf[6]第14题:Void f(char**);main(){char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" }; f( argv );}void f( char **p ){char* t;t= (p+= sizeof(int))[-1];printf( "%s" , t);}这段程序的输出是:(a) ab(b) cd(c) ef(d) gh第14题: (b)p+=sizeof(int) point to argv[2](p+=sizeof(int))[-1] points to argv[1] 第15题:#include<stdarg.h>int ripple ( int , ...);main(){int num;num = ripple ( 3, 5,7);printf( " %d" , num);}int ripple (int n, ...){int i , j;int k;va_list p;k= 0;j = 1;va_start( p , n);for (; j<n; ++j){i = va_arg( p , int);for (; i; i &=i-1 )++k;}return k;}这段程序的输出是:(a) 7(b) 6(c) 5(d) 3第15题: (c)When we call ripple value of the first argument passed to ripple is collected in the n that is 3. va_start initialize p to point to first unnamed argument that is 5 (first argument).Each call of va_arg return an argument and step p to the next argument. va_arg uses a type name to determine what type to return and how big a step to take Consider inner loop(; i; i&=i-1) k++ /* count number of 1 bit in i *in five number of 1 bits is (101) 2in seven number of 1 bits is (111) 3hence k return 5examplelet i= 9 = 1001i-1 = 1000(i-1) +1 = i1000+11 001The right most 1 bit of i has corresponding 0 bit in i-1 this way i & i-1, in a two complement number system will delete the right most 1 bit I(repeat until I become 0 gives number of 1 bits)第16题:int counter (int i){static int count =0;count = count +i;return (count );}main(){int i , j;for (i=0; i <=5; i++)j = counter(i);}The value of j at the end of the execution of the this program is:(a) 10(b) 15(c) 6(d) 7第16题: (b)The answer is (b)Static variable count remain in existence rather than coming and going each time function is calledso first call counter(0) count =0second call counter(1) count = 0+1;third call counter(2) count = 1+2; /* count = count +i */fourth call counter(3) count = 3+3;fifth call counter(4) count = 6+4;sixth call counter(5) count = 10+5;。
嵌入式开发--C语言面试
嵌入式开发—C语言面试题(笔试部分)C语言, 嵌入式开发预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4). 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。
记住,第一印象很重要。
2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) (A) : ))这个测试是为下面的目的而设的:1). 标识#define在宏中应用的基本知识。
这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2). 三重条件操作符的知识。
这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3). 懂得在宏中小心地把参数用括号括起来4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。
这问题对区分一个正常的伙计和一个书呆子是很有用的。
只有书呆子才会读C语言课本的附录去找出象这种问题的答案。
当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
嵌入式软件工程师校招面试题目
嵌入式软件工程师校招面试题目嵌入式软件工程师校招面试题目:
一、操作系统
1. 什么是操作系统?
2. 请简述操作系统的功能和特点。
3. 什么是实时操作系统?
4. 实时任务和非实时任务有什么区别?
5. 请简述操作系统的各个组成部分。
6. 进程和线程的区别是什么?
7. 阻塞和非阻塞的I/O操作分别是什么?
8. 请简述Linux的进程管理机制。
二、C语言
1. 什么是指针?
2. 指针有什么作用?
3. 字符串和字符数组的区别是什么?
4. 请简述C语言中常用的循环结构。
5. 动态内存分配的函数是哪些?它们的含义是什么?
6. 请简述C语言中常用的数据结构。
三、嵌入式系统开发
1. 请简述嵌入式系统开发的基本流程。
2. 嵌入式系统中常用的嵌入式处理器有哪些?
3. 嵌入式系统中的外设有哪些?
4. 请简述中断和异常的区别。
5. 嵌入式系统中,如何实现时钟和计时?
6. Please简述嵌入式系统中常用的通信方式和通信协议。
四、硬件知识
1. 请简述CPU和GPU的区别。
2. 什么是内外存储器?
3. 什么是固态硬盘?它的优缺点是什么?
4. 常见的传感器有哪些?它们的作用是什么?
5. 常用的通信接口有哪些?
以上是嵌入式软件工程师校招面试的主要问题列表,在应聘者可以在针对这些问题进行针对性复习和准备,提升自己的应聘竞争力。
嵌入式面试题目试题(3篇)
第1篇一、基础知识1. 问题:简述嵌入式系统的定义和特点。
答案:嵌入式系统是指将计算机技术应用于特定领域,将硬件和软件结合在一起,形成具有特定功能的独立系统。
其特点包括:实时性、可靠性、低功耗、小体积、低成本等。
2. 问题:嵌入式系统与通用计算机系统的区别有哪些?答案:嵌入式系统与通用计算机系统的区别主要有以下几点:(1)设计目标不同:嵌入式系统面向特定应用,通用计算机系统面向通用应用;(2)硬件资源不同:嵌入式系统硬件资源有限,通用计算机系统硬件资源丰富;(3)软件系统不同:嵌入式系统软件系统相对简单,通用计算机系统软件系统复杂;(4)实时性要求不同:嵌入式系统对实时性要求较高,通用计算机系统实时性要求较低。
3. 问题:嵌入式系统中的CPU有哪些特点?答案:嵌入式系统中的CPU具有以下特点:(1)低功耗:为了满足嵌入式系统对功耗的要求,CPU需要具备低功耗的特性;(2)高性能:为了提高嵌入式系统的处理速度,CPU需要具备高性能的特性;(3)可扩展性:为了适应不同的应用需求,CPU需要具备可扩展性;(4)集成度:为了减小嵌入式系统的体积,CPU需要具备高集成度。
4. 问题:什么是嵌入式系统中的裸机?答案:嵌入式系统中的裸机是指没有操作系统和应用程序的CPU。
裸机主要用于学习和实验,也可以用于一些对实时性要求较高的应用。
5. 问题:什么是嵌入式系统中的实时操作系统(RTOS)?答案:实时操作系统(RTOS)是一种专门为实时应用设计的操作系统。
它具有以下特点:(1)实时性:RTOS能够满足实时应用对时间的要求;(2)可靠性:RTOS具有较高的可靠性,能够保证系统稳定运行;(3)可预测性:RTOS的性能可预测,便于应用开发。
二、硬件知识1. 问题:简述嵌入式系统中常用的存储器类型及其特点。
答案:嵌入式系统中常用的存储器类型及其特点如下:(1)RAM(随机存储器):用于存储临时数据,断电后数据会丢失;(2)ROM(只读存储器):用于存储程序代码,断电后数据不会丢失;(3)Flash(闪存):具有RAM和ROM的特点,既可读写,又可断电保存数据;(4)EEPROM(电可擦可编程只读存储器):可擦写,断电后数据不会丢失。
嵌入式面试经典100题
嵌入式面试经典100题嵌入式系统是当今快速发展的领域之一。
面试官通常会问一些经典的问题来评估求职者的知识和技能。
以下是 100 个嵌入式面试经典问题,有助于准备嵌入式面试。
1. 什么是嵌入式系统?2. 嵌入式系统有哪些组成部分?3. 嵌入式系统通常用于哪些领域?4. 什么是微控制器?5. 微控制器有哪些类型?6. 解释一下位运算符。
7. 什么是布尔运算?8. 解释一下存储器分段。
9. 什么是中断?10. 解释一下中断向量表。
11. 什么是浮点数?12. 解释一下浮点数运算。
13. 什么是传感器?14. 解释一下传感器工作原理。
15. 什么是执行器?16. 解释一下执行器工作原理。
17. 什么是总线?18. 解释一下总线工作原理。
20. 解释一下串口工作原理。
21. 什么是以太网?22. 解释一下以太网工作原理。
23. 什么是蓝牙?24. 解释一下蓝牙工作原理。
25. 什么是 Wi-Fi?26. 解释一下 Wi-Fi 工作原理。
27. 什么是 LED?28. 解释一下 LED 工作原理。
29. 什么是 LCD?30. 解释一下 LCD 工作原理。
31. 什么是纽扣电池?32. 解释一下纽扣电池工作原理。
33. 什么是定时器?34. 解释一下定时器工作原理。
35. 什么是串口通信?36. 解释一下串口通信原理。
37. 什么是 FPGA?38. 解释一下 FPGA 工作原理。
39. 什么是 PLC?40. 解释一下 PLC 工作原理。
42. 解释一下触摸屏工作原理。
43. 什么是传感器数据采集?44. 解释一下传感器数据采集原理。
45. 什么是 PWM?46. 解释一下 PWM 工作原理。
47. 什么是功率放大器?48. 解释一下功率放大器工作原理。
49. 什么是串口通信协议?50. 解释一下串口通信协议原理。
51. 什么是温度传感器?52. 解释一下温度传感器工作原理。
53. 什么是湿度传感器?54. 解释一下湿度传感器工作原理。
嵌入式c 面试题
1、在嵌入式C开发中,关于volatile关键字的作用,以下描述正确的是?A. 用于定义常量B. 告诉编译器该变量可能会被意外改变,防止编译器过度优化(答案)C. 用于定义指针类型D. 用于定义数组类型2、在嵌入式系统中,通常使用哪种调试方法来跟踪程序执行过程中的变量和函数调用?A. 使用高级语言调试器B. 使用JTAG接口进行调试(答案)C. 使用文本编辑器进行代码审查D. 使用模拟器运行代码3、以下哪项不是嵌入式系统常用的通信接口?A. SPIB. I2CC. HDMI(答案)D. UART4、在嵌入式C编程中,以下哪种数据结构常用于实现任务调度?A. 链表B. 队列(答案)C. 集合D. 树5、关于嵌入式系统中的中断处理,以下描述错误的是?A. 中断是硬件或软件发出的信号,用于通知CPU有事件需要处理B. 中断服务程序(ISR)是响应中断而执行的代码C. 中断向量表是存储中断服务程序地址的数组D. 所有的中断都必须由操作系统来管理(答案)6、在嵌入式系统中,为了节省存储空间,通常会使用哪种类型的库?A. 动态链接库B. 静态链接库(答案)C. 共享库D. 运行时库7、以下哪项不是嵌入式系统低功耗设计的方法?A. 使用低功耗的硬件组件B. 优化软件算法以减少CPU的使用率C. 增加系统的时钟频率(答案)D. 使用睡眠模式来减少功耗8、在嵌入式C编程中,以下哪个宏定义常用于防止头文件被重复包含?A. #define ONCEB. #pragma onceC. #ifndef, #define, #endif(答案)D. #define HEADER。
嵌入式面试题大全
嵌入式面试题大全
嵌入式面试题涉及的知识面广泛,包括嵌入式系统的基础知识、C/C++语言、操作系统、电路和电子技术等。
以下是一些嵌入式面试中常见的题目:
1. 请简述嵌入式系统的定义和特点。
2. 什么是实时操作系统?请列举几个常见的实时操作系统。
3. 描述一下嵌入式系统中常用的数据结构和算法。
4. 请简述嵌入式软件开发的一般流程。
5. 什么是嵌入式系统的低功耗设计?为什么它很重要?
6. 请简述嵌入式系统中常用的通信协议。
7. 请简述嵌入式系统中常用的硬件接口。
8. 如何进行嵌入式系统的电源管理?
9. 请简述嵌入式系统中常用的软件架构。
10. 如何进行嵌入式系统的性能测试和优化?
11. 请简述嵌入式系统中常用的开发工具和调试方法。
12. 如何进行嵌入式系统的安全设计和保护?
13. 请简述嵌入式系统中的常见故障和解决方法。
14. 如何进行嵌入式系统的可维护性和可靠性设计?
15. 请简述嵌入式系统中的中断处理和任务调度。
16. 如何进行嵌入式系统的硬件设计和软件设计协同工作?
17. 请简述嵌入式系统中常用的异步通信方法。
18. 如何进行嵌入式系统的资源管理和内存优化?
19. 请简述嵌入式系统中的多线程编程和多任务管理。
20. 如何进行嵌入式系统的性能分析和优化?
以上是一些常见的嵌入式面试题,当然具体的题目还会根据具体的岗位和要求有所不同。
建议在准备面试时,除了掌握基础知识和技能外,还要了解相关公司的业务和技术方向,以及行业的发展趋势和最新技术动态。
嵌入式C语言面试题汇总(超经典)
嵌入式C语言面试题汇总(超经典)第一部分:基本概念及其它问答题1、关键字static的作用是什么?这个简单的问题很少有人能回答完全。
在C语言中,关键字static 有三个明显的作用:1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
答、1)引用必须被初始化,指针不必。
2)引用初始化以后不能被改变,指针可以改变所指的对象。
3)不存在指向空值的引用,但是存在指向空值的指针。
指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。
程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
3、.h头文件中的ifndef/define/endif答:防止该头文件被重复引用。
4、#include与#include“file.h”的区别?答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。
5、描述实时系统的基本特性答:在特定时间内完成特定的任务,实时性与可靠性。
6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?答:全局变量储存在静态数据区,局部变量在堆栈中。
7、什么是平衡二叉树?答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。
嵌入式面试题
嵌入式面试题一、简介嵌入式系统是指在特定用途的计算机硬件平台上,集成了微处理器、存储器、外围设备以及实时操作系统等关键元素的一种特殊计算机系统。
嵌入式系统广泛应用于汽车、家电、医疗设备、通信设备等各个领域。
随着嵌入式技术的发展,需求不断增长,嵌入式岗位的面试也变得越来越重要。
二、C语言基础1. 请简要介绍C语言的特点及其在嵌入式系统中的应用。
答:C语言是一种高级编程语言,具有语法简洁、执行效率高、适合系统级编程等特点。
在嵌入式系统中,C语言被广泛应用于底层驱动的编写、中断处理、外设控制等方面。
2. 请解释以下C语言的关键字:const、volatile 和 static。
答:const关键字用于声明常量,被声明为const的变量的数值在程序运行过程中不可修改。
volatile关键字用于声明易变的变量,防止编译器对其进行优化,保证每次访问都会从内存中读取最新值。
static关键字可以用于函数内部和函数外部,函数内部的static变量生命周期会延长到程序结束,函数外部的static变量作用域只限于当前文件。
三、微处理器和微控制器1. 什么是微处理器和微控制器?它们之间有什么区别?答:微处理器是一种集成了CPU、ALU、寄存器和控制单元的芯片,它用于处理和执行算术、逻辑运算以及控制指令。
微控制器是一种集成了CPU、内存、IO接口以及定时器、ADC等外设的芯片,它是一整套可以独立运行的嵌入式系统。
两者的区别在于微处理器需要外部芯片才能构成完整的系统,而微控制器则包含了所需的外设接口,能够直接运行。
2. 请列举几种常见的微控制器类型及其应用领域。
答:常见的微控制器类型包括:8051系列、AVR系列、PIC系列等。
8051系列广泛应用于家电、汽车电子、电力电子等领域;AVR系列常用于工业自动化、单片机控制等;PIC系列适用于安防监控、智能仪表等。
四、实时操作系统(RTOS)1. 请解释实时操作系统的概念及其特点。
嵌入式c面试题
嵌入式c面试题嵌入式C编程是嵌入式系统开发中最为常见的编程语言之一,掌握嵌入式C的基本知识和技能对于想要从事嵌入式系统开发的工程师来说是非常重要的。
在嵌入式C面试中,面试官经常提出各种各样的问题来考察面试者对于C语言的理解和应用能力。
下面将介绍一些常见的嵌入式C面试题目。
1. 请解释一下嵌入式系统是什么?嵌入式系统是一种特殊的计算机系统,它被嵌入到其他设备中,以完成特定的任务。
与通用计算机系统相比,嵌入式系统通常具有资源有限、功耗低、实时性要求高等特点。
嵌入式系统广泛应用于各个领域,如汽车电子、医疗设备、智能家居等。
2. 请解释一下什么是指针?指针是C语言中的一种数据类型,它存储了一个变量或对象的内存地址。
通过指针,我们可以访问和修改对应内存地址中存储的数据。
指针提供了一种直接访问内存的方式,可以在程序中动态地创建、操作和管理内存。
3. 请解释一下const关键字的作用和用法?const关键字用于声明一个常量,即该变量的值在声明后不能被修改。
const关键字可以应用于变量、函数参数和函数返回值等。
使用const关键字可以增加程序的可读性和可靠性,避免意外的变量修改。
4. 什么是位操作?位操作是对数据的二进制位进行直接操作的一种编程技术。
通过位操作,可以对二进制数据进行逻辑运算、位移操作和屏蔽操作等。
位操作常用于对寄存器和硬件接口进行编程,能够提高程序执行效率和灵活性。
5. 请解释一下嵌入式系统中的中断?中断是嵌入式系统中常用的一种编程技术,用于实现处理实时事件的机制。
当系统发生中断事件时,嵌入式系统会立即中断当前任务,转而执行中断服务程序,处理中断事件。
中断可以提高系统的实时性和响应能力。
6. 请解释一下嵌入式系统中的定时器?定时器是嵌入式系统中常用的计时设备,用于实现时间相关的功能和任务。
嵌入式系统中的定时器可以通过硬件或软件实现,可以设置定时时间和定时事件,并在时间达到时触发中断或执行其他操作。
c语言嵌入式面试题
下面是一些常见的C语言嵌入式面试题:
1. 什么是嵌入式系统?嵌入式系统与普通计算机系统有何区别?
2. 在嵌入式系统中,volatile关键字的作用是什么?举一个使用volatile的例子。
3. 解释一下指针和数组之间的关系。
如何通过指针访问数组元素?
4. 简要解释下面的代码段的输出结果:
```
int i = 0;
while (i < 5) {
printf("%d ", i++);
if (i == 3) continue;
printf("%d ", i);
}
```
5. 在C语言中,const关键字的作用是什么?它与#define有什么区别?
6. 请解释static关键字在函数和变量中的使用。
7. 解释堆(Heap)和栈(Stack)的区别,及它们在嵌入式系统中的应用。
8. 什么是中断?在嵌入式系统中,为什么需要中断?
9. 请解释C语言中的位域(Bit-fields)是什么以及它们的应用场景。
10. 解释下面的代码段的功能:
```
#define SET_BIT(reg, bit_pos) (reg |= (1 << bit_pos))
#define CLEAR_BIT(reg, bit_pos) (reg &= ~(1 << bit_pos))
#define GET_BIT(reg, bit_pos) ((reg >> bit_pos) & 1)
```。
嵌入式C语言面试题(附答案)
嵌入式C语言面试题(附答案)int main(int argc,char *argv[]){int c=9,d=0;c=c++%5;d=c;printf(d=%d\n,d);return 0;}a) 写出程序输出b) 在一个可移植的系统中这种表达式是否存在风险?why? #include stdio.hint a=0;int b;static char c;int main(int argc,char *argv[]){char d=4;static short e;a++;b=100;c=(char)++a;e=(++d)++;printf(a=%d, b=%d, c=%d, d= %d, e=%d,a,b,c,d,e);return 0;}a) 写出程序输出b) 编译器假如安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。
2 中断是嵌入式系统中重要的组成局部,这导致了很多编译开发商供应一种扩展:让标准C支持中断,产生了一个新的关键字__interrupt。
下面的代码就使用了__interrupt关键字去定义了一个中断效劳子程序(ISR),请评论以下这段代码。
__interrupt double compute_area(double radius){double area = PI * radius *radius;printf(nArea = %f, area);return area;}3 C/C++根底学问问题a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。
b) C语言中static关键字的详细作用有哪些 ?c) 请问下面三种变量声明有何区分?请给出详细含义int const *p;int* const p;int const* const p;4 嵌入式系统相关问题a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。
嵌入式C经典面试题
C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。
这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。
从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。
这个测试只是出题者为显示其对 ANSI 标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII 值。
这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。
如果上述任何问题的答案是“是”的话,那么我知道我得认真考虑我是否应该去做这份工作。
从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者 C语言的水平。
不管怎么样,看一下这人如何回答他不会的问题也是满有趣。
应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。
有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。
这些问题都是我这些年实际碰到的。
其中有些题很难,但它们应该都能给你一点启迪。
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。
为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。
预处理器( Preprocessor )1 .用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:?; #define语法的基本知识(例如:不能以分号结束,括号的使用,等等)?;懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
经典嵌入式面精彩试题
经典嵌入式面试题C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。
这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。
从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。
这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII值。
这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。
如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。
从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。
不管怎么样,看一下这人如何回答他不会的问题也是满有趣。
应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。
有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。
这些问题都是我这些年实际碰到的。
其中有些题很难,但它们应该都能给你一点启迪。
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。
为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。
预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:?; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)?; 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详细信息站内订阅(0)加为好友发送短信日志:10评论:12留言:0访问:13898h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 ( An arra y of ten pointers to s that take an integer argument and return an integer )答案是:a) int a; // An integerb) int *a; // A pointer to an integerc) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integerse) int *a[10]; // An array of 10 pointers to integersf) int (*a)[10]; // A pointer to an array of 10 integersg) int (*a)(int); // A pointer to a a that takes an integer argument and returns an integerh) int (*a[10])(int); // An array of 10 pointers to s that take an integer argument and return an int eger人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。
当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。
但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。
因为在被面试的这段时间里,我确定我知道这个问题的答案。
应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?Static6. 关键字static 的作用是什么?这个简单的问题很少有人能回答完全。
在C 语言中,关键字static 有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
Const7.关键字const 是什么含意?我 只要一听到被面试者说:“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 的出现。
Volatile8. 关键字volatile 有什么含意 并给出三个不同的例子。
一个定义为volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile 变量的几个例子:1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3). 多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。
我认为这是区分C 程序员和嵌入式系统程序员的最基本的问题。
嵌入式系统程序员经常同硬件、中断、RTOS 等等打交道,所用这些都要求volatile 变量。
不懂得volati le 内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是Statistics假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得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可能是不同的。
结果,这段代码可能返不是你所期望的平方值!正确的代码如下:long square(volatile int *ptr){int a;a = *ptr;return a * a;}位操作(Bit manipulation)9. 嵌入式系统总是要用户对变量或寄存器进行位操作。
给定一个整型变量a,写两段代码,第一个设置a 的bit 3,第二个清除a 的bit 3。
在以上两个操作中,要保持其它位不变。
对这个问题有三种基本的反应1). 不知道如何下手。
该被面者从没做过任何嵌入式系统的工作。
2). 用bit fields。
Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。
我最近不幸看到Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。
从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。
3). 用 #defines 和 bit masks 操作。
这是一个有极高可移植性的方法,是应该被用到的方法。
最佳的解决方案如下:#define BIT3 (0x1<<3)static int a;void set_bit3(void){a |= BIT3;}void clear_bit3(void){a &= ~BIT3;}一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。
我希望看到几个要点:说明常数、|=和&=~操作。
访问固定的内存位置(Accessing fixed memory locations)10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。
在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。
编译器是一个纯粹的ANSI编译器。
写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。
这一问题的实现方式随着个人风格不同而不同。
典型的类似代码如下:int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa55;一个较晦涩的方法是:*(int * const)(0x67a9) = 0xaa55;即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。
中断(Interrupts)11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。
具代表事实是,产生了一个新的关键字 __interrupt。
下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius){double area = PI * radius * radius;printf(" Area = %f", area);return area;}这个函数有太多的错误了,以至让人不知从何说起了:1). ISR 不能返回一个值。
如果你不懂这个,那么你不会被雇用的。
2). ISR 不能传递参数。
如果你没有看到这一点,你被雇用的机会等同第一项。
3). 在许多的处理器/编译器中,浮点一般都是不可重入的。