C嵌入式面试题.docx
- 文档编号:11976576
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:20
- 大小:77.25KB
C嵌入式面试题.docx
《C嵌入式面试题.docx》由会员分享,可在线阅读,更多相关《C嵌入式面试题.docx(20页珍藏版)》请在冰豆网上搜索。
C嵌入式面试题
1.用处理指令#define写一个一年有多少秒(不考虑闰年)
#defineSECONDS_YEAR(365*24*60*60)
2.写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ?
(A) :
(B))
3.用C语言写一个无线死循环的例子。
While
(1)
{
}
For(;;)为什么?
{
}
for(;;)编译成汇编后是无条件转移,while
(1)是要0和1进行一下比较的,所以从这个方向上看for(;;)是要比while
(1)快的因为少了一个比较指令,但现在的编译器都是有一定的优化能力的,像while
(1)这种会优化成和for(;;)一样的汇编代码。
Loop:
Gotoloop;
4.关键字static的作用?
5.关键字const的作用?
(只读)
6.sizeof和strlen有什么区别?
?
1)sizeof是一个操作符,strlen是库函数。
2)sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数。
3)编译器在编译时就计算出了sizeof的结果。
而strlen函数必须在运行时才能计算出来。
并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。
4)数组做sizeof的参数不退化,传递给strlen就退化为指针了。
7.进程和线程的区别?
8.文件IO和标准IO的区别?
?
文件I/O:
文件I/O称之为不带缓存的IO(unbufferedI/O)。
不带缓存指的是每个read,write都调用内核中的一个系统调用。
也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。
标准I/O:
标准I/O是ANSIC建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。
标准I/O库处理很多细节。
例如缓存分配,以优化长度执行I/O等。
标准的I/O提供了三种类型的缓存。
1.全缓存2.行缓存3.不带缓存
(1)全缓存:
当填满标准I/O缓存后才进行实际的I/O操作。
(2)行缓存:
当输入或输出中遇到新行符时,标准I/O库执行I/O操作。
(3)不带缓存:
stderr就是
标准IO可以减少系统调用次数,提高系统效率。
标准IO的核心对象就是流FILE*
标准I/O可以看成是在文件I/O的基础上封装了缓冲机制。
文件IO文件描述符intfd;
9.指针函数和函数指针的概念?
指针函数是一个函数,返回值是一个指针
首先它是一个函数,只不过这个函数的返回值是一个地址值。
函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
函数指针是一个指针,指向函数的指针
首先它是一个指针,只是这个指针指向的是一个函数。
指针变量可以指向变量的地址、数组、字符串、动态分配地址,同时也可指向一个函数,每个函数在编译的时候,系统会分配给该函数一个入口地址,函数名表示这个入口地址,那么指向函数的指针变量称为函数指针变量。
10.二叉树的遍历有前序遍历、中序遍历、后序遍历,如果不给哪一个遍历结构,无法确定二叉树?
?
如果不给出中序遍历结构,无法唯一确定一颗二叉树
11.进程间通信:
无名管道:
PIPE
有名管道:
FIFO
信号信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程某事件发生。
-----Linux中进程对于信号的三种响应方式
-----忽略捕捉执行默认操作
消息队列实质上是一个链表,
共享内存:
从字面意义解释就是多个进程可以把一段内存映射到自己的进程空间,以此来实现数据的共享及传输,这也是所有进程间通信方式最快的一种,共享内存是存在于内核级别的一种资源。
信号灯(semaphore),也叫信号量,它是不同进程间或一个给定进程内部不同线程间同步的机制。
Socket:
这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛
12.OSI的参考模型:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP的参考模型:
应用层、传输层、网络层、网络接口层
13.TCP连接的三次握手?
1)客户机向主机发送一个SYN标志的TCP报文,并进入发送状态。
2)主机收到SYN报文后,返回一个SYN+ACK的报文,表示主机的SYN被确认,此时进入接收状态。
3)客户机收到服务器的SYN+ACK报文后,向服务器发送确认ACK报文,客户端和服务器的连接状态完成。
14.进程调度的基本实现思想?
时间片轮转。
15.Linux中有哪几种设备?
?
字符设备,块设备,网络设备
16.Linux中的文件包括哪些?
可执行文件,目录文件,普通文件,链接文件,设备文件,管道文件
17.设备驱动程序包括哪些功能函数?
?
open(),read(),write(),ioctl(),release(),lseek()
18.Fork函数的使用?
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
19.进程与线程的区别?
(1)定义
(2)区别(3)优缺点
20.Cortex-m0
如何定义无符号的一字节。
21.项目里面的多线程是如何并行运行的?
?
写出相关的函数
22.解压和压缩的指令?
?
22.linux中几种创建进程的方法?
在Linux中主要提供了fork、vfork、clone三个进程创建方法。
在linux源码中这三个调用的执行过程是执行fork(),vfork(),clone()时,通过一个系统调用表映射到sys_fork(),sys_vfork(),sys_clone(),再在这三个函数中去调用do_fork()去做具体的创建进程工作。
23.Uboot的启动流程?
U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:
(1)第一阶段的功能
1、硬件设备初始化
2、加载U-Boot第二阶段代码到RAM空间
3、设置堆栈
4、跳转到第二阶段代码入口
(2)第二阶段的功能
1、初始化本阶段使用的硬件设备
2、检测系统内存映射
3、将内核从Flash读取到RAM中
4、为内核设置启动参数
5、调用内核
24.描述一下你对单工,半双工,全双工通信方式的理解
25.OSI七层模型
26.头文件中的ifnde/define/endif干什么用?
27.#include
28.数组和链表的区别?
(1)存储形式:
数组是一块连续的空间,声明时就要确定长度。
链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。
(2)数据查找:
数组的线性查找速度快,查找操作直接使用偏移地址。
链表需要按顺序检索结点,效率低。
(3)数据插入或删除:
链表可以快速插入和删除结点,而数组则可能需要大量数据移动。
(4)越界问题:
链表不存在越界问题,数组有越界问题。
29.路由器和交换机的区别?
一、交换机和路由器的基本概念
a--交换机(英文:
Switch,意为“开关”)交换机是一种用于电信号转发的网络设备。
它可以为接入交换机的任意两个网络节点提供独享的电信号通路。
最常见的交换机是以太网交换机。
其他常见的还有电话语音交换机、光纤交换机等。
b--路由器(Router)路由器是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号的设备。
路由器是互联网络的枢纽、"交通警察"。
目前路由器已经广泛应用于各行各业,各种不同档次的产品已成为实现各种骨干网内部连接、骨干网间互联和骨干网与互联网互联互通业务的主力军。
2、二者的区别。
1、工作层次不一样
a--交换机工作在第二层,数据链路层
b--路由器工作在第三层,网络层。
2、子网划分
a--交换机识别MAC地址
b--路由器识别IP地址
3、回路
4、负载集中
5、广播控制
6、介质相关
7、保密问题
30.Linux是通过什么组件来实现支持多文件系统的?
虚拟文件系统(VFS),是linux中的一个软件层,勇于给用户空间的程序提供软件接口;同时他也提供了一个内核中的抽象功能,允许不同的文件系统共存。
系统中所有文件系统不但依赖于VFS共存,而且也依赖于VFS协同工作。
31.对文件或设备的操作函数保存在哪个结构体中?
Structfile_operations;
32.如何加载和卸载一个模块?
Insmodrmmod
33.两个数交换的几种方法?
?
不引入第三个参数
用宏定义写出来一个交换
#defineswap(a,b){a=a+b;b=a-b;a=a-b;}
34.float如何保留小数点后两位?
35.#define和typedef的区别?
在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间。
typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。
#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题。
宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。
所以typedef更好点。
36.find和grep的区别?
?
find是搜索文件名,查找匹配条件的文件,输出匹配文件。
grep是搜索文件内容,查找匹配条件的文件行,输出匹配行或含有匹配内容的文件。
例如:
linux如何在文本文件中搜索字符串
find“需要查找的内容”所在的文件
37.用C语言实现相应的函数功能,strlen,strcat,strcpy,strcmp?
38.声明和定义变量的区别?
定义和声明,变量定义后,存储器需要为其分配一定的存储空间,一个变量在其作用域范围内只能定义一次。
声明则不同,一个变量可以多次声明,且存储器不会为其分配存储空间。
39.编写一个时钟程序?
#include
#include
structclock{
charhour;
charminute;
charsecond;
};
voidstep(structclock*pclock)
{
pclock->second++;
if(60==pclock->second){
pclock->second=0;
pclock->minute++;
}
if(60==pclock->minute){
pclock->minute=0;
pclock->hour++;
}
if(24==pclock->hour){
pclock->hour=0;
}
}
voiddisplay(charh,charm,chars)
{
printf("\r%02d:
%02d:
%02d",h,m,s);
fflush(stdout);
}
intmain()
{
structclockclk={0,0,0};
display(clk.hour,clk.minute,clk.second);
while
(1){
sleep
(1);
step(&clk);
display(clk.hour,clk.minute,clk.second);
}
return0;
}
40.思考以下程序的输出结果?
intmain()
{
inta=1;
unsignedintb=-6;
if(a+b>0)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return0;
}
41.程序的内存分配(内存)
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap)— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回 收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
程序结束后由系统释放。
4、文字常量区 —常量字符串就是放在这里的。
程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
42.do……while和while……do有什么区别?
前一个循环一遍再判断,后一个判断以后再循环。
43.全局变量、局部变量、静态全局变量、静态局部变量在内存中如何存储?
1.全局变量具有全局作用域。
全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
2.局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
3.静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
4.静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。
这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
44.怎么判断链表中是否有环?
用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;当p2指针追上p1的时候,就表明链表当中有环路了。
45.简单描述下linux的用户空间和内核空间?
Linux简化了分段机制,使得虚拟地址(逻辑地址)与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G(2^32)。
Linux内核将这4G字节的空间分为两部分。
将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。
所以每一个进程的3-4G的虚拟空间都是相同的。
而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间“。
因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。
于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
Linux操作系统和驱动程序(模块)运行在内核空间,应用程序运行在用户空间。
46.守护进程的创建?
?
step 1.创建子进程,父进程退出
step 2.在子进程中创建新会话
step 3.改变当前目录为根目录
step 4.重设文件权限掩码
step 5.关闭文件描述符
47.linux调度程序是根据进程动态优先级还是静态优先级来调度来调度进程的?
Linux是根据程序的动态优先级来调度进程的,但动态优先级又是根据静态优先级的算法得到的,两者是相关连的值。
因为高优先级总是比低优先级的进程先被调度,为防止有多个优先级且一直占用CPU资源,导致其他进程不能占用CPU,所以引用动态优先级概念。
48.linux的模块程序能否使用可链接的库?
不能,驱动所用头文件均来自内核源代码,应用程序所用头文件来自库函数。
49.栈和队列的异同点?
?
队列(Queue):
是限定只能在表的一端进行插入和在另一端进行删除操作的线性表;
栈(Stack):
是限定只能在表的一端进行插入和删除操作的线性表。
栈与队列的相同点:
1.都是线性结构。
2.插入操作都是限定在表尾进行。
3.都可以通过顺序结构和链式结构实现。
4.插入与删除的时间复杂度都是O
(1),在空间复杂度上两者也一样。
不同点:
队列先进先出,栈是先进后出
队列:
只能在表的一端进行插入,并在表的另一端进行删除;栈:
只能在表的一端插入和删除。
//遍历数据速度不同。
栈只能从头部取数据,也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性。
队列则不同,它基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多。
(你的遍历目的是什么,如果只是单纯的打印,不用额外内存,直接输出就行,如果是取出所有数,那么可能会有你说的情况)
50.什么是平衡二叉数?
左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。
51.堆栈的溢出一般是什么原因?
1、申请的资源没有释放
2、层次太深的递归调用
3、分配了过大的局部变量
52.描述分配内存方式和他们的区别?
1)从静态存储区域分配。
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
例如全局变量,static变量。
2)在栈上创建。
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集。
3)从堆上分配,亦称动态内存分配。
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。
53.extern有什么作用?
extern标识的变量或者函数声明其定义在别的文件中,提示编译器遇到此变量和函数时在其它模块中寻找其定义。
引用定义过的头文件,可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
54.a++,++a在”=”左侧可以吗?
Linux中都是错的(++a)(a++)都不能是左值
55.switch()中不允许的数据类型是?
实型
56.C语言取余只能是什么类型?
整型
如果是负数呢?
先取绝对值求余,再按照被除数的符号,如(-10)%3等于-1,10%(-3)等于1
57.TCP和UDP的区别?
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。
也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
58.TCP的四次挥手,断开连接?
第一次挥手:
主机1(可以是客户端,也可以是服务器端),设置SequenceNumber和AcknowledgmentNumber,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次挥手:
主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,AcknowledgmentNumber为SequenceNumber加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次挥手:
主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次挥手:
主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
//为什么要四次挥手呢?
那四次分手又是为何呢?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。
TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
59.任意给出一个C的基本数据类型,如何编码判断这个数据类型是有符号还是无符号的?
60.具体解释下以下结构体的含义?
typedefstruct
{
inta:
2;
intb:
2;
intc:
1;
}test;
testt;
t.a=1;
t.b=3;
t.c=1;
Printf(“%d\n”,sizeof(t));t=4
知道结构体大小的计算。
#include
structstu
{
inta;
charb;
chard;
chare;//占一个字节
intc;
charf;
}stu1;
intmain(intargc,constchar*argv[])
{
printf("%d\n",sizeof(stu1));
return0;
}//$./a.out$16
61.具体解释下一维数组的首地址?
a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。
62.定义一个floata=3.14是否能用if(3.14==a)判断?
?
不能
#include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 试题