ARM/Linux嵌入式面经(四):浙江大华

大华一面 嵌入式 主要是问的项目相关 标准的十五分钟 电话面 这个面试官主要问项目,我同门面的全问八股,可能面试官不一样吧

@[toc]

话说很多硬件终端、军工研究所都很喜欢考通信协议相关的知识。

往期内容:ARM/Linux嵌入式面经z专栏

UART串口通信的波特率,常用波特率有哪些

UART(Universal Asynchronous Receiver / Transmitter)是一种异步数据传输技术,它使用特定的波特率来传输数据。UART波特率是指每秒传输的数据位数,也称为波特率或传输速率。

UART波特率有多种,其中最常用的是2400、4800、9600、19200、38400、57600、115200。

串口通信校验方式是什么,有什么区别

利用串口传输数据时,近距离传输还好,远距离传输由于线路长度影响,可能会使信号在传输过程中出现不可预知的错误,为了达到通信的稳定性,在远距离通信时一般要引入一种校验方式来去除干扰。

这里主要介绍几种常见的校验方式,也是我们串口通讯板子上需要添加的几种校验方式。

即奇校验ODD,偶校验EVEN,累加和校验,CRC循环码冗余码校验

方便简单的奇偶校验

奇偶校验需要一位校验位,即使用串口通信的方式2或方式3(8位数据位+1位校验位)。

奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。

即:如果传输字节中1的个数是偶数,则校验位为“1”,奇数相反。

以发送字符:10101010为例

偶校验(even parity)

让传输的数据(包含校验位)中1的个数为偶数。

即:如果传输字节中1的个数是偶数,则校验位为“0”,奇数相反。

还是以发送字符:10101010为例

数据和校验位发送给接受方后,接收方再次对数据中1的个数进行计算,如果为奇数则校验通过,表示此次传输过程未发生错误。如果不是奇数,则表示有错误发生,此时接收方可以向发送方发送请求,要求重新发送一遍数据。

优缺点:

  • 奇偶校验的检错率只有50%,因为只有奇数个数据位发生变化能检测到,如果偶数个数据位发生变化则无能为力了╮(╯﹏╰)╭
  • 奇偶校验每传输一个字节都需要加一位校验位,对传输效率影响很大。
  • 奇偶校验只能发现错误,但不能纠正错误,也就是说它只能告诉你出错了,但不能告诉你怎么出错了,一旦发现错误,只好重发。
  • 虽然奇偶校验有很多缺点,但因为其使用起来十分简单,故目前仍被广泛使用。

应用:

如何用编程确定一个字节中“1”个数的奇偶性?我们可以利用二进制数相加的特点:

0+0=0、1+0=1、1+1=0

可以看出,如果我们将一个字节的所有位相加

  • 有奇数个“1”的字节的和为1 +有偶数个“1”的字节的和为0 由此即可通过编程完成判断。实际应用中,实现方法很多,但这是相对简单的一种,这里不再赘述。

累加和校验

所谓的累加和校验有很多种,最常见的一种是在每次通信数据包最后都加一个字节的校验数据,这个校验字节里的数据是通信数据包里所有数据的不进位累加和。例如:

接收方接收到数据后同样对一个数据包的数据进行不进位累加和计算,如果累加出的结果与校验位相同的话就认为传输的数据没有错误。

优缺点:

  • 实现起来方便简单,被广泛运用。
  • 检错率一般,例如一个字节多1,一个字节少1,则会出现误判。
  • 和奇偶校验一样,只能发现错误,但不能纠正错误。

另外,累加和校验的数据传输格式可以表示为:通讯数据+校验数据。这与我们之后要说的CRC循环冗余码校验是相同的。

虽然奇偶校验和累加和校验使用方便,应用广泛,但由于其存在许多缺点,在一些使用场合下很难满足要求,于是就有了更稳定更强大的校验方式,它就是……CRC循环冗余码校验!

CRC循环冗余码校验

  • CRC 即 Cyclic Redundancy Check 的缩写
  • CRC 循环冗余校验属于检错码,只能检测出现了错误,但无法纠正错误。
  • 与CRC循环冗余校验类似的,还有奇/偶校验,但是 CRC 漏检率更低,因此在实际应用中更为重要

发送方对原始数据追加校验码

  • 假设原始数据是:101001
  • 生成待追加的校验码,需要使用一个生成多项式,G(x)(收发双方事先约定),例如 G(x) = x3 + x2 + 1
  • 构造被除数:原始数据 + 生成多项式最高次项个0,即:101001000
  • 除数:除数实际上就是生成多项式的系数,G(x) 展开得到: G(x) = 1 * x3 + 1 * x2 + 0 * x1 + 1 * x0,即 1101
  • 两数相除得余数,并进行补位(补到与生成多项式最高次项一致),即得到校验码。但是,这里的除法跟常规除法并不相同
  • 常规除法在上下两行数进行运算时,使用的是减法运算,而这里使用的是异或

接收方对收到的数据进行校验

  • 继续接前文,假设收到的数据为 101001001

  • 接收方对该数据做除法,除数仍然是之前使用的多项式的系数 1101

  • 过程如下

  • 若余数为0,则表示未出错
  • 假设,接收方收到的数据出现了错误: 101101001,校验过程如下:

  • 余数不为0,则表示传输过程中出现了错误

结语

  • 计算CRC校验码时,用到的除法运算,内部使用的是异或运算而非减法运算

  • 计算出余数后,还要对其进行补位,才能得到最终使用的校验码

  • 在计算机网络中,数据链路层将数据封装成帧时,会在帧尾添加校验码,从而判断数据在传输过程中是否发生错误

  • 在实际使用CRC时,采用的生成多项式更为复杂,从而确保较低的漏检率

  • 另外,生成多项式的常数项必须是1

参考资料:

有校验位和无校验位的区别

iic收发数据的流程

IIC 即 inter-integrated-circuit,又称 I2C 一种总线结构,具体接受请度娘。

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

以下为mini2440的IIC设备:AT24C08

IIC遵从 主/从结构,通信由主机发起,并且由主机结束。

开始信号(s):当时钟信号处于高电平,向数据信号线发送下降沿。

结束信号(p):当时钟信号处于高电平,向数据信号线发送上升沿。

由于IIC总线上可能连有多个设备,因此我们应该在开始信号后进行设备选择,也就是发送地址信号,当设备收到符合自己地址的信号后会返回响应。

一般地址位宽为7位,而发送的数据位为8位,除了7位地址,剩下的一位为读写位。

如果为写,则在设备返回ack信号后,接着主机发送8位数据,当设备收到数据后,设备返回ack信号。

如果为读,则在设备返回ack信号后,接着设备返回8位数据,当主机接收到信号后,接下来的ack信号就由主机发送。

Data Transferred段周而复始,直到数据传输完成。

而在主机发送(R)或者接受(W)到ack信号后,会产生中断,我们可以在中断处理程序中对数据进行进一步处理,或者在中断处理程序内继续发送/接收数据。

当传输完成后,

       如果主机作为数据发送方,可以发送停止信号,终止IIC传输过程。

       如果主机作为数据接收方,可以不发送响应信号ack,终止传输过程。

寄存器配置:

根据芯片手册,IICCON用于初始化,其余用于数据传输的相关操作。

IICCON:  IIC控制寄存器

IICDS:  IIC数据移位寄存器

IICSTAT: IIC状态寄存器

IICADD: IIC地址寄存器

流程如下

主机发送流程:

主机接收流程:

设备发送流程:

设备接收流程:

另外,对于AT24C08,值得注意的是,该设备是先进行地址选择(非IIC设备的地址选择,而是AT24C08内部的地址选择),然后进行数据读写。

因此,AT24C08来说,当该设备被选择后(IIC地址匹配),然后对收到的第一个数据进行片内地址选择(写地址),然后:

如果需要写数据,因为同为写模式,所以可以直接进行

如果需要读数据,因为要转换为读模式,所以需要重新发送开始信号,在当前地址读数据

AT24C08是10位地址,所以8位的word address根本不够进行地址选择,因此以device address的最后两位,加上word address 的8位,一共10位数据进行地址选择。

到这里我们就对IIC原理及简单流程有了一定的了解了,和面试官battle一下完全够了,我为什么找了带一个具体的型号的元件,这是因为在面试的时候,一般面试官会问关于IIC的基础知识,再问你选型的器件用的是什么?为什么用这个器件。

如果你有时间的话,想稳中稳,那么你可以再看一下:IIC详解,包括原理、过程,最后一步步教你实现IIC

很多硬件终端、研究所很喜欢考协议相关的。

参考资料:https://www.cnblogs.com/TaigaCon/archive/2012/11/22/2782584.html

当通信出现异常,可能是什么原因导致的

通信出现异常时,可能由多种原因导致。以下是一些常见的原因:

串口连接问题:

  • 串口线可能没有正确连接,或者接线松动、损坏。
  • 发送端与接收端的串口配置参数,如波特率、数据位、停止位和校验位不一致,导致通信失败。

数据问题:

  • 数据丢失或错位,可能是由于数据传输速率过快或缓冲区溢出引起的。
  • 数据乱码,这可能是由于波特率不匹配、数据格式错误或受到干扰导致的。

硬件问题:

  • 电源供应不稳定,供电电压和电流不满足要求。
  • 串口线损坏,如焊接不良、短路等。
  • 串口芯片或模块损坏,需要替换或修复。
  • USB转串口工具有问题,长时间使用可能导致损坏。
  • 外部晶振或内部时钟计算的波特率存在误差。

软件问题:

  • 串口助手、单片机和外设三者之间的波特率设置不一致。
  • 波特率配置错误,或者计算公式中的单片机频率不正确。
  • 外部晶振和单片机启动代码设置的频率不一致。

网络问题:

  • 防病毒软件或防火墙可能阻挡了UDP请求,导致设备无法找到。
  • 串口服务器设置的IP地址与局域网内的电脑IP地址冲突。
  • 网络管理员对局域网进行管理,不允许未注册的IP地址或MAC地址在局域网内运行。

电磁干扰问题:

  • 信号容易受到干扰,建议使用带屏蔽线的电缆,并且确保接线严格,需要接地的要接地。
  • 排查潜在的干扰源,如电磁干扰、共地问题等。

当通信出现异常时,可以根据上述可能的原因逐一排查,定位问题所在,并进行相应的修复。同时,确保所有硬件和软件的配置正确,并遵循相应的通信协议和标准。

Linux的iic驱动组成

在 Linux 系统中,I2C 驱动由 3 部分组成,即 I2C 核心、I2C 总线驱动和 I2C 设备驱动。

今天就从这三个部分来给大家讲解一下Linux中的I2C驱动,以及我们应该如何为我们的开发板添加一个I2C设备。

Linux 的 I2C 体系结构

Linux驱动分为三部分:I2C 核心、I2C 总线驱动和 I2C 设备驱动

I2C(也写做IIC)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间数据传输,它只需要两根信号线来就能完成数据传输,极大地简化了对硬件资源和PCB板布线空间的占用,所以它被EEPROM、时钟等设备与主控的接口中。

先上三幅图,心中有个体系结构

在这里插入图片描述

在这里插入图片描述

1 Linux I2C 核心

I2C 核心提供了 I2C 总线驱动和设备驱动的注册、注销方法,这部分主要是一些与硬件无关的的接口函数,这部分的代码一般不用我们普通开发者进行开发和修改,但是理解这部分的代码逻辑和接口还是非常必要的。

2 Linux I2C 适配器驱动

通过上面的介绍我们知道了I2C驱动主要分为三个部分,上面我们已经介绍了I2C核心这一部分,现在我们来介绍一下I2C 适配器驱动,我们知道I2C驱动和其他的那些字符设备驱动有所不同,I2C驱动中维持着一套自己的总线。

I2C 适配器驱动是Linux内核中的一个核心模块,总线层负责管理所有注册到系统的I2C总线适配器和设备,并提供与设备通信的API函数。

它提供了一些基本的操作函数,如启动总线、停止总线、发送起始信号、发送停止信号等。但是这部分是由Linux内核完成的,并不需要我们开发者进行修改或添加,所以了解即可。

3 Linux I2C 设备驱动

I2C 设备驱动要使用 i2c_driver 和 i2c_client 数据结构并填充其中的成员函数。 i2c_client 一般被包含在设备的私有信息结构体 yyy_data 中,而 i2c_driver 则适合被定义为全局变量并初始化。

看到I2C设备驱动的这两个结构体大家是不是很熟悉了,I2C设备驱动是针对特定类型的I2C设备编写的驱动程序。它包含了对具体设备的操作和控制逻辑,通过调用I2C总线核心驱动提供的API函数与设备进行通信。设备驱动的主要任务包括初始化设备、读写数据、配置设备参数等。

因为这部分是针对特定类型的I2C设备编写的驱动程序,所以这部分才是要我们开发人员来完成编写的,我们如果需要在自己的开发板上添加一个新的I2C模块,我们就要首先编写I2C设备驱动这部分,这部分的编写需要调用上面我们介绍的I2C核心和I2C总线中接口函数来完成模块的初始化。

4 Linux I2C驱动总结

  • I2C总线核心驱动(I2C Core Driver):【系统厂编写】 I2C总线核心驱动是Linux内核中的一个核心模块,负责管理所有注册到系统的I2C总线适配器和设备,并提供与设备通信的API函数。它提供了一些基本的操作函数,如启动总线、停止总线、发送起始信号、发送停止信号等。

  • I2C适配器驱动(I2C Adapter Driver):【芯片厂提供】 I2C适配器驱动负责与硬件的I2C控制器进行交互,完成硬件层面的初始化、配置和操作。它将底层硬件的特定接口与I2C总线核心驱动进行连接,使得核心驱动能够通过适配器驱动来访问硬件。

  • I2C设备驱动(I2C Device Driver):【开发者编写】 I2C设备驱动是针对特定类型的I2C设备编写的驱动程序。它包含了对具体设备的操作和控制逻辑,通过调用I2C总线核心驱动提供的API函数与设备进行通信。设备驱动的主要任务包括初始化设备、读写数据、配置设备参数等。

三部分之间的关系如下:

  • I2C核心层驱动作为顶层驱动,管理整个I2C子系统,并提供了基本的I2C操作接口。

  • I2C适配器驱动负责与底层硬件的I2C控制器进行交互,通过适配器驱动,I2C总线核心驱动能够与硬件进行通信。

  • I2C设备驱动则针对具体的I2C设备编写,实现了对设备的初始化、读写数据等操作。

参考资料

你就说贴心不贴心吧~~~ 这还不点赞关注~~~

然后问了WIFI(简历项目有)

WIFI,全称Wireless Fidelity,是一种基于IEEE 802.11系列标准的无线网络通信技术。WIFI技术使用2.4GHz或5GHz的无线频段进行数据传输,具有速度快、可靠性高、覆盖范围广等特点,是现代社会中无线局域网(WLAN)的重要实现方式之一。

WIFI的工作原理主要是基于无线信号传输和接收。在一个WIFI网络中,通常包含一个或多个接入点(AP)和多个终端设备(STA)。接入点负责提供无线信号的发射和接收,并与有线网络相连,将无线信号转化为有线信号进行传输。终端设备则通过无线网卡等设备,与接入点建立无线连接,实现数据的传输和接收。

WIFI的覆盖范围通常可达几十米至上百米,具体取决于接入点的发射功率和周围环境。在覆盖范围内,多个终端设备可以同时接入同一个WIFI网络,实现数据的共享和传输。此外,WIFI还支持多种加密方式,如WPA/WPA2等,确保数据传输的安全性。

WIFI技术具有广泛的应用场景,如家庭、办公室、公共场所等。在家庭场景中,WIFI可以实现多台设备之间的无线连接,方便用户进行上网、文件传输等操作。在办公室场景中,WIFI可以提供更加灵活的网络接入方式,方便员工进行移动办公和协作。在公共场所中,WIFI则可以为用户提供免费的网络接入服务,提高用户体验。

需要注意的是,WIFI技术也存在一些局限性,如信号衰减、干扰等问题。为了获得更好的WIFI体验,用户需要注意选择合适的接入点和终端设备,并合理布置网络布局,避免信号干扰和衰减。同时,也需要注意保护个人隐私和网络安全,避免使用不安全的网络或泄露个人信息。

总之,WIFI技术已经成为现代社会中不可或缺的一部分,它为我们提供了更加便捷、高效的网络接入方式,也促进了信息的共享和交流。随着技术的不断发展,WIFI的性能和应用场景也将不断拓展和完善。

以下是一些常见的WIFI面试问题及其答案:

问题1:请简述WIFI的工作原理是什么? 答案1: WIFI工作原理主要是基于IEEE 802.11系列标准,通过无线信号传输和接收实现数据通信。在一个WIFI网络中,接入点负责提供无线信号的发射和接收,并与有线网络相连,将无线信号转化为有线信号进行传输。终端设备则通过无线网卡等设备,与接入点建立无线连接,实现数据的传输和接收。

问题2:WIFI的覆盖范围通常有多大? 答案2: WIFI的覆盖范围通常取决于接入点的发射功率和周围环境。一般来说,在家庭或办公室环境中,WIFI的覆盖范围可以达到几十米至上百米。但在实际使用中,可能会受到障碍物、其他无线设备干扰等因素的影响,导致覆盖范围有所减小。

问题3:WIFI常见的加密方式有哪些? 答案3: WIFI常见的加密方式包括WEP(有线等效加密)、WPA(Wi-Fi保护访问)和WPA2等。其中,WEP由于存在安全漏洞,现已较少使用;WPA和WPA2则提供了更高的安全性,被广泛应用于现代WIFI网络中。

问题4:WIFI信号为什么会衰减? 答案4: WIFI信号衰减可能由多种原因导致,如传输距离过远、障碍物阻挡、其他无线设备的干扰等。信号在传输过程中会受到环境因素的影响,导致信号强度逐渐减弱,从而影响WIFI网络的性能。

问题5:在部署WIFI网络时,需要注意哪些因素? 答案5: 在部署WIFI网络时,需要注意以下因素:选择合适的接入点位置和数量,以确保网络覆盖范围和信号质量;合理规划网络布局,避免信号干扰和衰减;考虑网络的安全性和稳定性,采用合适的加密方式和安全措施;以及根据实际需求选择合适的网络设备和配置参数。

问题6:WIFI与蓝牙有何区别? 答案6: WIFI和蓝牙都是无线通信技术,但它们在应用场景、传输速度和距离等方面有所不同。WIFI主要用于局域网内的设备连接和数据传输,传输速度快,覆盖范围广;而蓝牙则主要用于短距离无线通信,如耳机、手环等设备与手机的连接,传输速度相对较慢,但功耗更低。

请注意,这些问题和答案是基于一般性的WIFI知识。在实际面试中,面试官可能会根据具体职位和行业要求提出更深入或专业的问题。因此,建议面试者提前准备,对WIFI技术有较为全面和深入的了解。

面试问题来源作者:JTMJ

#华为##oppo##小米##大疆##大华#
ARM/Linux嵌入式面试集 文章被收录于专栏

让实战与真题助你offer满天飞!!! 华为、OPPO、大疆、Vivo、小米、海康、大华等大厂嵌入式工程师面试真题与经验。 每周两更,共计100篇! 励志做最全ARM/Linux嵌入式面试经验与题库。 励志讲清每一个知识点,找到每个问题最好的答案。 让你学懂,掌握,融会贯通。订阅即赠送学习笔记、简历模板、面试提纲模板【正在精心完善丰富中】。同时不定期更新内推招聘机会。

全部评论

相关推荐

5 70 评论
分享
牛客网
牛客企业服务