嵌入式面试题项目:项目用了哪儿些功能:1、定时器2、看门狗3、ADC4、DAC5、SPI6、IIC7、IIS8、串口9、GPIO11、emwin用的什么协助开发的12、PID13、PWM:14、PCM15、开关电源16、DMA八股文1、do while()和while之间的区别2、全局变量与局部变量的区别3、STM32的启动过程4、数组与指针的区别5、为什么IIC的SCL和SDA使用开漏输出上拉电阻并且存在线与逻辑6、c语言的全局变量没有赋初值和赋初值之间的区别自动赋初值是如何实现的7、IIC、串口哪儿个通讯更高效8、编译过程有哪儿些其中链接这个过程的作用是什么怎么链接的9、中断是怎么运作的用了哪儿些寄存器后续更新10、时序电路和组合电路的区别11、线程、进程哪儿个占用内存多12、目标文件为什么是bin、hex文件为什么是二进制和十六进制13、硬件IIC和软件IIC的区别14、低通滤波器15、想要去除50HZ的信号应该使用什么滤波器16、 CAN总线17、TCP和UDP是哪儿层协议区别在哪儿里。IP是哪儿层协议18、STM32的开发流程19、指针数组和数组指针的区别20、IIC和SPI的区别传输一个字节的区别SPI的时序21、头文件和extern的区别22、static 为什么可以static:23、引用外部变量可以用哪儿种方式为什么在.h文件中初始化变量会很危险。24、中断控制器25、在大多数Linux发行版本中以下哪儿个属于块设备block devices:26、以下为Linux下的32位C程序计算sizeof(p)的值27、Linux的一些命令28、printf和fprintf的区别29、嵌入式系统中用来保存固件或引导加载程序的是哪儿种存储器30、RAM和ROM的区别31、HDD是什么32、什么电路抗干扰性强什么电路能够在大电流高电压下工作模拟电路or数字电路33、电容34、对象对象语言有哪儿些35、不能做switch的参数类型是36、Linux在某目录下查找某字符串通常可以使用什么命令37、IO接口一般具有三态分别为哪儿三态38、在Linux文件I/O操作时当调用open函数打开一个现有文件或创建一个新文件时内核会向该进程返回什么39、野指针是什么产生的原因40、const的作用41、静态重定位和动态重定位的区别:42、判断以下表达式是否合法X1X143、C语言中运算对象必须是整型的运算符是44、每像素最少可以用多少bit来编码黑白照片45、未定义存储类别的变量隐含的存储类别为哪儿一个46、calloc、malloc、realloc的区别47、中断上下文48、int、unsigned int是多少字节49、HashMap运行NULL键或值吗50、linux编译的动态库以.so结尾吗51、怎么取地址0x00081320 52、等效电路的基本原理53、假设有一个四字节的整数0x12345678在小端系统和大端系统中怎么存储54、C语言中结构体可以相加、比较吗55、动态分配地址56、数据结构和内存管理中堆和栈的区别57、使用vmalloc可以申请非连续的物理内存页并将这些非连续的空间组成虚拟连续内存空间58、排序方法中关键码比较次数与记录的初始排列无关的是59、以下代码打印的结果为60、递归是怎么实现的61、软件工程设计流程62、冯诺依曼结构与哈佛结构的区别64、银行家算法是用来检测死锁的嘛65、int、float、double分别怎么判断是否为066、C语言的存储区const修饰的变量存储在哪儿一个区67、设计电路将1000HZ的方波转换成1000HZ的正弦波将1000HZ的正弦波转换成1000HZ的方波68、PID模糊PID和自适应PID了解多少开放题有一个U32的变量X怎么判断其是否为2的幂次方找出最优解:一个数组未排序找出数组中出现次数超过数组长度一半的数字有六个人排成两队从低到高进行排序其中第二排的人要比前面第一排的人要高求有几种排法:两根绳子燃烧不均匀长度也不一样每一根绳子从一端开始燃烧都为60min。问现在有一个打火机和这两根绳如何计时45min。10棵树栽5行每行4颗怎么种深度学习sigmod函数有什么优点和缺点算法题1、将一个整形数组进行转置要求其空间复杂度为 0不能使用临时变量2、给定一个长度为n的整数组用算法实现只遍历一次数组打印其中未重复的数。不能使用高级语言哈希表3、实现keyvalue存储程序向外提供增删改查接口功能用c实现4、开启3个线程3个线程的ID为ABC每个线程ID打印在屏幕上10遍要求输出结果必须按ABC的顺序显示如ABCABC... 用c语言实现5、计算第一个非0bit的位置从第一个bit0到bit7的一个参数中。如bit0为1函数返回结果1如果是其他bit则返回其他bit的位置。如果bit0不是非0比特则返回0用c实现6、一个unsigned long 的变量val现有4个bytes使用大端存储怎么使用c语言改成小端存储项目:项目用了哪儿些功能:首先使用的是STM32f429BITflash 2048Kbytes,内存RAM 256Kbytes,168个引脚。1、定时器定时器可以是16/32位的自动重载计数器一共有14个定时器。主要用定时器的比较功能触发中断比较定时器的计数值与预设的比较值、生成PWM波。比较定时器主要用于生成特定的输出波形如PWM波形或在达到特定计数值时触发中断/DMA请求。通过比较定时器的计数值与预设的比较值当两者相等时可以触发相应的动作。捕获定时器主要用于测量外部信号的脉宽、频率或检测信号的边沿变化。当外部信号如按键输入、脉冲信号等的边沿上升沿或下降沿触发时定时器会捕获当前的计数值并将其存储在特定的寄存器中以便后续处理。2、看门狗有两个看门狗一个独立看门狗和窗口看门狗都用于检测和解决由于软件故障而导致的故障并在计数器达到给定超时值时触发系统复位或中断仅限窗口看门狗。主要区别在于其提供的时钟不一样。独立看门狗 (IWDG) 由其自己的专用低速时钟 (LSI) 提供时钟因此即使主时钟出现故障也能保持活动状态。 适合需要看门狗作为主应用程序之外完全独立的进程运行但时序精度限制较低的应用程序。窗口看门狗 (WWDG) 时钟根据 APB1 时钟进行预分频并具有可配置的时间窗口可对其进行编程以检测异常迟到或过早的应用程序行为。适合需要看门狗在准确的时序窗口内做出反应的应用。3、ADC12 位 ADC 是逐次逼近型模数转换器。可配置12位、10位、8位或6位分辨率。有24个ADC每个ADC有16个输入通道4、DACDAC 模块是一个 12 位、电压输出数模转换器。 可配置为 8 位或 12 位模式。有两个DAC每个DAC有两个输出通道。5、SPI串行外设接口是一种高速的全双工同步的通信总线。只支持一主多从模式。SPI使用4条线SCK(时钟线、MISO主机输入/从机输出数据线、MOSI主机输出/从机输入数据线和CS片选信号。全双工模式可以同时收发数据。主要应用在 EEPROMFLASH。有四种不同的数据传输时序取决于时钟极性CPOL和时钟相位CPHA的组合。CPOL表示时钟空闲的时候电平的值为低电平0还是高电平1.CPHA:表示数据采集是第几个边沿0代表第一个边沿1代表第二个边沿。6、IIC串行通信总线标准半双工同步–共用给一个时钟信号的通信总线。既支持一主多从也支持多主多从。stm32上的硬件IIC长时间使用会不准因此一般考虑使用软件IIC也就是说使用两个GPIO来模拟IIC的信号。硬件配置SCL–配置推挽输出SDA–如果使用推挽输出由于SDA为高电平时存在总线空闲和接收数据为1时两种情况当总线空闲时并且从机给主机发送了数据0则会出现高电平碰上低电平则线路短路。则使用开漏输出弱上拉电阻一种多主从–主机发指令从机响应执行从机不能主动通信结构的总线由SDA和SCL两条线组成都为开漏(OD) 结构通过外接上拉电阻实现总线上所有节点SDA、SCL信号的线与逻辑关系标准模式–100kbps快速模式–400kbps高速模式–3.4Mbps。一般时序图MSB–高位先行开始信号 SCL为高时SDA从高到低的跳变产生开始信号结束信号 SCL为高时SDA从低到高的跳变产生结束信号数据传输数据读取动作都在 SCL为高 时产生SCL为低时是数据改变的时期。需要注意的是指定地址读需要发送两次起始信号。然后最后主机读取到数据之后需要返回一个NACK应答时序图要求。另外读设备的地址一般是最后一位为0时为可写为1时为可读所以读设备地址为0xA1。如下图以EEPROM为例7、IIS是一种串行音频数据接口标准用于连接数字音频设备。主要用于处理器与外部音频组件之间传输未压缩的数字音频数据。同步通信。支持双声道音频数据的传输(可以同时传输左声道和右声道的数据)。通常使用PCM脉冲编码调制–模拟信号转换成数字信号的方法格式来传输音频数据。通常有一个主设备和一个从设备或者多个从设备IIS时序图BCLK位时钟线确定数据传输速率与时序。SCK的频率2采样频率位宽。LRCK左/右声道线也称为帧同步信号。指示当前传输的是左声道数据还是右声道数据。LRCK的频率采样频率SD数据线TXSDOUT RXSDIN8、串口两根都是数据线并且需要保证双方都具有相同的速度波特率异步通信时钟源都是自给自足的异步通信全双工通讯接口。每一个串口数据包括以下几个部分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、DAC11、emwin用的什么协助开发的emwinView12、PIDP表示比例。起主要控制作用使反馈量向目标值靠拢但可能导致振荡。响应过慢增大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:PWMpulse width modulation脉宽调制是微处理器的数字输出对模拟电路的进行控制的一种有效手段。PWM的频率1秒中内有多少个PWM周期PWM的占空比一个周期内高电平占一个周期的比例14、PCMPCMpulse code modulation脉冲编码调制是一种数字音频编码技术。将模拟语音信号转换成数字语音信号通道信道进行传输。包括三个过程“抽样、量化、编码”。抽样对模拟信号进行周期性的扫描将连续的信号变成离散的信号。常见的抽样速率为8Kbit/s。量化把抽样得到的瞬时值用最接近的电平值来表示。编码用一组二进制码组来表示每一个固定电平的量化值量化实际上是在编码过程中同时进行的。PCM是对音质进行无损耗编码因此具有音质好、体积大的特点占用内存空间较大。15、开关电源直流开关电源将质量较差的原生态电源转换成满足设备质量较高的直流电源交流开关电源将交流电压转换成所需的交流电压或电流16、DMADMA(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总线CANcontroller area network控制器局域网多主控总线系统串行通信。具有高速传播、多设备连接、抗干扰性强、可靠性高、具有多种类型的网络拓扑结构。高速传播常用波特率为125kps250kps,500kps,最高可达1Mkps。多设备连接可挂载多个设备抗干扰性强采用差分信号通信即两根信号线CAN_H、CAN_L之间的电平差来传输数据位。逻辑0和逻辑1是两条差分信号线之间的电压差来决定的。逻辑0CAN_H和CAN_L的电压差大于0.9为显性电平逻辑1CAN_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 *pstr;解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的区别ROMread-only memory:只读存储器非易失性存储器存储单元由晶体管和二极管组成。主要用于存储固化的程序代码。RAMrandom-access memory:随机存取存储器是易失性存储器主要由电容器组成通过电容的存储和释放完成数据的读写。主要用于存储计算机当前正在运行的程序和数据。31、HDD是什么硬盘驱动器32、什么电路抗干扰性强什么电路能够在大电流高电压下工作模拟电路or数字电路1、数字电路抗干扰性强。由于数字电路是离散的只有高低电平两种状态因此放信号收到干扰时干扰幅度不超过阈值一般是数字信号的状态不会变化。而模拟信号是连续的信号微小的变化都可能使模拟信号发生变化。2、模拟电路能过在大电流高电压下工作。数字电路更偏向于在低功耗、小电流、低电压下工作。33、电容容抗计算公式为1/2πfc(f为交流电的频率。电容两端的电流不会突变因为电容充放电需要时间所以电流不能瞬间改变故在电路中可以起到平滑电流、滤波的作用。交流电路中电容的电压领先电流90度。开始充电时电流流入电容电压还没建立起来当电流达到最大值时电压才开始上升。以此类推。34、对象对象语言有哪儿些python、C#、C、php35、不能做switch的参数类型是有浮点数float和double和长整型long long因为在C语言中switch()语句的参数必须是整型int、short、char或枚举类型。由于浮点数类型和长整型类型在内存中所占用的字节数较多导致switch()效率较低。36、Linux在某目录下查找某字符串通常可以使用什么命令grep37、IO接口一般具有三态分别为哪儿三态低电平、高电平、高阻态不为高电平也不为低电平。38、在Linux文件I/O操作时当调用open函数打开一个现有文件或创建一个新文件时内核会向该进程返回什么文件描述符39、野指针是什么产生的原因1、野指针指向不可知内存地址的指针。2、原因指针未初始化。释放内存后未置空。指针越界访问。使用已经释放的栈内存。40、const的作用声明一个值不能被修改的常量。41、静态重定位和动态重定位的区别:静态重定位指程序装入内存的过程中完成地址转换即在程序运行前完成。动态重定位在程序运行中需要访问数据时完成逻辑地址与物理地址的转换。42、判断以下表达式是否合法X1X1X1X1不合法赋值运算符左侧不能是表达式。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指向它。p1234; //向该地址写数据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].errstr32);printf(“%d”,(p-(char *)(st));解:首先对结构体进行对齐操作对齐规则结构体的大小一定要为有效对齐值的整数倍一般以结构体最长的成员进行对齐。故sizeof(st)443240,pst[3],(p-(char)(st)st[3]-st[0]34012060、递归是怎么实现的递归直接或间接的调用自身。将一个问题分解为一个个的小问题并且一定存在递归结束条件。61、软件工程设计流程可行性分析需求分析任务分解、成本估算、进度估算概要设计总体设计、数据结构、数据库设计、设计概要文档项目执行控制结构化设计、面向对象设计编码测试维护。62、冯诺依曼结构与哈佛结构的区别冯诺依曼结构指令和数据是存储在一起的使用单一总线传输指令和数据故效率较低哈佛结构指令和数据是分开存储的使用两条总线传输指令和数据并行能力更好效率高63、同一进程下的线程共享什么可以共享数据段、进程用户ID和进程组ID不可以共享线程ID、寄存器组的值、线程的堆栈。64、银行家算法是用来检测死锁的嘛错是用来避免死锁的。65、int、float、double分别怎么判断是否为0intint a0;if(a0)float: float a0;if(fabs(a)1e-6)double:double a0;if(fabs(a)1e-15)66、C语言的存储区const修饰的变量存储在哪儿一个区const修饰的全局变量存储在常量区。67、设计电路将1000HZ的方波转换成1000HZ的正弦波将1000HZ的正弦波转换成1000HZ的方波将1000HZ的方波转换成1000HZ的正弦波低通滤波器RC滤波器其截止频率的计算公式为F(cutoff)1/(2πRC)。将1000HZ的正弦波转换成1000HZ的方波通过比较器输入信号电压是否超过某一阈值通常是零电压并输出相应高电平或低电平信号的电路。68、PID模糊PID和自适应PID了解多少开放题有一个U32的变量X怎么判断其是否为2的幂次方找出最优解:如果一个数N是2的幂次方则其补码一定只有一个1则NN-10一个数组未排序找出数组中出现次数超过数组长度一半的数字1、使用map:假设一个数组arr[]利用map的key-value来存放数组arr[i]和对应在数组中出现的次数最后用次数去跟数组长度的一半去比较大于则就是。2、排序求中间值出现的次数超过长度的一般说明排序后一定在最中间的位置。排序之后接下来统计与arr[mid]的值相等的元素相等就count如果countmid则输出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、实现keyvalue存储程序向外提供增删改查接口功能用c实现4、开启3个线程3个线程的ID为ABC每个线程ID打印在屏幕上10遍要求输出结果必须按ABC的顺序显示如ABCABC… 用c语言实现5、计算第一个非0bit的位置从第一个bit0到bit7的一个参数中。如bit0为1函数返回结果1如果是其他bit则返回其他bit的位置。如果bit0不是非0比特则返回0用c实现intfirst_nonzero_bit(unsignedcharbyte){// Iterate over each bit from bit0 to bit7for(inti0;i8;i){// Check if the current bit is set (non-zero)if(byte(1i)){returni1;// Return the bit position (1-based)}}return0;// Return 0 if all bits are zero}6、一个unsigned long 的变量val现有4个bytes使用大端存储怎么使用c语言改成小端存储voidswap_endian_32(unsignedlong*val){unsignedlong*bytes(unsignedchar*)val;unsignedlongtemp;// 交换字节顺序tempbytes[0];bytes[0]bytes[3];bytes[3]temp;tempbytes[1];bytes[1]bytes[2];bytes[2]temp;}
嵌入式面试总结:
发布时间:2026/5/18 16:44:12
嵌入式面试题项目:项目用了哪儿些功能:1、定时器2、看门狗3、ADC4、DAC5、SPI6、IIC7、IIS8、串口9、GPIO11、emwin用的什么协助开发的12、PID13、PWM:14、PCM15、开关电源16、DMA八股文1、do while()和while之间的区别2、全局变量与局部变量的区别3、STM32的启动过程4、数组与指针的区别5、为什么IIC的SCL和SDA使用开漏输出上拉电阻并且存在线与逻辑6、c语言的全局变量没有赋初值和赋初值之间的区别自动赋初值是如何实现的7、IIC、串口哪儿个通讯更高效8、编译过程有哪儿些其中链接这个过程的作用是什么怎么链接的9、中断是怎么运作的用了哪儿些寄存器后续更新10、时序电路和组合电路的区别11、线程、进程哪儿个占用内存多12、目标文件为什么是bin、hex文件为什么是二进制和十六进制13、硬件IIC和软件IIC的区别14、低通滤波器15、想要去除50HZ的信号应该使用什么滤波器16、 CAN总线17、TCP和UDP是哪儿层协议区别在哪儿里。IP是哪儿层协议18、STM32的开发流程19、指针数组和数组指针的区别20、IIC和SPI的区别传输一个字节的区别SPI的时序21、头文件和extern的区别22、static 为什么可以static:23、引用外部变量可以用哪儿种方式为什么在.h文件中初始化变量会很危险。24、中断控制器25、在大多数Linux发行版本中以下哪儿个属于块设备block devices:26、以下为Linux下的32位C程序计算sizeof(p)的值27、Linux的一些命令28、printf和fprintf的区别29、嵌入式系统中用来保存固件或引导加载程序的是哪儿种存储器30、RAM和ROM的区别31、HDD是什么32、什么电路抗干扰性强什么电路能够在大电流高电压下工作模拟电路or数字电路33、电容34、对象对象语言有哪儿些35、不能做switch的参数类型是36、Linux在某目录下查找某字符串通常可以使用什么命令37、IO接口一般具有三态分别为哪儿三态38、在Linux文件I/O操作时当调用open函数打开一个现有文件或创建一个新文件时内核会向该进程返回什么39、野指针是什么产生的原因40、const的作用41、静态重定位和动态重定位的区别:42、判断以下表达式是否合法X1X143、C语言中运算对象必须是整型的运算符是44、每像素最少可以用多少bit来编码黑白照片45、未定义存储类别的变量隐含的存储类别为哪儿一个46、calloc、malloc、realloc的区别47、中断上下文48、int、unsigned int是多少字节49、HashMap运行NULL键或值吗50、linux编译的动态库以.so结尾吗51、怎么取地址0x00081320 52、等效电路的基本原理53、假设有一个四字节的整数0x12345678在小端系统和大端系统中怎么存储54、C语言中结构体可以相加、比较吗55、动态分配地址56、数据结构和内存管理中堆和栈的区别57、使用vmalloc可以申请非连续的物理内存页并将这些非连续的空间组成虚拟连续内存空间58、排序方法中关键码比较次数与记录的初始排列无关的是59、以下代码打印的结果为60、递归是怎么实现的61、软件工程设计流程62、冯诺依曼结构与哈佛结构的区别64、银行家算法是用来检测死锁的嘛65、int、float、double分别怎么判断是否为066、C语言的存储区const修饰的变量存储在哪儿一个区67、设计电路将1000HZ的方波转换成1000HZ的正弦波将1000HZ的正弦波转换成1000HZ的方波68、PID模糊PID和自适应PID了解多少开放题有一个U32的变量X怎么判断其是否为2的幂次方找出最优解:一个数组未排序找出数组中出现次数超过数组长度一半的数字有六个人排成两队从低到高进行排序其中第二排的人要比前面第一排的人要高求有几种排法:两根绳子燃烧不均匀长度也不一样每一根绳子从一端开始燃烧都为60min。问现在有一个打火机和这两根绳如何计时45min。10棵树栽5行每行4颗怎么种深度学习sigmod函数有什么优点和缺点算法题1、将一个整形数组进行转置要求其空间复杂度为 0不能使用临时变量2、给定一个长度为n的整数组用算法实现只遍历一次数组打印其中未重复的数。不能使用高级语言哈希表3、实现keyvalue存储程序向外提供增删改查接口功能用c实现4、开启3个线程3个线程的ID为ABC每个线程ID打印在屏幕上10遍要求输出结果必须按ABC的顺序显示如ABCABC... 用c语言实现5、计算第一个非0bit的位置从第一个bit0到bit7的一个参数中。如bit0为1函数返回结果1如果是其他bit则返回其他bit的位置。如果bit0不是非0比特则返回0用c实现6、一个unsigned long 的变量val现有4个bytes使用大端存储怎么使用c语言改成小端存储项目:项目用了哪儿些功能:首先使用的是STM32f429BITflash 2048Kbytes,内存RAM 256Kbytes,168个引脚。1、定时器定时器可以是16/32位的自动重载计数器一共有14个定时器。主要用定时器的比较功能触发中断比较定时器的计数值与预设的比较值、生成PWM波。比较定时器主要用于生成特定的输出波形如PWM波形或在达到特定计数值时触发中断/DMA请求。通过比较定时器的计数值与预设的比较值当两者相等时可以触发相应的动作。捕获定时器主要用于测量外部信号的脉宽、频率或检测信号的边沿变化。当外部信号如按键输入、脉冲信号等的边沿上升沿或下降沿触发时定时器会捕获当前的计数值并将其存储在特定的寄存器中以便后续处理。2、看门狗有两个看门狗一个独立看门狗和窗口看门狗都用于检测和解决由于软件故障而导致的故障并在计数器达到给定超时值时触发系统复位或中断仅限窗口看门狗。主要区别在于其提供的时钟不一样。独立看门狗 (IWDG) 由其自己的专用低速时钟 (LSI) 提供时钟因此即使主时钟出现故障也能保持活动状态。 适合需要看门狗作为主应用程序之外完全独立的进程运行但时序精度限制较低的应用程序。窗口看门狗 (WWDG) 时钟根据 APB1 时钟进行预分频并具有可配置的时间窗口可对其进行编程以检测异常迟到或过早的应用程序行为。适合需要看门狗在准确的时序窗口内做出反应的应用。3、ADC12 位 ADC 是逐次逼近型模数转换器。可配置12位、10位、8位或6位分辨率。有24个ADC每个ADC有16个输入通道4、DACDAC 模块是一个 12 位、电压输出数模转换器。 可配置为 8 位或 12 位模式。有两个DAC每个DAC有两个输出通道。5、SPI串行外设接口是一种高速的全双工同步的通信总线。只支持一主多从模式。SPI使用4条线SCK(时钟线、MISO主机输入/从机输出数据线、MOSI主机输出/从机输入数据线和CS片选信号。全双工模式可以同时收发数据。主要应用在 EEPROMFLASH。有四种不同的数据传输时序取决于时钟极性CPOL和时钟相位CPHA的组合。CPOL表示时钟空闲的时候电平的值为低电平0还是高电平1.CPHA:表示数据采集是第几个边沿0代表第一个边沿1代表第二个边沿。6、IIC串行通信总线标准半双工同步–共用给一个时钟信号的通信总线。既支持一主多从也支持多主多从。stm32上的硬件IIC长时间使用会不准因此一般考虑使用软件IIC也就是说使用两个GPIO来模拟IIC的信号。硬件配置SCL–配置推挽输出SDA–如果使用推挽输出由于SDA为高电平时存在总线空闲和接收数据为1时两种情况当总线空闲时并且从机给主机发送了数据0则会出现高电平碰上低电平则线路短路。则使用开漏输出弱上拉电阻一种多主从–主机发指令从机响应执行从机不能主动通信结构的总线由SDA和SCL两条线组成都为开漏(OD) 结构通过外接上拉电阻实现总线上所有节点SDA、SCL信号的线与逻辑关系标准模式–100kbps快速模式–400kbps高速模式–3.4Mbps。一般时序图MSB–高位先行开始信号 SCL为高时SDA从高到低的跳变产生开始信号结束信号 SCL为高时SDA从低到高的跳变产生结束信号数据传输数据读取动作都在 SCL为高 时产生SCL为低时是数据改变的时期。需要注意的是指定地址读需要发送两次起始信号。然后最后主机读取到数据之后需要返回一个NACK应答时序图要求。另外读设备的地址一般是最后一位为0时为可写为1时为可读所以读设备地址为0xA1。如下图以EEPROM为例7、IIS是一种串行音频数据接口标准用于连接数字音频设备。主要用于处理器与外部音频组件之间传输未压缩的数字音频数据。同步通信。支持双声道音频数据的传输(可以同时传输左声道和右声道的数据)。通常使用PCM脉冲编码调制–模拟信号转换成数字信号的方法格式来传输音频数据。通常有一个主设备和一个从设备或者多个从设备IIS时序图BCLK位时钟线确定数据传输速率与时序。SCK的频率2采样频率位宽。LRCK左/右声道线也称为帧同步信号。指示当前传输的是左声道数据还是右声道数据。LRCK的频率采样频率SD数据线TXSDOUT RXSDIN8、串口两根都是数据线并且需要保证双方都具有相同的速度波特率异步通信时钟源都是自给自足的异步通信全双工通讯接口。每一个串口数据包括以下几个部分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、DAC11、emwin用的什么协助开发的emwinView12、PIDP表示比例。起主要控制作用使反馈量向目标值靠拢但可能导致振荡。响应过慢增大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:PWMpulse width modulation脉宽调制是微处理器的数字输出对模拟电路的进行控制的一种有效手段。PWM的频率1秒中内有多少个PWM周期PWM的占空比一个周期内高电平占一个周期的比例14、PCMPCMpulse code modulation脉冲编码调制是一种数字音频编码技术。将模拟语音信号转换成数字语音信号通道信道进行传输。包括三个过程“抽样、量化、编码”。抽样对模拟信号进行周期性的扫描将连续的信号变成离散的信号。常见的抽样速率为8Kbit/s。量化把抽样得到的瞬时值用最接近的电平值来表示。编码用一组二进制码组来表示每一个固定电平的量化值量化实际上是在编码过程中同时进行的。PCM是对音质进行无损耗编码因此具有音质好、体积大的特点占用内存空间较大。15、开关电源直流开关电源将质量较差的原生态电源转换成满足设备质量较高的直流电源交流开关电源将交流电压转换成所需的交流电压或电流16、DMADMA(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总线CANcontroller area network控制器局域网多主控总线系统串行通信。具有高速传播、多设备连接、抗干扰性强、可靠性高、具有多种类型的网络拓扑结构。高速传播常用波特率为125kps250kps,500kps,最高可达1Mkps。多设备连接可挂载多个设备抗干扰性强采用差分信号通信即两根信号线CAN_H、CAN_L之间的电平差来传输数据位。逻辑0和逻辑1是两条差分信号线之间的电压差来决定的。逻辑0CAN_H和CAN_L的电压差大于0.9为显性电平逻辑1CAN_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 *pstr;解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的区别ROMread-only memory:只读存储器非易失性存储器存储单元由晶体管和二极管组成。主要用于存储固化的程序代码。RAMrandom-access memory:随机存取存储器是易失性存储器主要由电容器组成通过电容的存储和释放完成数据的读写。主要用于存储计算机当前正在运行的程序和数据。31、HDD是什么硬盘驱动器32、什么电路抗干扰性强什么电路能够在大电流高电压下工作模拟电路or数字电路1、数字电路抗干扰性强。由于数字电路是离散的只有高低电平两种状态因此放信号收到干扰时干扰幅度不超过阈值一般是数字信号的状态不会变化。而模拟信号是连续的信号微小的变化都可能使模拟信号发生变化。2、模拟电路能过在大电流高电压下工作。数字电路更偏向于在低功耗、小电流、低电压下工作。33、电容容抗计算公式为1/2πfc(f为交流电的频率。电容两端的电流不会突变因为电容充放电需要时间所以电流不能瞬间改变故在电路中可以起到平滑电流、滤波的作用。交流电路中电容的电压领先电流90度。开始充电时电流流入电容电压还没建立起来当电流达到最大值时电压才开始上升。以此类推。34、对象对象语言有哪儿些python、C#、C、php35、不能做switch的参数类型是有浮点数float和double和长整型long long因为在C语言中switch()语句的参数必须是整型int、short、char或枚举类型。由于浮点数类型和长整型类型在内存中所占用的字节数较多导致switch()效率较低。36、Linux在某目录下查找某字符串通常可以使用什么命令grep37、IO接口一般具有三态分别为哪儿三态低电平、高电平、高阻态不为高电平也不为低电平。38、在Linux文件I/O操作时当调用open函数打开一个现有文件或创建一个新文件时内核会向该进程返回什么文件描述符39、野指针是什么产生的原因1、野指针指向不可知内存地址的指针。2、原因指针未初始化。释放内存后未置空。指针越界访问。使用已经释放的栈内存。40、const的作用声明一个值不能被修改的常量。41、静态重定位和动态重定位的区别:静态重定位指程序装入内存的过程中完成地址转换即在程序运行前完成。动态重定位在程序运行中需要访问数据时完成逻辑地址与物理地址的转换。42、判断以下表达式是否合法X1X1X1X1不合法赋值运算符左侧不能是表达式。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指向它。p1234; //向该地址写数据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].errstr32);printf(“%d”,(p-(char *)(st));解:首先对结构体进行对齐操作对齐规则结构体的大小一定要为有效对齐值的整数倍一般以结构体最长的成员进行对齐。故sizeof(st)443240,pst[3],(p-(char)(st)st[3]-st[0]34012060、递归是怎么实现的递归直接或间接的调用自身。将一个问题分解为一个个的小问题并且一定存在递归结束条件。61、软件工程设计流程可行性分析需求分析任务分解、成本估算、进度估算概要设计总体设计、数据结构、数据库设计、设计概要文档项目执行控制结构化设计、面向对象设计编码测试维护。62、冯诺依曼结构与哈佛结构的区别冯诺依曼结构指令和数据是存储在一起的使用单一总线传输指令和数据故效率较低哈佛结构指令和数据是分开存储的使用两条总线传输指令和数据并行能力更好效率高63、同一进程下的线程共享什么可以共享数据段、进程用户ID和进程组ID不可以共享线程ID、寄存器组的值、线程的堆栈。64、银行家算法是用来检测死锁的嘛错是用来避免死锁的。65、int、float、double分别怎么判断是否为0intint a0;if(a0)float: float a0;if(fabs(a)1e-6)double:double a0;if(fabs(a)1e-15)66、C语言的存储区const修饰的变量存储在哪儿一个区const修饰的全局变量存储在常量区。67、设计电路将1000HZ的方波转换成1000HZ的正弦波将1000HZ的正弦波转换成1000HZ的方波将1000HZ的方波转换成1000HZ的正弦波低通滤波器RC滤波器其截止频率的计算公式为F(cutoff)1/(2πRC)。将1000HZ的正弦波转换成1000HZ的方波通过比较器输入信号电压是否超过某一阈值通常是零电压并输出相应高电平或低电平信号的电路。68、PID模糊PID和自适应PID了解多少开放题有一个U32的变量X怎么判断其是否为2的幂次方找出最优解:如果一个数N是2的幂次方则其补码一定只有一个1则NN-10一个数组未排序找出数组中出现次数超过数组长度一半的数字1、使用map:假设一个数组arr[]利用map的key-value来存放数组arr[i]和对应在数组中出现的次数最后用次数去跟数组长度的一半去比较大于则就是。2、排序求中间值出现的次数超过长度的一般说明排序后一定在最中间的位置。排序之后接下来统计与arr[mid]的值相等的元素相等就count如果countmid则输出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、实现keyvalue存储程序向外提供增删改查接口功能用c实现4、开启3个线程3个线程的ID为ABC每个线程ID打印在屏幕上10遍要求输出结果必须按ABC的顺序显示如ABCABC… 用c语言实现5、计算第一个非0bit的位置从第一个bit0到bit7的一个参数中。如bit0为1函数返回结果1如果是其他bit则返回其他bit的位置。如果bit0不是非0比特则返回0用c实现intfirst_nonzero_bit(unsignedcharbyte){// Iterate over each bit from bit0 to bit7for(inti0;i8;i){// Check if the current bit is set (non-zero)if(byte(1i)){returni1;// Return the bit position (1-based)}}return0;// Return 0 if all bits are zero}6、一个unsigned long 的变量val现有4个bytes使用大端存储怎么使用c语言改成小端存储voidswap_endian_32(unsignedlong*val){unsignedlong*bytes(unsignedchar*)val;unsignedlongtemp;// 交换字节顺序tempbytes[0];bytes[0]bytes[3];bytes[3]temp;tempbytes[1];bytes[1]bytes[2];bytes[2]temp;}