嵌入式C语言经典笔试题
美的嵌入式软件开发笔试题目
美的嵌入式软件开发笔试题目美的嵌入式软件开发笔试题目作为一名嵌入式软件开发工程师,我们需要能够熟练地掌握各种开发工具和技术,才能更好地完成开发任务。
下面是一些美的嵌入式软件开发的笔试题目,希望对大家有所帮助。
一、C语言题目1.请编写一个函数,将字符串中的每个字符都转换成大写字母,并返回转换后的字符串。
2.请写一个函数,输入一个字符串,返回该字符串中最长的连续数字串。
3.请编写一个C程序,输入一个10进制整数,将该整数转化为16进制输出。
4.请编写一个函数,输入两个字符串,比较两个字符串的大小,并返回一个int类型的值,1表示str1>str2,0表示str1=str2,-1表示str1<str2。
二、操作系统题目1.请简述Linux系统的启动过程。
2.什么是中断,中断的作用是什么?3.进程和线程的区别是什么,它们是如何调度的?4.请简述虚拟内存的实现原理以及如何进行内存分页管理。
三、计算机网络题目1.请简述TCP和UDP协议的区别。
2.什么是ARP协议,该协议的作用是什么?3.什么是ACL(访问控制列表),它是如何实现的?4.请阐述TCP的拥塞控制算法。
四、算法题目1.请实现快速排序算法。
2.请编写一个函数,输入一个数组和一个数字n,查找出数组中两个数之和为n的两个数。
3.请实现Dijkstra算法,计算最短路径。
4.请编写一个函数,输入两个字符串A,B,返回其中最长的公共子序列。
以上是美的嵌入式软件开发的一些笔试题目,希望大家认真对待,加强自身的技能水平,更好地完成开发任务。
嵌入式linux c开发常见笔试题目
嵌入式Linux C开发的常见笔试题目主要围绕C语言基础、Linux操作系统以及嵌入式系统开发等方面。
以下是一些可能的笔试题目:
1. 请解释C和C++的主要区别。
2. 描述一下静态变量和全局变量在内存中的分配情况。
3. 解释一下什么是预处理器以及它的主要作用。
4. 编写一个程序,实现两个整数的交换而不使用第三个变量。
5. 描述一下进程和线程的区别以及它们之间的关系。
6. 什么是死锁?请列举至少两种导致死锁的情况。
7. 请解释一下中断处理程序的工作原理。
8. 如何在Linux中创建一个新进程?
9. 描述一下Linux中的同步和异步机制。
10. 什么是RTOS?请列举至少两个RTOS的例子。
c语言嵌入式试题
c语言嵌入式试题以下是一些C语言嵌入式试题:1.以下关于C语言嵌入式编程的说法正确的是?(A)C语言嵌入式编程需要考虑内存管理。
(B)C语言嵌入式编程需要考虑实时性。
(C)C语言嵌入式编程需要考虑硬件资源的利用。
(D)以上都正确。
答案:(D)2.以下关于C语言嵌入式编程的内存管理的说法正确的是?(A)嵌入式系统通常内存有限,因此需要精心管理内存。
(B)嵌入式系统通常使用动态内存分配,因此需要注意内存泄漏。
(C)嵌入式系统通常使用静态内存分配,因此不需要考虑内存泄漏。
(D)以上都正确。
答案:(A)、(B)3.以下关于C语言嵌入式编程的实时性的说法正确的是?(A)嵌入式系统通常需要实时响应外部事件。
(B)嵌入式系统通常需要满足一定的延迟要求。
(C)嵌入式系统通常需要满足一定的吞吐量要求。
(D)以上都正确。
答案:(A)、(B)、(C)4.以下关于C语言嵌入式编程的硬件资源利用的说法正确的是?(A)嵌入式系统通常硬件资源有限,因此需要充分利用硬件资源。
(B)嵌入式系统通常需要考虑功耗,因此需要合理使用硬件资源。
(C)嵌入式系统通常需要考虑成本,因此需要降低硬件资源的使用。
(D)以上都正确。
答案:(A)、(B)、(C)5.以下关于C语言嵌入式编程的常见错误是?(A)使用未定义的变量或函数。
(B)使用不兼容的数据类型。
(C)使用未初始化的变量。
(D)以上都正确。
答案:(A)、(B)、(C)6.以下关于C语言嵌入式编程的常见技巧是?(A)使用宏来实现常见的操作。
(B)使用结构体来封装数据。
(C)使用函数指针来实现灵活的处理。
(D)以上都正确。
答案:(A)、(B)、(C)7.以下关于C语言嵌入式编程的常见工具是?(A)编译器。
(B)链接器。
(C)调试器。
(D)以上都正确。
答案:(A)、(B)、(C)8.以下关于C语言嵌入式编程的常见平台是?(A)ARM。
(B)MIPS。
(C)x86。
(D)以上都正确。
答案:(A)、(B)、(C)9.以下关于C语言嵌入式编程的常见应用是?(A)家用电器。
嵌入式软件开发面试C语言笔试题+答案
Chapter2 系统类
***********************/
1. Linux 和 Uc/os 是如何实现任务调度的?
2. Bootloader 移植过程要注意的事项,要做哪些工作 3. Emacs 用过没有?
/************************
h) int (*a[10]) (int); // An array of 10 pointers to functions that take an in teger argument and return an integer
5. 什么是存储机制里的大、小端模式?试举例说明 大端模式(big-edian):MSB 存放在最低端的地址上。举例,双字节数0x1234以 big-endian 的方式存在起始地
7. 定义一个返回值是指向函数的指针且有一个指向函数的指针作参数的函数。
通用形式如下:
typedef int (*P)( );
// 定义一个函数指针 P 类型
P function( int (*p)( ) );
// 定义一个函数返回值 P 类型,且定义一个指向函数的指针 p 作参数
8. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365) UL // UL 怎么个用法?你暂不要加
SLNode *p,*q; int j; p=head; j=-1; while( (p->next!=NULL) && (j<(i-1)) ) {
int a = 5, b = 7, 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) 这个测试是为下面的目的而设的: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语言常见笔试题或面试题
当预处理器预处理到#error 命令时将停止编译并输出用户自定义的错误消息。其目的就 是保证程序是按照你所设想的那样进行编译的。
如 #error Sorry,an error has occurred! 当程序比较大时,往往有些宏定义是在外部指定的(如 makefile),或是在系统头文件 中指定的,当你不太确定当前是否定义了 XXX 时,就可以改成如下这样进行编译: #ifdef XXX ... #error "XXX has been defined" #else #endif
如果仅仅使用{}将 foo1 和 foo2 包裹起来,展开后如下:
if(a>0)
{
foo1();
foo2();
}; //这是错的
所以,很多人才采用了 do{...}while(0);
#define DOSOMETHING() \
do{ \
foo1();\
foo2();\
}while(0)\
展开后得到:
由于频繁的进行动态内存分配会造成内存碎片的产生,影响系统性能,所以在不同的系 统中,对于动态内存管理,开发了许多不同的算法,不同的操作系统,有不同的实现方式, 为了程序的可移植性,一般在开发语言的库中都提供了统一接口。对于 C 语言,在标准 C 库和 Glib 中,都实现了以 malloc/free 为接口的动态内存分配功能。也就是说,malloc/free 库函索包装了不同操作系统对动态内存管理的不同实现,为开发者提供了一个统一的开发环 境。对于我们前面提到的一些嵌入式操作系统,因为实时系统的特殊要求(实时性要求和开 发者订制嵌入式系统),可能没有提供相应的接口。
1)、算术转换 进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数招必须转换成同
嵌入式c语言笔试题
嵌入式c语言笔试题●为什么嵌入式行业注重C语言的考察?●首先我们需要知道为什么嵌入式开发用c语言开发,在这么多种编程语言中为什么单单c语言在嵌入式行业中这么受用呢?●在编译器的帮助下,c语言开发出来的代码能在多种不同体系结构的软/硬平台上运行,具有出色的可移植性。
●能够直接访问硬件。
其实能够直接访问硬件的语言有汇编和C语言,但是汇编语言属于低级语言,难以完成一些复杂的功能,此外汇编语言和CPU的架构紧密相关,X86架构和ARM架构的汇编代码是不同的,这就违背了嵌入式开发中可以执行的原则。
然而汇编比C语言访问硬件的效率更高,所以,一般将硬件初始化的工作交给汇编,比较复杂的操作交给C语言。
●那面向对象的编程语言受到无法直接操作硬件的限制,使得c语言在嵌入式开发中有不可取代的地位。
●常见嵌入式C语言笔试题的几个专题●数据类型●用变量a定义如下类型的变量●一个整形数int a;●一个指向整形数的指针int *a;●一个指向指针的指针,被指向的指针指向一个整形数int **a;●一个有十个整形数的数组int a[10];●一个又是个指针的数组,数组元素指向一个整形数int *a[10];●一个指向有十个整形数数组的指针int (*a)[10];●一个指向函数的指针,该函数有一个整形参数并返回一个整形数int (*a)(int );●一个有十个指针的数组,该数组指向一个函数,该函数有一个整型参数并返回一个整形数int (*a[10])(int );●解析●这道题有两种考法,一是给出要求,自己写出定义语句,二是给出定义语句,自己写出变量a的含义。
●解决办法掌握几个原则就好●这里首先提供给大家一个图片●然后看这个变量的本质是什么,越靠近本质的定义其优先级越高●举个栗子●一个有10个指针的数组,数组元素指向一个整形数int *a[10];●一个指向有10个整形数数组的指针int (*a)[10];●我们辨析一下上面两个变量●通过上面运算符优先级的图片可以知道 [] 的优先级是高于 * 的,所以int*a[10];中,a的本质是数组,然后数组的中存放的数据成员是指针,数据成员指向的是整型数据。
16道嵌入式C语言试题
pointer to float (b) 整型 (c) 函数的指针, 该函数以两个指向浮点数(float)的
指针(pointer)作为参数(arguments),并且函数的返回值 类型是整型
第 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; }
第 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);
这段程序的输出是: (a) 8 (b) 9 (c) 7
(d)以上均不对
第 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
嵌入式c语言笔试题
嵌入式c语言笔试题1. 编写一个C程序,从键盘读入两个整数a和b,计算它们的和并输出。
```c#include <stdio.h>int main() {int a, b, sum;printf("请输入两个整数:\n");scanf("%d%d", &a, &b);sum = a + b;printf("它们的和为:%d\n", sum);return 0;}```2. 编写一个C函数,判断一个整数是否是奇数,并返回判断结果(1表示奇数,0表示偶数)。
```c#include <stdio.h>int isOdd(int num) {if (num % 2 == 1) {return 1;} else {return 0;}}int main() {int num;printf("请输入一个整数:\n");scanf("%d", &num);if (isOdd(num) == 1) {printf("是奇数\n");} else {printf("是偶数\n");}return 0;}```3. 编写一个C函数,求一个整数数组中的最大值并返回。
#include <stdio.h>int findMax(int array[], int size) {int max = array[0];for (int i = 1; i < size; i++) {if (array[i] > max) {max = array[i];}}return max;}int main() {int size;printf("请输入数组的大小:\n"); scanf("%d", &size);int array[size];printf("请输入数组元素:\n"); for (int i = 0; i < size; i++) {scanf("%d", &array[i]);int max = findMax(array, size);printf("最大值为:%d\n", max);return 0;}```4. 编写一个C程序,实现冒泡排序算法对一个整数数组进行升序排序并输出结果。
嵌入式c语言考题
嵌入式c语言考题1.请编写一个函数,实现将一个整数转换为字符串的功能。
例如,将整数123转换为字符串"123"。
void int2str(int num, char* str){sprintf(str, "%d", num);}2.在下面的代码中,变量a、b、c、d分别存储了一个四字节整数的每个字节的值,请编写一行代码,将这个四字节整数合成为一个整数:unsigned char a = 0x11, b = 0x22, c = 0x33, d = 0x44;unsigned int value = (a << 24) | (b << 16) | (c << 8) | d;3.请编写一个函数,从一个字符数组中找出最大的元素,并返回它的下标和值。
例如,对于字符数组['a', 'c', 'b'],最大的元素为'c',下标为1,值为'c'。
void find_max(char* arr, int len, int* index, char* max_value){*max_value = arr[0];*index = 0;for (int i = 1; i < len; i++) {if (arr[i] > *max_value) {*max_value = arr[i];*index = i;}}}4.请编写一个函数,实现将一个二进制字符串转换为十进制整数的功能。
例如,将二进制字符串"1101"转换为整数13。
int bin2dec(char* bin_str){int dec = 0;for (int i = 0; bin_str[i] != '\0'; i++) {dec = dec * 2 + (bin_str[i] - '0');}return dec;}5.在下面的代码中,变量a、b、c分别存储了三个整数,请编写一行代码,在不使用临时变量的情况下,交换a、b、c的值。
嵌入式linux c开发常见笔试题目
嵌入式linux c开发常见笔试题目嵌入式Linux C开发是一个广泛应用于各种嵌入式设备的技术领域,也是许多企业在招聘时重点考察的技能。
在笔试中,考察的内容通常包括C语言基础、嵌入式系统知识、Linux系统编程等方面。
以下是一些常见的嵌入式Linux C开发笔试题目,供大家参考。
1. C语言基础在嵌入式Linux C开发中,对C语言的熟练掌握是非常重要的。
下面是一些与C语言基础相关的题目:1.1 请写出C语言中的数据类型,并解释其含义。
1.2 请解释C语言中的指针,并写出指针的声明、赋值和使用的例子。
1.3 请解释C语言中的结构体,并写出结构体的定义和使用的例子。
2. 嵌入式系统知识嵌入式系统是指在限定的资源和空间中运行的计算机系统,对于嵌入式Linux C开发来说,对嵌入式系统的了解是必不可少的。
下面是一些与嵌入式系统知识相关的题目:2.1 请解释嵌入式系统的特点,并举例说明。
2.2 请简要解释Linux内核的作用,并说明为什么在嵌入式系统中常使用Linux内核。
2.3 请解释交叉编译的概念,并说明为什么在嵌入式Linux C开发中常使用交叉编译。
3. Linux系统编程Linux系统编程是指在Linux系统上进行程序开发和调试的技术。
对于嵌入式Linux C开发者来说,熟悉Linux系统编程是必备的技能。
下面是一些与Linux系统编程相关的题目:3.1 请解释Linux系统中的进程和线程,并说明它们的区别和联系。
3.2 请解释Linux文件系统的层次结构,并说明每个层次的作用。
3.3 请解释Linux中的系统调用,并举例说明几个常用的系统调用。
4. 嵌入式Linux应用开发嵌入式Linux应用开发是指在嵌入式Linux系统上进行应用程序开发的技术。
下面是一些与嵌入式Linux应用开发相关的题目:4.1 请编写一个在嵌入式Linux系统上运行的Hello World程序。
4.2 请解释Linux设备驱动程序的概念,并说明为什么在嵌入式Linux应用开发中常涉及到设备驱动程序。
嵌入式笔试题
第一章C语言常见问题1.1关作键字static的用这个简单的问题很少有人能回答完全。
在C语言中,关键字static有三个明显的作用:1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。
2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,但是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
考点:在嵌入式系统中,要时刻懂得移植的重要性,程序可能是很多程序员共同协作同时完成,在定义变量及函数的过程,可能会重名,这给系统的集成带来麻烦,因此保证不冲突的办法是显示的表示此变量或者函数是本地的,static即可。
在Linux的模块编程中,这一条很明显,所有的函数和全局变量都要用static 关键字声明,将其作用域限制在本模块内部,与其他模块共享的函数或者变量要EXPORT到内核中。
1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
2022年嵌入式c语言笔试题及答案
2022年嵌入式c语言笔试题及答案2022年嵌入式c语言笔试题及答案1 读程序段,回答问题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.h"int 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=0某,请画出在little endian及big endian的方式下在内存中是如何存储的。
常见嵌入式笔试题
常见嵌入式笔试题(一)
1)将一个字符串逆序
代码:
#include<stdio.h>
#include<string.h>
void s_back(char * a )
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got a valid pointer”。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
中断(Interrupts)
11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
嵌入式笔试题及答案
嵌入式笔试题及答案一、选择题(每题2分,共40分)1. 下面哪个不是嵌入式系统的特点?A. 实时性强B. 资源受限C. 包含网络通信功能D. 电源自主供电答案:C2. 嵌入式系统的一个主要应用领域是:A. 医疗设备B. 大型工业控制C. 智能手机D. 电子游戏答案:A3. 在嵌入式系统开发中,通常使用哪种编程语言?A. PythonB. JavaC. C/C++D. JavaScript答案:C4. 嵌入式系统的主要硬件组成部分是:A. 处理器、内存、外设B. 显示屏、键盘、鼠标C. 摄像头、扬声器、麦克风D. 电源、机箱、风扇答案:A5. 在嵌入式系统开发中,以下哪个是常用的实时操作系统?A. WindowsB. LinuxC. AndroidD. RTOS答案:D...二、编程题(共60分)请使用C语言完成以下题目:1. 编写一个函数,判断一个数是否为素数。
函数原型为: int isPrime(int n);答案:```c#include <stdio.h>int isPrime(int n) {int i;for (i = 2; i <= n/2; i++) {if (n % i == 0) {return 0; // 不是素数}}return 1; // 是素数}int main() {int n;printf("请输入一个整数:");scanf("%d", &n);if (isPrime(n)) {printf("%d是素数\n", n);} else {printf("%d不是素数\n", n);}return 0;}```2. 编写一个函数,计算n的阶乘。
函数原型为: int factorial(int n);答案:```c#include <stdio.h>int factorial(int n) {if (n == 0) {return 1;} else {return n * factorial(n - 1);}}int main() {int n;printf("请输入一个整数:");scanf("%d", &n);printf("%d的阶乘为:%d\n", n, factorial(n));return 0;}```...三、简答题(每题10分,共30分)1. 简述嵌入式系统的优缺点。
嵌入式C语言经典笔试题目
嵌入式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语言经典笔试题
嵌入式c语言经典笔试题嵌入式C语言经典笔试题有很多,以下是一些常见的题目,供参考:1. 写出一个宏定义,实现取两个数中的较大值。
c#define MAX(a, b) ((a) > (b) ? (a) : (b))2. 编写一个函数,判断一个整数是否为偶数,如果是则返回1,否则返回0。
cint isEven(int num) {if (num % 2 == 0) {return 1;} else {return 0;3. 实现一个函数,将一个字符串反转。
cvoid reverseString(char* str) {int len = strlen(str);for (int i = 0; i < len / 2; i++) {char temp = str[i];str[i] = str[len - i - 1];str[len - i - 1] = temp;4. 编写一个函数,计算一个数组中所有元素的和。
cint sumArray(int* arr, int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += arr[i];return sum;5. 实现一个简单的队列数据结构,包括入队、出队和判空操作。
c#define QUEUE_SIZE 100typedef struct {int data[QUEUE_SIZE];int front;int rear;} Queue;void initQueue(Queue* queue) {queue->front = 0;queue->rear = 0;void enqueue(Queue* queue, int value) {if ((queue->rear + 1) % QUEUE_SIZE == queue->front) {// 队列已满return;queue->data[queue->rear] = value;queue->rear = (queue->rear + 1) % QUEUE_SIZE;int dequeue(Queue* queue) {if (queue->front == queue->rear) {// 队列为空return -1;int value = queue->data[queue->front];queue->front = (queue->front + 1) % QUEUE_SIZE;return value;int isEmpty(Queue* queue) {return queue->front == queue->rear;这些题目是嵌入式C语言笔试中常见的题目,希望对你有帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一些程序员更喜欢如下方案: for(;;) {
}
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应 试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原 理。如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。"这会 给我留下一个坏印象。
第三个方案是用 goto Loop: ... goto Loop; 应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事) 或者他是一个想进入新领域的 BASIC/FORTRAN 程序员。
答案是: 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
least =rror 的目的是什么? 如果你不知道答案,请看参考文献 1。这问题对区分一个正常的伙计和一个书呆 子是很有用的。只有书呆子才会读 C 语言课本的附录去找出象这种问题的答案。 #error 预处理指令的作用是,编译程序时,只要遇到#error 就会生成一个编译 错误提示消息,并停止编译。其语法格式为: #error error-message
Static
6. 关键字 static 的作用是什么? 这个简单的问题很少有人能回答完全。在 C 语言中,关键字 static 有三个明显 的作用: 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函 数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那 就是,这个函数被限制在声明它的模块的本地范围内使用。
int square(volatile int *ptr) {
int a,b; a = *ptr; b = *ptr; return a * b; }
由于*ptr 的值可能被意想不到地该变,因此 a 和 b 可能是不同的。结果,这段 代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr) {
数据声明(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 )
2 . 写一个"标准"宏 MIN ,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A) <= (B) ? (A) : (B))
这个测试是为下面的目的而设的: 1) 标识#define 在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline) 操作符 变为标准 C 的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌 入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。 2)三重条件操作符的知识。这个操作符存在 C 语言中的原因是它使得编译器能产 生比 if-then-else 更优化的代码,了解这个用法是很重要的。 3) 懂得在宏中小心地把参数用括号括起来 4) 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什 么事?
注意,宏串 error-message 不用双引号包围。遇到#error 指令时,错误信息被 显示,可能同时还显示编译程序作者预先定义的其他内容。
死循环(Infinite loops)
4. 嵌入式系统中经常要用到无限循环,你怎么样用 C 编写死循环呢? 这个问题用几个解决方案。我首选的方案是:
while(1) {
如果应试者能正确回答这个问题,我将问他一个附加的问题: 下面的声明都是什么意思?
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 的出现。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人 能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据 和代码范围的好处和重要性。
Const
7.关键字 const 有什么含意? 我只要一听到被面试者说:"const 意味着常数",我就知道我正在和一个业余者 打交道。去年 Dan Saks 已经在他的文章里完全概括了 const 的所有用法,因此 ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉 const 能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出 const 意味着" 只读"就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答 案。(如果你想知道更详细的答案,仔细读一下 Saks 的文章吧。)
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
Volatile
8. 关键字 volatile 有什么含意?并给出三个不同的例子。 一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样,编译 器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须 每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
嵌入式常见经典笔试题
预处理器(Preprocessor)
1 . 用预处理指令#define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年 问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情: (1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) (2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算 一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 (3) 意识到这个表达式将使一个 16 位机的整型数溢出-因此要用到长整型符号 L,告诉编译器这个常数是的长整型数。 (4) 如果你在你的表达式中用到 UL(表示无符号长整型),那么你有了一个 好的起点。记住,第一印象很重要。