嵌入式面试总结:

嵌入式面试题

项目:

项目用了哪儿些功能:

首先使用的是STM32f429BIT,flash 2048Kbytes,内存RAM 256Kbytes,168个引脚。

1、定时器:

定时器可以是16/32位的自动重载计数器,一共有14个定时器。主要用定时器的比较功能触发中断(比较定时器的计数值与预设的比较值)、生成PWM波。
比较定时器:主要用于生成特定的输出波形(如PWM波形)或在达到特定计数值时触发中断/DMA请求。通过比较定时器的计数值与预设的比较值,当两者相等时,可以触发相应的动作。
捕获定时器:主要用于测量外部信号的脉宽、频率或检测信号的边沿变化。当外部信号(如按键输入、脉冲信号等)的边沿(上升沿或下降沿)触发时,定时器会捕获当前的计数值,并将其存储在特定的寄存器中,以便后续处理。

2、看门狗:

有两个看门狗,一个独立看门狗和窗口看门狗,都用于检测和解决由于软件故障而导致的故障,并在计数器达到给定超时值时触发系统复位或中断(仅限窗口看门狗)。主要区别在于其提供的时钟不一样。
独立看门狗 (IWDG) :由其自己的专用低速时钟 (LSI) 提供时钟,因此即使主时钟出现故障也能保持活动状态。 适合需要看门狗作为主应用程序之外完全独立的进程运行,但时序精度限制较低的应用程序。
窗口看门狗 (WWDG) :时钟根据 APB1 时钟进行预分频,并具有可配置的时间窗口,可对其进行编程以检测异常迟到或过早的应用程序行为。适合需要看门狗在准确的时序窗口内做出反应的应用。

3、ADC:

12 位 ADC 是逐次逼近型模数转换器。可配置12位、10位、8位或6位分辨率。有24个ADC,每个ADC有16个输入通道;

4、DAC:

DAC 模块是一个 12 位、电压输出数模转换器。 可配置为 8 位或 12 位模式。有两个DAC,每个DAC有两个输出通道。

5、SPI:

串行外设接口,是一种高速的,全双工,同步的通信总线。
SPI使用4条线:SCK(时钟线)、MISO(主机输入/从机输出数据线)、MOSI(主机输出/从机输入数据线)和CS(片选信号)。
主要应用在 EEPROM,FLASH。
有四种不同的数据传输时序,取决于时钟极性(CPOL)和时钟相位(CPHA)的组合。
CPOL:表示时钟空闲的时候,电平的值为低电平0还是高电平1.
CPHA:表示数据采集是第几个边沿,0代表第一个边沿,1代表第二个边沿。
在这里插入图片描述

6、IIC:

串行通信总线标准,半双工,同步的通信总线。
一种多主从结构的总线,由SDA和SCL两条线组成,都为开漏(OD) 结构,通过外接上拉电阻实现总线上所有节点SDA、SCL信号的线与逻辑关系;
标准模式–100kbps,快速模式–400kbps,高速模式–3.4Mbps。
一般时序图:
在这里插入图片描述开始信号: SCL为高时,SDA从高到低的跳变产生开始信号
结束信号 : SCL为高时,SDA从低到高的跳变产生结束信号
数据传输:数据读取动作都在 SCL为高 时产生,SCL为低时是数据改变的时期。

7、IIS:

是一种串行音频数据接口标准,用于连接数字音频设备。主要用于处理器与外部音频组件之间传输未压缩的数字音频数据。同步通信。
支持双声道音频数据的传输(可以同时传输左声道和右声道的数据)。通常使用PCM(脉冲编码调制–模拟信号转换成数字信号的方法)格式来传输音频数据。通常有一个主设备和一个从设备或者多个从设备
IIS时序图:
在这里插入图片描述
BCLK(位时钟线):确定数据传输速率与时序。SCK的频率=2采样频率位宽。
LRCK(左/右声道线):也称为帧同步信号。指示当前传输的是左声道数据还是右声道数据。LRCK的频率=采样频率
SD(数据线):TX:SDOUT RX:SDIN

8、串口:

异步通信,全双工通讯接口。每一个串口数据包括以下几个部分:
1、起始位:通常为一个逻辑0。
2、数据位:最低位先发送。
3、校验位:是一个可选择的数据位。
4、停止位:通常为逻辑1。
通讯协议如下图所示:
在这里插入图片描述
LSB:最低有效位;MSB:最高有效位
常见的串口接口标准:RS-232、RS-485;其中,RS-232产用于计算机与外部设备通信的标准串口协议,传输距离短;RS-485在RS-232上增加一点多设备通信功能,支持多设备连接。
串口的通讯速率一般由比特率(单位时间内传输的二进制位)来衡量的。

9、GPIO:

开漏输出:当输出高电平时,与电源是断开状态(高阻抗–即不是高电平也不是低电平状态);输出低电平时,与底线连接;故需要输出高电平时,需要外接一个上拉电阻。开路输出模式不能输出高电平。
推挽输出:可以输出高电平或低电平。适用于大多数需要直接驱动负载的场景,驱动能力强。
复用开漏输出:GPIO引脚被配置为执行特定的外设功能,但是使用开漏输出。如硬件IIC。
复用推挽输出:GPIO引脚被配置为执行特定的外设功能,但是使用推挽输出。如SPI。
上拉输入:内部连接了一个上拉电阻,使得引脚在无输入信号时保持高电平
下拉输入:内部连接了一个下拉电阻,使得引脚在无输入信号时保持低电平
浮空输入:PIO引脚既不连接上拉电阻也不连接下拉电阻,其电平状态完全由外部输入决定
模拟输入:GPIO引脚被配置为读取模拟信号,输入控制模块和输出模块将关闭,允许单片机读取外部模拟信号的电平值。如ADC、DAC

11、emwin用的什么协助开发的

emwinView

12、PID:

P:表示比例。起主要控制作用,使反馈量向目标值靠拢,但可能导致振荡。响应过慢,增大kp;快速震荡,减少kp。当只有比例调节时,存在稳态误差(系统进入稳态之后,预期值与输出值之间的误差),因为比例控制只是根据当前的误差来调节控制量,而没有考虑过去的误差(积分)。
I:表示积分。控制稳定时间和稳态误差,,但会增加超调量(系统在达到稳定状态之前或之后 ,输出变量会超过最终的稳态值)。稳定周期长,增大ki;曲线回复慢,减少ki。
D:表示微分。kd增大,提高稳定性,产生阻尼效果,抑制振荡和超调,但会降低响应速度。kd过大,会引起震荡。
基于偏差(实际值与设定值之差)来计算的。
调参顺序:先P(比例)再I(积分)最后D(微分)。
PID根据目标值和实际值之间的误差计算输出值,目标值和实际值通常为同一物理量,输出值通常是直接驱动被控对象的控制量。如目标值:需要电机达到的转速;实际值:电机的实时转速;输出值:电机中流过的电流大小。
在这里插入图片描述
数字PID控制算法分为增量式PID控制算法和位置式PID控制算法。
位置式PID控制算法:在这里插入图片描述
e(k)为本次误差, ∑e(i) 为误差的累计,e(k-1)为上一次误差。位置式PID控制算法是当前系统的实际位置,与当前想要达到的预期位置的偏差,无积分效果。也就是说输出值只与当前的输入信号有关,不受过去信号累计值的影响。
增量式PID控制算法:
在这里插入图片描述
▲u(k)的确定至于最近3次的采样值有关,有积分作用。

13、PWM:

PWM(pulse width modulation)脉宽调制,是微处理器的数字输出对模拟电路的进行控制的一种有效手段。
PWM的频率:1秒中内有多少个PWM周期
PWM的占空比:一个周期内,高电平占一个周期的比例

14、PCM:

PCM(pulse code modulation)脉冲编码调制,是一种数字音频编码技术。将模拟语音信号转换成数字语音信号,通道信道进行传输。包括三个过程:“抽样、量化、编码”。
抽样:对模拟信号进行周期性的扫描,将连续的信号变成离散的信号。常见的抽样速率为8Kbit/s。
量化:把抽样得到的瞬时值用最接近的电平值来表示。
编码:用一组二进制码组来表示每一个固定电平的量化值,量化实际上是在编码过程中同时进行的。
PCM是对音质进行无损耗编码,因此具有音质好、体积大的特点,占用内存空间较大。

15、开关电源:

直流开关电源:将质量较差的原生态电源转换成满足设备质量较高的直流电源
交流开关电源:将交流电压转换成所需的交流电压或电流

16、DMA:

DMA(direct memory access),直接存储器存储。DMA传输将数据从一个地址空间复制到另一个地址空间,提供外设与存储器之间、存储器与存储器之间的高速数据传输,无需CPU的干预。
有两个DMA控制器,每一个控制器有8个缓冲区,每一个缓冲区有8个通道,每一个通道都有一个仲裁器,用于设置DMA请求的优先级。
DMA传输参数:源地址、目标地址、传输数据量、进行多少次传输的传输模式

八股文

1、do while()和while之间的区别:

主要区别在于是否至少循环一次循环体。do while()是先执行do()循环体,再进行while()的判断语句,故至少会循环一次循环体;而while()则是直接判断条件,满足则循环一次循环体,不满意则跳出循环。

2、全局变量与局部变量的区别:

全局变量:在函数外部定义的变量,其作用域是整个程序,即所有的源文件。存储空间在堆。全局变量的生命期和主程序一样,随程序的销毁而销毁。它们在程序启动时分配内存,在程序结束时释放内存。
局部变量:在函数体内部定义的变量,其作用域仅限于函数体内部。存储空间在栈。程序运行到该函数或语句块时给该变量分配内存空间,函数或语句块结束则释放该内存空间。
在C语言等面向过程语言中,局部变量可以与全局变量同名。然而,当在函数内部引用这个变量时,会优先使用同名的局部变量,而不会使用全局变量,这被称为局部变量的“屏蔽”作用。如果需要在函数内部修改全局变量的值,并且局部变量与之同名,那么需要使用global关键字(在某些编程语言中,如Python)来明确指出是修改全局变量。

3、STM32的启动过程:

通过BOOST引脚设定,决定启动模式,寻找初试地址;
获取向量表的第一个位置0x00000000,初始化栈顶指针,__initial_sp;
获取向量表的第二个位置0x00000004,指向复位程序,Reset_Handler;
设置异常中断,HardFault_Handler;
设置系统时钟,SystemInit;
调用C库函数,_main
主函数

4、数组与指针的区别:

指针: 存储的是另一个变量的内存地址,占用固定大小的内存,经常与动态内存分配一起使用
数组:数组是一种数据结构,用于存储固定数量的同类型元素的连续内存块。在编译时分配内存空间,其大小在声明时确定且固定不变

5、为什么IIC的SCL和SDA使用开漏输出+上拉电阻,并且存在线与逻辑:

1、加上拉电阻是因为,引脚配置的是开漏输出,无法输出高电平,故需要加一个上拉电阻
2、为什么要使用开漏输出,而不是用推挽输出。是因为IIC可以挂载多个设备,如果出现一个设备输出高电平,一个设备输出低电平,则会短路。
3、IIC设备支持多个主设备和多个从设备连接在同一根总线上,如果多个从设备同时占用总线,那么如何判断谁使用总线,IIC通过“线与”逻辑来判断仲裁。当SCL为高时,检查SDA的电平,如果SDA电平为高,说明其他从设备SDA都为高,那么主设备可以占用总线,主设备A将SDA拉低,完成启动条件,开始传输;如果SDA为低,说明存在其他设备已经传输,总线被占用,主设备A退出。所以仲裁时,哪儿个设备最早将SDA拉低,谁就占有了优先权。

6、c语言的全局变量没有赋初值和赋初值之间的区别,自动赋初值是如何实现的:

1、在C语言中,全局变量可以分为两种:一种是初始化的全局变量,还有一种是未初始化的全局变量。初始化的全局变量存储在数据段中,未初始化的全局变量存储在BBS段中。
数据段:用于存储编译时已经初始化的全局变量和静态变量
BBS段:用于存储未初始化的全局变量和静态变量
在程序加载时,操作系统会将数据段的值加载到内存中,将BBS段的值初始化为0。
初始化的全局变量在编译时就已经赋予了特定的值,存储在编译后的二进制文件中;程序加载时,操作系统会将这些初始化的值存储到内存中的数据段中。
未被初始化的值在编译时没有赋初值,这些变量存储在BBS段中,程序加载时,这些值会被操作系统赋值为0。
2、C语言的全局变量赋初值,是在编译器的编译阶段和链接器的链接阶段共同实现的。全局变量在程序启动前存储在数据段或BBS段,这些段在程序加载到内存时会赋初值0。

7、IIC、串口哪儿个通讯更高效:

串口抗干扰性差,故传输距离较短。
在这里插入图片描述
1-wire:
引脚:DQ–发送/接收端 异步通信,半双工。

8、编译过程有哪儿些,其中链接这个过程的作用是什么,怎么链接的:

1、编译器的作用:
在处理全局变量时,首先将初始化和未初始化的全局变量存储在数据段和BBS段中。编译器会生成相应的符号表,符号表中包含变量的名称、类型、存储地址等信息。
2、链接器的作用:
在处理编译后的多个目标文件(工程中有几个源文件,就会编译生成几个目标文件),将这些目标文件的数据段和BBS段结合在一起,还会更新符号表(符号表是在编译过程出现的一种数据结构,用于存放变量名、函数名、类型名)中的地址,确保每一个全局变量在内存中的地址是唯一且正确的。

9、中断是怎么运作的,用了哪儿些寄存器:(后续更新)

中断:当CPU在处理事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前事件A的处理(中断响应),转去处理事件B(中断服务);等待CPU处理完时间B之后,再回到事件A被中断的地方(中断返回)继续执行。

10、时序电路和组合电路的区别:

时序电路是一种根据时钟信号进行同步操作的数字电路,其行为不仅取决于输入状态,还取决于电路原来的状态和时钟的脉冲。与组合电路最本质的区别就在于其具有记忆功能(具有存储器件)。
组合电路是具有一组输入和一组输出的非记忆逻辑电路,其输出状态只与当前输入信号有关,与电路过去状态无关。

11、线程、进程哪儿个占用内存多:

进程占用的内存更多。
线程是进程的一个执行单元,是CPU调度的基本单位。线程共享进程的内存,包括代码段、数据段和堆栈。
进程是操作系统进行资源分配的最小单位。而进程拥有独立的内存空间、文件描述符、信号处理等资源,故占用的内存多并且不会影响其他进程。

12、目标文件为什么是bin、hex文件,为什么是二进制和十六进制:

由于二进制是计算机存储和处理的基础,所以目标文件是二进制文件,同时十六进制转换成二进制也非常的方便,一位十六进制转换成四位二进制。
bin文件:二进制,只包含数据本身,因此文件相对较小。烧写时,需要用户指定下载地址
hex文件:十六进制,不仅包含数据还包含地址、类型、校验等标记信息。使得hex烧录时自动定位到正确的存储地址;数据校验信息,还有利于传输的可靠性。

13、硬件IIC和软件IIC的区别:

硬件IIC:传输速率高、占用CPU资源少、稳定性高(受外部影响小)。
软件IIC:灵活性高(可使用任意GPIO口来模拟IIC)、可移植性强(不依赖硬件电路)、速度较慢、占用CPU资源多、稳定性较差。

14、低通滤波器:

滤过高于截止频率的信号分量,只输出低于该频率的信号分量,实现对信号的滤波和调节。(高通滤波器反之亦然)

15、想要去除50HZ的信号,应该使用什么滤波器:

带阻滤波器或者是数字滤波器。
带阻滤波器:也称陷波滤波器,允许大多数频率的信号通过,但会阻止或衰减特定频率范围内的信号。如该问题,可以设计为中心频率为50HZ的带阻滤波器。
数字滤波器:FIR滤波器(finite impulse response有限冲激响应–输出只限于有限数量的过去输入)和IIR滤波器(infinite impulse response无线冲激响应–输出不仅取决于过去和现在的输入,还取决于过去的输出值)

16、 CAN总线:

CAN(controller area network控制器局域网):
多主控总线系统,串行通信,。具有高速传播、多设备连接、抗干扰性强、可靠性高、具有多种类型的网络拓扑结构。
高速传播:常用波特率为125kps,250kps,500kps,最高可达1Mkps。
多设备连接:可挂载多个设备
抗干扰性强:采用差分信号通信,即两根信号线(CAN_H、CAN_L)之间的电平差来传输数据位。逻辑0和逻辑1是两条差分信号线之间的电压差来决定的。逻辑0,CAN_H和CAN_L的电压差大于0.9,为显性电平;逻辑1,CAN_H和CAN_L的电压差小于0.5,为隐形电平。大大的增强了抗干扰能力。
可靠性高:具有应答、CRC校验、未填充等特性。
具有多种网络拓扑结构:如总线型、星型、环形等。

17、TCP和UDP是哪儿层协议,区别在哪儿里。IP是哪儿层协议:

TCP和UDP是传输层协议,TCP是面向连接,可靠的数据传输协议,数据传输的单位是报文段;UDP是无连接协议,不可靠的数据传输协议,数据传输的是用户数据段。
IP 是网络层协议。
HTTP、FTP、SMTP、MQTT是应用层协议。

18、STM32的开发流程:

19、指针数组和数组指针的区别:

20、IIC和SPI的区别,传输一个字节的区别,SPI的时序:

21、头文件和extern的区别:

头文件:引入整个文件的内容。
extern:声明全局变量或函数的外部链接。

22、static 为什么可以static:

static:用来控制变量的存储空间和作用范围。作用对象为全局变量、局部变量、函数。
在这里插入图片描述
1、static修饰局部变量:
变量只初始化一次值,之后调用函数时保存其状态。
会改变变量的存储位置,并且使生命周期延长。
2、static变量没有初始化,默认初始化为0。
static修饰的变量存放在静态区,在静态区中的变量,未初始化的默认为0(全局变量也放在静态区,其他变量未初始化会出现随机值的现象)。
3、static修饰全局变量和函数时,只能在内部链接(意思就是用extern修饰也没有办法在其他文件中使用)。并且对其他文件进行隐藏,避免了命名冲突(static修饰函数的作用)。

23、引用外部变量可以用哪儿种方式,为什么在.h文件中初始化变量会很危险。

a、在源文件中定义变量。
在头文件中用extern声明该变量。
在需要使用该变量的源文件中包含该头文件。
b、因为会导致每个包含该头文件的源文件都有该变量的一个副本,即多重定义问题。这会导致链接错误,因为编译器和链接器无法处理多个同名的全局变量定义。

24、中断控制器:

25、在大多数Linux发行版本中,以下哪儿个属于块设备(block devices):

A.串行口 B.硬盘 C.虚拟终端 D.打印机
解:
B.硬盘属于块设备,因为它以块的方式进行处理数据
A.C.D.都属于是字符流设备,以字符串进行数据传输。

26、以下为Linux下的32位C程序,计算sizeof§的值:

char str[]=“Hello”;
char *p=str;
解:
sizeof(str)为6,返回数组占用的字节数以及结尾的空字符\0;区别于strlen(str)为5,返回数据的长度,不包含结尾的空字符。
sizeof(str)为4,返回指针p本身所占用的字节数,而不是它指向的数据或字符串。指针的大小是固定的,通常为4字节(32位系统)或8字节(64位系统)

27、Linux的一些命令:

mkdir:新建一个目录(文件夹)
touch:创建一个空文件或更新时间戳。当指定的文件不存在时,touch会创建一个空文件;当指定文件存在时,touch会更新访问该文件的时间戳。
cp:用于复制文件或目录。
pwd:打印当前目录下的完整路径。

28、printf和fprintf的区别:

printf:将数据输出到输出设备,如控制台或终端窗口。
fprintf:将数据输出到一个指定的文件流中。

29、嵌入式系统中,用来保存固件或引导加载程序的是哪儿种存储器:

ROM(read-only memory),非易失性存储器,设备断电,存储在其中的数据也不会丢失。如EEPROM、flash。一般使用flash来保存固件或引导加载程序,容量相对于EEPROM较大。

30、RAM和ROM的区别:

ROM(read-only memory):只读存储器,非易失性存储器,存储单元由晶体管和二极管组成。主要用于存储固化的程序代码。
RAM(random-access memory):随机存取存储器,是易失性存储器,主要由电容器组成,通过电容的存储和释放完成数据的读写。主要用于存储计算机当前正在运行的程序和数据。

31、HDD是什么:

硬盘驱动器

32、什么电路抗干扰性强,什么电路能够在大电流高电压下工作(模拟电路or数字电路):

1、数字电路抗干扰性强。由于数字电路是离散的,只有高低电平两种状态,因此放信号收到干扰时,干扰幅度不超过阈值,一般是数字信号的状态不会变化。而模拟信号是连续的信号,微小的变化都可能使模拟信号发生变化。
2、模拟电路能过在大电流高电压下工作。数字电路更偏向于在低功耗、小电流、低电压下工作。

33、电容:

容抗计算公式为1/2πfc(f为交流电的频率)。
电容两端的电流不会突变,因为电容充放电需要时间,所以电流不能瞬间改变,故在电路中可以起到平滑电流、滤波的作用。
交流电路中,电容的电压领先电流90度。开始充电时,电流流入电容,电压还没建立起来;当电流达到最大值时,电压才开始上升。以此类推。

34、对象对象语言有哪儿些:

python、C#、C++、php

35、不能做switch()的参数类型是:

有浮点数(float和double)和长整型(long long),因为在C语言中,switch()语句的参数必须是整型(int、short、char)或枚举类型。
由于浮点数类型和长整型类型在内存中所占用的字节数较多,导致switch()效率较低。

36、Linux在某目录下查找某字符串通常可以使用什么命令:

grep

37、IO接口一般具有三态,分别为哪儿三态:

低电平、高电平、高阻态(不为高电平也不为低电平)。

38、在Linux文件I/O操作时,当调用open函数打开一个现有文件或创建一个新文件时,内核会向该进程返回什么:

文件描述符

39、野指针是什么?产生的原因?

1、野指针:指向不可知内存地址的指针。
2、原因:
指针未初始化。
释放内存后未置空。
指针越界访问。
使用已经释放的栈内存。

40、const的作用:

声明一个值不能被修改的常量。

41、静态重定位和动态重定位的区别:

静态重定位:指程序装入内存的过程中完成地址转换,即在程序运行前完成。
动态重定位:在程序运行中,需要访问数据时完成逻辑地址与物理地址的转换。

42、判断以下表达式是否合法:X+1=X+1

X+1=X+1:不合法,赋值运算符左侧不能是表达式。

43、C语言中,运算对象必须是整型的运算符是:

%=

44、每像素最少可以用多少bit来编码黑白照片:

1bit。在二进制中,1bit可以代表0和1两种状态,刚好可以对应黑和白两种颜色。

45、未定义存储类别的变量,隐含的存储类别为哪儿一个:

auto。这是默认的存储类别,用于函数内部的局部变量。当函数被调用时,这些变量在栈上分配内存,函数返回时自动销毁。

46、calloc、malloc、realloc的区别:

都是动态内存分配函数。
calloc:在内存的动态存储区中分配一块连续的内存空间,并自动将这块内存空间初始化为0,执行速度较慢。calloc有两个参数,第一个参数为需要分配的元素个数;第二个参数为分配的内存大小。
malloc:在内存的动态存储区中分配一块连续的内存空间,没有进行初始化,执行速度较快,因此需要手动初始化。malloc有一个参数,即需要分配的内存空间大小。
realloc:用于重新分配内存空间。void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。

47、中断上下文:

中断上下文是CPU响应硬件中断时所处的执行环境。
中断上下文中,CPU处于内核态,因此不允许访问用户内存(用户态);不允许睡眠操作(如IO操作),因为中断处理程序应尽快进行,以便CPU返回被中断的用户态程序继续执行。

48、int、unsigned int是多少字节:

无论是32位还是64位系统,int、unsigned int都是4个字节。

49、HashMap运行NULL键或值吗:

HashMap允许一个NULL键,因为键是唯一的,因此NULL作为唯一键;允许多个NULL值,值可以重复。

50、linux编译的动态库以.so结尾吗:

对。动态链接库以.so(shared object)为文件扩展名,意味着在运行时可以被多个文件共享。
动态库(.so)和静态库(.a)的区别在于:动态库在运行时加载,静态库在编译时链接到库。

51、怎么取地址0x00081320 :

高级语言中,直接对内存地址是不允许的,因此可以采取以下操作:
int *p;
p=(int *)0x00081320; // 将0x00081320强制转换成整型地址,用p指向它。
p=1234; //向该地址写数据
printf(“%d\n”,(int *)0x00081320); //输出该地址的数据

52、等效电路的基本原理:

基尔霍夫定理、戴维南定理、诺顿定理

53、假设有一个四字节的整数0x12345678,在小端系统和大端系统中怎么存储:

小端系统:地址0x00,存储0x78;地址0x01,存储0x56;地址0x02,存储0x34;地址0x03,存储0x12。
大端系统:地址0x00,存储0x12;地址0x01,存储0x34;地址0x02,存储0x56;地址0x03,存储0x78。

54、C语言中,结构体可以相加、比较吗:

结构体不能进行加减乘除,但可以相互赋值;如果结构体变量相同,可以进行比较。

55、动态分配地址:

int *p=(int )malloc(10sizeof(int));

56、数据结构和内存管理中堆和栈的区别:

数据结构:堆是一种特殊的二叉树,分为大顶堆和小顶堆;栈是一种线性结构,具有先进后出的特点,元素的操作都是在栈顶完成。
内存管理:堆的分配和释放是由程序员手动控制,生命周期很长,生命周期由程序员手动释放或程序结束操作系统释放。栈的分配和释放是由操作系统控制,生命周期与作用域相关,离开作用域,变量就会释放。

57、使用vmalloc可以申请非连续的物理内存页,并将这些非连续的空间组成虚拟连续内存空间?

58、排序方法中,关键码比较次数与记录的初始排列无关的是:

直接插入排序、归并排序

59、以下代码打印的结果为

struct st_t
{
int status;
short *pdata;
char errstr[32];
};
st_t st[16];
char *p=(char *)(st[2].errstr+32);
printf(“%d”,(p-(char *)(st));
解:首先对结构体进行对齐操作,对齐规则:结构体的大小一定要为有效对齐值的整数倍;一般以结构体最长的成员进行对齐。故sizeof(st)=4+4+32=40,p=st[3],(p-(char )(st)=&st[3]-&st[0]=340=120

60、递归是怎么实现的:

递归:直接或间接的调用自身。将一个问题分解为一个个的小问题,并且一定存在递归结束条件。

61、软件工程设计流程:

可行性分析;需求分析:任务分解、成本估算、进度估算;概要设计:总体设计、数据结构、数据库设计、设计概要文档;项目执行控制:结构化设计、面向对象设计;编码;测试;维护。

62、冯诺依曼结构与哈佛结构的区别:

冯诺依曼结构:指令和数据是存储在一起的;使用单一总线,传输指令和数据,故效率较低;
哈佛结构:指令和数据是分开存储的;使用两条总线,传输指令和数据,并行能力更好,效率高;
63、同一进程下的线程共享什么:
可以共享数据段、进程用户ID和进程组ID;不可以共享线程ID、寄存器组的值、线程的堆栈。

64、银行家算法是用来检测死锁的嘛:

错,是用来避免死锁的。

65、int、float、double分别怎么判断是否为0:

int:int a=0;if(a==0)
float: float a=0;if(fabs(a)<1e-6)
double:double a=0;if(fabs(a)<1e-15)

66、C语言的存储区,const修饰的变量存储在哪儿一个区:

在这里插入图片描述
const修饰的全局变量存储在常量区。

67、设计电路,将1000HZ的方波转换成1000HZ的正弦波;将1000HZ的正弦波转换成1000HZ的方波:

将1000HZ的方波转换成1000HZ的正弦波:低通滤波器,RC滤波器,其截止频率的计算公式为F(cutoff)=1/(2πRC)。
将1000HZ的正弦波转换成1000HZ的方波:通过比较器,输入信号电压是否超过某一阈值(通常是零电压)并输出相应高电平或低电平信号的电路。

开放题

有一个U32的变量X,怎么判断其是否为2的幂次方,找出最优解:

如果一个数N是2的幂次方,则其补码一定只有一个1,则N&(N-1)==0

一个数组未排序,找出数组中出现次数超过数组长度一半的数字:

1、使用map:
假设一个数组arr[],利用map的key-value来存放数组arr[i]和对应在数组中出现的次数,最后用次数去跟数组长度的一半去比较,大于则就是。
2、排序求中间值:
出现的次数超过长度的一般,说明排序后一定在最中间的位置。排序之后,接下来统计与arr[mid]的值相等的元素,相等就count++,如果count>mid,则输出arr[mid]。

有六个人,排成两队,从低到高进行排序,其中第二排的人要比前面第一排的人要高,求有几种排法:

等价与由3个0和3个1组成一个6位的二进制数,要求从左到右扫描,使得任意位置0的累计数不小于1的累计数,求满足条件的组合数;3个元素进出栈,有多少种不同的出栈顺序。
卡特兰数:h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…+h(n-1)*h(0);
故h(3)=5。(h(6)=132)

两根绳子,燃烧不均匀,长度也不一样,每一根绳子从一端开始燃烧都为60min。问现在有一个打火机和这两根绳,如何计时45min。

(没有时间整理了,自行查阅,其他类似。)

10棵树栽5行每行4颗怎么种

深度学习:

sigmod函数有什么优点和缺点:

算法题:

1、将一个整形数组进行转置,要求其空间复杂度为 0(不能使用临时变量):

互相加或者是异或

2、给定一个长度为n的整数组,用算法实现只遍历一次数组,打印其中未重复的数。(不能使用高级语言哈希表):

3、实现<key,value>存储程序,向外提供增删改查接口功能,用c实现:

4、开启3个线程,3个线程的ID为A,B,C,每个线程ID打印在屏幕上10遍,要求输出结果必须按ABC的顺序显示,如ABCABC… 用c语言实现

5、计算第一个非0bit的位置,从第一个bit0到bit7的一个参数中。如bit0为1,函数返回结果1,如果是其他bit,则返回其他bit的位置。如果bit0不是非0比特,则返回0,用c实现

int first_nonzero_bit(unsigned char byte) {
    // Iterate over each bit from bit0 to bit7
    for (int i = 0; i < 8; i++) {
        // Check if the current bit is set (non-zero)
        if (byte & (1 << i)) {
            return i + 1; // Return the bit position (1-based)
        }
    }
    return 0; // Return 0 if all bits are zero
}

6、一个unsigned long 的变量val,现有4个bytes使用大端存储,怎么使用c语言改成小端存储

void swap_endian_32(unsigned long *val) {
    unsigned long *bytes = (unsigned char *)val;
    unsigned long temp;
 
    // 交换字节顺序
    temp = bytes[0];
    bytes[0] = bytes[3];
    bytes[3] = temp;
 
    temp = bytes[1];
    bytes[1] = bytes[2];
    bytes[2] = temp;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值