【嵌入式】嵌入式开发中常见的面试题(持续更新中)

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式+人工智能领域,具备多年的嵌入式硬件产品研发管理经验。

📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导、简历面试辅导、技术架构设计优化、开发外包等服务,有需要可私信联系。

嵌入式开发中常见的面试题

  • 1. 硬件和电子基础知识
    • 1.1 问题:解释什么是GPIO,以及如何在嵌入式系统中使用它们?
    • 1.2 问题:描述中断是什么,以及为何以及如何在嵌入式系统中使用中断?
    • 1.3 问题:简述SPI和I2C通信协议的区别?
    • 1.4 问题:如何使用振荡器和时钟在微控制器中产生可靠的时序?
  • 2. 编程和算法
    • 2.1 问题:使用C编写一个函数来反转字符串?
    • 2.2 问题:如何在没有使用库函数的情况下检测内存泄漏?
    • 2.3 问题:描述在一个不使用动态内存分配的嵌入式系统中管理内存的策略?
    • 2.4 问题:解释什么是“竞态条件”,以及如何在多线程应用中避免它?
  • 3. 嵌入式操作系统
    • 3.1 问题:解释实时操作系统(RTOS)和通用操作系统的主要区别?
    • 3.2 问题:描述任务调度器在RTOS中的作用是什么?
    • 3.3 问题:如何度量和改进RTOS系统的响应时间和性能?
    • 3.4 问题:以arm芯片+linux系统为例,介绍从芯片上电从功能全部启动的过程
  • 4. C/C++ 语言深入问题
    • 4.1 问题:C和C++语言的主要区别是什么?
    • 4.2 问题:解释C++中的虚函数(virtual function)和纯虚函数(pure virtual function)?
    • 4.3 问题:请解释C++中的RAII(Resource Acquisition Is Initialization)原则
    • 4.4 问题:C++11引入了右值引用和移动语义,请解释它们的概念以及它们如何帮助提升性能?
  • 5. 软件设计
    • 5.1 问题:描述嵌入式系统中常用的软件设计模式?
  • 6. 网络和通信
    • 6.1 问题:简述TCP/IP模型中每一层的职责?
    • 6.2 问题:请解释TCP(传输控制协议)和UDP(用户数据报协议)之间的主要区别
    • 6.3 问题:TCP连接为什么需要3次握手,而不是2次或者4次?
  • 7. 配置管理和版本控制
    • 7.1 问题:如何在嵌入式项目中使用版本控制系统,如Git?
    • 7.2 问题:请描述Git中“commit”的含义以及它在版本控制中的作用
    • 7.2 问题:请描述Git中“rebase”与“merge”的区别,以及各自的使用场景。
  • 8. 问题排查和调试
    • 8.1 问题:描述如何确定并修复嵌入式系统中的内存泄漏?
    • 8.2 问题:什么是死锁?
    • 8.3 问题:如何排查死锁问题?
  • 9. 安全性
    • 9.1 问题:描述在嵌入式系统中实现安全通信的方法?
    • 9.2 问题:解释为何固件加密对于嵌入式设备至关重要

在这里插入图片描述

嵌入式开发是指针对嵌入式系统的软件开发过程。嵌入式系统是一种专用计算机系统,通常被设计用来控制、监视或辅助操作机器和设备。这些系统被嵌入到更大的设备或系统中,成为其不可或缺的一部分,因此得名“嵌入式”。

嵌入式开发涉及硬件和软件的紧密集成,开发者需要考虑到目标硬件的特性、性能限制以及功耗要求等因素。在软件方面,嵌入式开发通常使用特定的编程语言(如C、C++或汇编语言)来编写程序,这些程序直接运行在嵌入式系统的微处理器或微控制器上。

所以,从事嵌入式开发需要掌握的软硬件知识需要非常全面,本文整理了一些面试过程中常见的高频问题及其参考答案。后续将持续更新。

1. 硬件和电子基础知识

1.1 问题:解释什么是GPIO,以及如何在嵌入式系统中使用它们?

答案:GPIO(General Purpose Input/Output)是通用输入输出端口的简称,用于与外部硬件进行交互。在嵌入式系统中,我们可以通过编程控制GPIO的输入输出状态,从而实现对外部设备的控制或读取外部设备的状态。

1.2 问题:描述中断是什么,以及为何以及如何在嵌入式系统中使用中断?

答案:中断是嵌入式系统中一种重要的机制,用于在特定事件发生时打断当前程序的执行,转而执行相应的中断服务程序。使用中断可以提高系统的响应速度和处理能力,特别是在需要实时响应外部事件的场景下。在嵌入式系统中,我们会配置中断源和中断处理程序,并在需要时触发中断。

1.3 问题:简述SPI和I2C通信协议的区别?

答案:SPI(Serial Peripheral Interface)和I2C(Inter-Integrated Circuit)都是常见的嵌入式系统通信协议。SPI是一种高速、全双工的同步串行通信总线,主要用于微处理器与外部设备之间的连接。I2C则是一种双向、半双工的同步串行总线,主要用于连接低速外设。两者在通信速率、连接方式等方面有所区别,选择使用哪种协议取决于具体的应用需求。

1.4 问题:如何使用振荡器和时钟在微控制器中产生可靠的时序?

答案:振荡器和时钟是微控制器中用于产生时序信号的关键组件。振荡器产生稳定的频率信号,时钟则根据这个频率信号来产生微控制器所需的时序脉冲。通过配置振荡器的频率和时钟的分频系数,我们可以得到所需的时序精度和稳定性。

2. 编程和算法

2.1 问题:使用C编写一个函数来反转字符串?

答案:以下是一个简单的C函数,用于反转字符串:

void reverseString(char *str) {if (str == NULL) {return;}char *end = str + strlen(str) - 1;char temp;while (str < end) {temp = *str;*str++ = *end;*end-- = temp;}
}

2.2 问题:如何在没有使用库函数的情况下检测内存泄漏?

  • 答案:检测内存泄漏通常涉及到对内存分配和释放的仔细跟踪。在没有库函数的情况下,可以通过在分配和释放内存时维护一个全局的内存管理表来实现。每次分配内存时,将相关信息(如地址和大小)添加到表中;每次释放内存时,从表中移除相关信息。定期检查这个表,如果发现有未释放的内存块,则可能存在内存泄漏。

2.3 问题:描述在一个不使用动态内存分配的嵌入式系统中管理内存的策略?

答案:在不使用动态内存分配的嵌入式系统中,可以采用静态内存分配策略。这意味着在程序编译时,就预先为所有需要的数据结构分配固定的内存空间。这样可以避免运行时的内存分配和释放操作,减少内存泄漏和碎片化的风险。但需要注意的是,这种策略可能导致内存使用效率不高,因此需要仔细规划内存的使用。

2.4 问题:解释什么是“竞态条件”,以及如何在多线程应用中避免它?

答案:竞态条件(Race Condition)是指两个或多个线程在访问共享数据时,由于执行顺序的不确定性而导致的结果不一致或不可预测的情况。为了避免竞态条件,可以使用互斥锁(Mutex)、信号量(Semaphore)等同步机制来确保同一时间只有一个线程访问共享数据。此外,还可以使用原子操作来确保数据操作的原子性,避免数据被其他线程打断。

3. 嵌入式操作系统

3.1 问题:解释实时操作系统(RTOS)和通用操作系统的主要区别?

答案:实时操作系统(RTOS)和通用操作系统的主要区别在于其设计目标和性能特点。RTOS专注于提供可预测的、确定性的响应时间,以支持实时应用的需求。它通常具有较小的内存占用和高效的调度策略,以确保任务的实时性。而通用操作系统则更注重提供丰富的功能和良好的用户体验,其响应时间可能不那么确定,但通常可以满足一般应用的需求。

3.2 问题:描述任务调度器在RTOS中的作用是什么?

答案:任务调度器是RTOS中的核心组件,它负责根据任务的优先级和状态来安排任务的执行顺序。调度器会综合考虑任务的等待时间、执行时间等因素,以确保任务能够按照预定的要求得到执行。通过合理的任务调度策略,RTOS可以提高系统的响应速度和性能。

3.3 问题:如何度量和改进RTOS系统的响应时间和性能?

答案:度量RTOS系统的响应时间和性能可以通过分析任务的执行时间、调度延迟、中断响应时间等指标来实现。改进系统性能的方法包括优化任务调度算法、优化中断处理、减少任务间的通信开销等。具体来说,可以针对任务的执行路径进行性能分析,找出瓶颈并进行优化;同时,合理配置中断优先级和处理流程,减少中断对系统性能的影响;此外,通过减少不必要的任务间通信和共享数据,可以降低系统的开销并提高响应速度。

3.4 问题:以arm芯片+linux系统为例,介绍从芯片上电从功能全部启动的过程

答案:ARM芯片加Linux系统的启动过程,从芯片上电到功能全部启动,可以大致分为以下几个阶段:

  1. 电源上电与系统Reset

    • 电源接通后,系统首先进行Reset操作,确保芯片和所有相关硬件组件回到初始状态。
  2. 内部启动程序的读取与执行

    • CPU内部的boot ROM开始读取并执行,同时strapping GPIO数值被锁定。
    • 根据strapping GPIO值和SoC内部fuse设置,确定用于启动的设备。
  3. 配置信息的读取与DDR RAM的初始化

    • 从启动设备起始位置读取用于配置DDR RAM和定位boot loader的配置信息。对于i.MX6平台,会使用’image vector table (IVT)’ 和 ‘device configuration data (DCD)’,如果从NAND设备启动,还会包括’boot control blocks (BCB)'。
    • DDR RAM被boot ROM初始化,为后续程序的运行提供内存空间。
  4. Bootloader的加载与执行

    • Bootloader是系统上电后运行的第一段程序,它主要完成一些初始化任务,例如初始化RAM和串口,检测处理器类型,设置Linux启动参数等。
    • Bootloader将Flash中的Linux内核拷贝到RAM中,并跳转到内核的第一条指令处继续执行,从而启动Linux内核。
  5. Linux内核的初始化

    • 内核在启动后,首先设置异常向量表,以便正确处理硬件产生的中断或故障。
    • 内核接着对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
    • 创建第一个用户进程(通常是init进程),并将控制权转交给它。
  6. 启动初始化(Init)

    • init进程是用户空间的第一个进程,它接管系统控制权后,会进行一系列的启动初始化工作,例如挂载文件系统、启动系统服务等。
  7. 等待应用程序执行

    • 完成上述所有步骤后,系统已经准备好运行应用程序。此时,Linux系统会等待并响应应用程序的执行请求。

在ARM芯片加Linux系统的启动过程中,各个环节紧密相连,每个阶段的成功执行都是确保系统最终能够正常运行的关键。此外,对于不同的ARM芯片和Linux发行版,具体的启动过程可能会有所差异,但大体上都会遵循类似的步骤和逻辑。

4. C/C++ 语言深入问题

4.1 问题:C和C++语言的主要区别是什么?

答案:C和C++的主要区别在于C++支持面向对象编程,包括类、对象、继承、多态等特性,而C是面向过程的编程语言。此外,C++提供了更丰富的标准库和特性,如模板、异常处理等,而C则相对简洁。在语法上,C++也增加了一些新特性,如命名空间、引用等。

4.2 问题:解释C++中的虚函数(virtual function)和纯虚函数(pure virtual function)?

答案:虚函数是C++中用于实现动态多态性的关键机制。它允许在基类中声明一个函数,并在派生类中提供不同的实现。通过基类指针或引用来调用派生类对象上的虚函数时,会执行派生类中的实现。纯虚函数是一种特殊的虚函数,它在基类中只声明而不定义,且必须在派生类中被重写。包含纯虚函数的类被称为抽象类,它不能被实例化。

当然可以,以下是两个关于C/C++语言深入的问题:

4.3 问题:请解释C++中的RAII(Resource Acquisition Is Initialization)原则

答案:RAII(Resource Acquisition Is Initialization)是C++中一种重要的编程原则,它强调在对象的生命周期中管理资源。根据RAII原则,资源的获取(如动态内存分配、文件句柄、锁等)应该在对象的构造时完成,而资源的释放则应该在对象的析构时自动进行。这样,即使发生异常或提前退出函数,也能确保资源得到正确释放,避免了资源泄漏。

一个常见的RAII应用例子是智能指针(如std::unique_ptrstd::shared_ptr)。这些智能指针在构造时接管资源的所有权,并在析构时自动释放资源。使用智能指针可以避免手动管理内存时的常见问题,如忘记删除指针或多次删除同一指针。

4.4 问题:C++11引入了右值引用和移动语义,请解释它们的概念以及它们如何帮助提升性能?

答案:在C++11中,右值引用是一种新的引用类型,它绑定到右值(如临时对象或字面量)而非左值(如变量或持久对象)。通过右值引用和移动语义,C++11引入了一种新的资源管理方式,即移动而非复制资源,从而提高了性能。

移动语义允许对象通过“窃取”其他对象拥有的资源来初始化,而不是创建资源的副本。这通常涉及到交换两个对象内部的指针或句柄,从而避免了不必要的资源分配和释放。

例如,考虑一个包含动态分配内存的类。在C++11之前,当你传递或返回这样的对象时,通常会复制整个对象,包括其内部的动态内存。这可能会导致性能下降,尤其是当对象很大时。使用移动语义,可以仅移动指针,从而避免了复制内存的开销。

C++11标准库中的许多容器和智能指针都支持移动语义,通过提供移动构造函数和移动赋值运算符来实现。使用std::move函数可以将左值转换为右值引用,从而触发移动操作。

通过合理利用右值引用和移动语义,可以显著提高涉及大量数据或资源转移的代码性能。

5. 软件设计

5.1 问题:描述嵌入式系统中常用的软件设计模式?

答案:嵌入式系统中常用的软件设计模式包括状态机模式、观察者模式、单例模式等。状态机模式用于管理对象的状态转换和行为;观察者模式用于实现对象之间的松耦合通信;单例模式确保一个类只有一个实例,并提供全局访问点。这些模式有助于提高嵌入式系统的可维护性、可扩展性和可靠性。

6. 网络和通信

6.1 问题:简述TCP/IP模型中每一层的职责?

答案:TCP/IP模型包括应用层、传输层、网络层和数据链路层。应用层负责处理特定的应用程序协议;传输层提供端到端的可靠数据传输服务(如TCP)或无连接的数据报服务(如UDP);网络层负责将数据报从源主机路由到目标主机;数据链路层则负责将数据帧在相邻节点间进行无差错的传输。

6.2 问题:请解释TCP(传输控制协议)和UDP(用户数据报协议)之间的主要区别

答案:TCP和UDP是两种主要的传输层协议,它们在许多方面存在显著的区别。

首先,TCP是一种面向连接的协议,它在发送数据之前需要先建立连接。这种连接机制保证了数据传输的可靠性和顺序性,因为TCP会对数据包进行排序和确认,确保数据按照正确的顺序到达且没有丢失。而UDP则是一种无连接的协议,它在发送数据前不需要建立连接,因此具有更高的传输效率,但可能无法保证数据的可靠性和顺序性。

其次,TCP提供流量控制和拥塞控制机制,可以根据网络状况动态调整发送速率,避免网络拥塞。而UDP则没有这些机制,它只管发送数据,不关心对方是否能收到或网络是否拥塞。

最后,由于TCP的复杂性和可靠性要求,它通常用于需要确保数据完整性和顺序性的应用,如文件传输、电子邮件等。而UDP则由于其简单和高效,通常用于实时性要求较高的应用,如音视频流、实时游戏等。

6.3 问题:TCP连接为什么需要3次握手,而不是2次或者4次?

答案:主要原因如下:

  1. 确保双方通信能力:通过3次握手,客户端和服务器都能确认对方能够发送和接收数据。在第一次握手中,客户端发送SYN包给服务器,表示客户端希望建立连接;在第二次握手中,服务器收到SYN包并回复ACK和SYN,表示服务器同意建立连接并通知客户端其已准备好;在第三次握手中,客户端收到服务器的SYN+ACK包后,再发送一个ACK包给服务器,表示客户端也准备好了。这样,双方都确认了对方的发送和接收能力。
  2. 防止已失效的连接请求报文段突然又传送到了服务端:在TCP连接中,客户端可能由于某种原因发送了一个SYN包,但该包在网络中丢失了,导致客户端没有收到服务器的回应。如果采用2次握手,客户端可能会认为连接已经建立,而服务器实际上并未收到SYN包,这可能导致数据丢失或其他问题。而3次握手则可以确保在这种情况下,客户端能够重新发送SYN包,直到收到服务器的回应为止。
  3. 避免资源浪费:3次握手中的最后一次是为了让客户端确认收到服务器发送的数据,避免服务器在未收到确认的情况下等待,造成资源浪费。

至于为什么不需要4次握手,这主要是因为TCP协议的设计目标是在保证可靠性的同时尽量提高效率。过多的握手次数会增加通信开销和延迟,降低网络性能。因此,3次握手是一个在可靠性和效率之间取得平衡的选择。

总的来说,TCP连接的3次握手机制确保了双方通信的可靠性,防止了已失效的请求报文段造成的问题,并避免了不必要的资源浪费。

7. 配置管理和版本控制

7.1 问题:如何在嵌入式项目中使用版本控制系统,如Git?

答案:在嵌入式项目中使用Git等版本控制系统可以追踪代码的变化历史、管理不同版本的代码以及协作开发。通过Git,可以创建代码仓库、提交代码更改、查看修改记录、分支和合并代码等。此外,还可以利用Git的特性如标签、钩子等来辅助项目管理和自动化构建。

7.2 问题:请描述Git中“commit”的含义以及它在版本控制中的作用

答案:Git中的“commit”指的是将暂存区(staging area)中的文件改动内容提交到本地仓库,形成一个新的版本。每一次提交都会生成一个唯一的提交ID(通常是一个SHA-1哈希值),并记录下改动的详细信息,如提交者、提交时间、提交信息以及改动的文件内容等。通过提交,我们可以记录项目历史中的每一个状态,并方便地回溯、查看或恢复到某个特定的版本。因此,“commit”在版本控制中起到了保存项目状态、记录修改历史以及实现版本回溯的关键作用。

7.2 问题:请描述Git中“rebase”与“merge”的区别,以及各自的使用场景。

答案:Git中的“rebase”和“merge”都是用于整合不同分支的改动,但它们的工作方式和适用场景有所不同。

merge

  • 工作方式:merge会创建一个新的合并提交,将两个分支的最新改动合并到一起。这个新的提交包含了两边分支的最新内容,并记录了合并的历史。
  • 适用场景:当两个分支并行开发,且双方改动不冲突或冲突可以轻易解决时,可以使用merge来整合改动。它保留了完整的合并历史,有助于了解项目的发展过程。

rebase

  • 工作方式:rebase会将一个分支的改动“复制”到另一个分支上,并重新应用这些改动。这实际上是创建了一系列新的提交,这些提交与原始分支的提交具有相同的改动内容,但基于目标分支的最新状态。
  • 适用场景:当希望保持一个线性的提交历史,或者当需要在将改动合并到主分支之前先清理本地分支的提交历史时,rebase是一个很好的选择。它可以使提交历史更加清晰和整洁,但需要注意的是,在公共分支上使用rebase可能会导致一些问题,因为它会改变提交的历史。

总结来说,merge保留了完整的合并历史,而rebase则创建了一个更线性的提交历史。选择使用哪一个取决于项目的具体需求和团队的偏好。在处理公共分支时,通常更倾向于使用merge,以避免潜在的冲突和混乱。而在处理个人分支或需要保持线性历史的场景时,rebase可能更为合适。

8. 问题排查和调试

8.1 问题:描述如何确定并修复嵌入式系统中的内存泄漏?

答案:确定和修复嵌入式系统中的内存泄漏通常涉及使用内存分析工具来检测泄漏点,并审查代码以找出泄漏的原因。一旦确定了泄漏的位置和原因,就可以通过修改代码来修复它,例如释放不再使用的内存、修复内存分配和释放的匹配问题等。

8.2 问题:什么是死锁?

答案:死锁是指两个或两个以上的进程在执行过程中,由于资源竞争或者由于彼此通信而造成的一种阻塞现象。在这种情况下,若无外力作用,这些进程都将无法继续执行下去,系统此时处于死锁状态。这些因等待其他进程释放资源而无法继续执行的进程,被称为死锁进程。

8.3 问题:如何排查死锁问题?

答案:排查死锁问题主要可以采用以下几种方法:

  1. 资源分级:对系统中的各种资源(如CPU、内存、磁盘等)进行分级,优先分配高级别的资源给进程。这有助于减少因资源分配不当导致的死锁情况。
  2. 请求和保持:当一个进程在等待一个资源时,如果该资源被其他进程占用,则该进程请求其他空闲资源,并保持对已分配资源的占有,防止释放可能引起死锁的资源。这样可以降低因资源竞争导致的死锁风险。
  3. 检测工具:使用专门的死锁检测工具来监控系统的运行状况,一旦检测到死锁现象,这些工具会提供详细的报告,帮助管理员或开发者定位问题。
  4. 日志分析:检查系统日志,特别是与进程和资源使用相关的日志,可以帮助识别可能导致死锁的操作或模式。
  5. 代码审查:对可能导致死锁的代码进行仔细审查,检查是否存在不恰当的同步、锁使用或资源分配策略。

9. 安全性

9.1 问题:描述在嵌入式系统中实现安全通信的方法?

  • 答案:在嵌入式系统中实现安全通信的方法包括使用加密协议(如TLS/SSL)来保护数据传输的机密性和完整性,使用身份验证机制(如数字证书)来验证通信双方的身份,以及实施访问控制和权限管理来限制对敏感数据和功能的访问。此外,还可以采取其他安全措施,如安全启动、代码签名和更新验证等,来提高系统的整体安全性。

9.2 问题:解释为何固件加密对于嵌入式设备至关重要

答案:固件加密对于嵌入式设备至关重要,这主要基于以下几个方面的原因:

首先,固件是嵌入式设备的核心组成部分,包含了设备的运行逻辑和功能实现。固件的安全性直接影响到整个设备的运行稳定和数据安全。如果固件被恶意攻击者篡改或注入恶意代码,可能会导致设备功能失效、数据泄露等严重后果。因此,通过固件加密可以有效防止潜在攻击者获取固件的源代码或进行篡改,确保固件的安全性和完整性。

其次,嵌入式设备广泛应用于各个领域,包括工业控制、智能家居、医疗设备等。这些设备往往承载着重要的数据和功能,一旦受到攻击,可能会对社会生产和人们生活造成严重影响。例如,在医疗设备中,固件加密可以防止恶意攻击者篡改医疗设备的功能,保障患者的安全。因此,固件加密是保障嵌入式设备安全运行的必要手段。

此外,固件加密还可以提高嵌入式设备的性能。通过合理的加密方案,可以确保固件在设备上的正确加载和运行,避免因固件损坏或篡改导致的性能下降或设备故障。同时,固件加密还可以防止未经授权的访问和修改,保护设备的合法权益。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【位运算】Leetcode 消失的两个数字

题目解析 面试题 17.19. 消失的两个数字 算法讲解 我们将这两个数组异或在一起&#xff0c;最后的结果就是a ^ b(缺失的两个数字)的结果&#xff0c;这两个缺失的数字一定是不相同的&#xff0c;所以我们就寻找他们第一个比特位是1的那个位置&#xff0c;异或的原理是&#xf…

半导体存储电路知识点总结

目录 一、SR锁存器 1.SR锁存器的概念 2.作用 二、电平触发器&#xff08;Flip-Flop&#xff09; 1.时钟信号 2.电平触发的触发器电路结构 3.带异步置位复位的电平触发器 三、边沿触发器 1.特点 2.两个D触发器组成的边沿触发D触发器 3.CMOS边沿触发D触发器的典型电路 …

FMEA分析

目录 1、FMEA的核心目的 2、FMEA的种类 3、FMEA的实施步骤 4、FMEA的SOD等级 5、FMEA的例子 FMEA&#xff08;Failure Modes and Effects Analysis&#xff0c;失效模式与影响分析&#xff09;是一种预防性的可靠性设计分析&#xff0c;用来确定潜在失效模式及其原因。它主…

【Altium Designer 20 笔记】PCB线宽与过孔尺寸

电源线&#xff1a;40mil1A&#xff08;一般翻倍给&#xff09;,地线比电源线粗一点即可&#xff1b;信号线&#xff1a;10-15mil 一、线宽 市电的火线和零线&#xff1a;80-100mil12V /24V 20mil~60mil 5V 20-30mil 3V 20-30mil GND 越宽越好20-30mil普通信号线 10mil-15mil…

比亚迪老总王传福:雨天走访县级市场,生活方式却如此简单

近期&#xff0c; 世界汽车销售排名前十的老板亲自下到一线市场调研&#xff0c;这听起来像是个奇迹&#xff0c;但这就是我们今天要说的主角——比亚迪老总王传福的故事。他不仅亲自去现场调研&#xff0c;还时常挤地铁、吃盒饭、坐经济舱&#xff0c;这和那些高高在上的企业领…

flink network buffer

Flink 的网络协议栈是组成 flink-runtime 模块的核心组件之一&#xff0c;是每个 Flink 作业的核心。它连接所有 TaskManager 的各个子任务(Subtask)&#xff0c;因此&#xff0c;对于 Flink 作业的性能包括吞吐与延迟都至关重要。与 TaskManager 和 JobManager 之间通过基于 A…

YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先!

YOLOv8最新改进系列&#xff1a;融合DySample超轻量动态上采样算子&#xff0c;低延迟、高性能&#xff0c;目前最新上采样方法&#xff01;&#xff01;&#xff01;遥遥领先&#xff01; DySample超轻量动态上采样算子全文戳这&#xff01;here! 详细的改进教程以及源码&am…

在EC2上面安装Skywalking9.7.0

问题 前几天在k8s集群安装了skywalking&#xff0c;说什么这种方式不行&#xff0c;客户要求单独在一台linux机器安装skywalking。现在我们来解决这个问题。 步骤 # 移动到/opt目录 cd /opt # 下载apm安装包 sudo wget https://dlcdn.apache.org/skywalking/9.7.0/apache-sk…

超越GPT-4V!马斯克发布Grok-1.5 With Vision

在 Grok-1 开源后不到一个月&#xff0c;xAI 的首个多模态模型就问世了。Grok-1.5V是XAI的第一代多模态模型&#xff0c;除了其强大的文本处理能力之外&#xff0c;Grok现在还能够处理包括文档、图表、图形、屏幕截图和照片在内的各种视觉信息。相信Grok-1.5V将很快提供给现有的…

ViT——nlp和cv进行了统一,使多模态成为可能

题目:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 1.概述之前的transformer在cv中应用,大部分是将CNN模型中部分替换成transformer block(整体网络结构不变)或者用transformer将不同网络连接起来,而本文提出:一个针对图像patch的纯的t…

WebShell简介

WebShell简介 1、WebShell分类 • JSP类型 • ASP类型 • PHP类型 2、WebShell用途 • 站长工具 • 持续远程控制 • 权限提升 • 极强隐蔽性 3、WebShell检测方法 • 基于流量的 WebShell 检测 • 基于文件的 WebShell 检测 • 基于日志的 WebShell 检测 WebShe…

看到这12这个登录页,我感觉自己的很多登录白设计啦。

登录页是B端系统的脸面&#xff0c;它是B端系统的入口&#xff0c;是用户与系统之间的第一道门槛。登录页的设计直接影响用户对系统的第一印象&#xff0c;因此登录页的设计应该简洁、清晰、易于使用&#xff0c;并且能够符合用户的需求和期望。

深度学习框架

深度学习框架 1 引言 在当今技术加速发展的时代&#xff0c;深度学习已经成为了人工智能领域内最为引人注目的子领域之一。其在图像识别、自然语言处理、自动驾驶等多个行业中的成功应用&#xff0c;已经证明了深度学习在解决复杂问题方面的巨大潜力。然而&#xff0c;深度学习…

航芯通用MCU技术常见问题 | F4专题

日常工作中&#xff0c;我们的销售或技术工程师经常会收到来自用户的问题&#xff0c;其中一些问题是比较常见的&#xff0c;所以为满足日常用户对航芯产品使用及服务的了解&#xff0c;航芯特此推出“通用MCU技术常见问题”专题&#xff0c;分为F0专题及F4专题&#xff0c;欢迎…

32单片机入门持续更新中

配套资料为野火霸道V2 初识 STM32 4.1 什么是 STM32 STM32&#xff0c;从字面上来理解&#xff0c;ST 是意法半导体&#xff0c;M 是 Microelectronics 的缩写&#xff0c;32 表示 32 位&#xff0c;合起 来理解&#xff0c;STM32 就是指 ST 公司开发的 32 位微控制器。在如今…

如何在Vue3中使用H.265视频EasyPlayer.js流媒体播放器?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

【开源鸿蒙】调试OpenHarmony轻量系统QEMU RISC-V版本

【开源鸿蒙】调试OpenHarmony轻量系统QEMU RISC-V版本 一、准备工作1.1 编译OpenHarmony源码1.2 确认OHOS_Image已生成1.3 确认OHOS_Image文件是否有调试信息1.4 检查config.gni文件是否有-g编译选项 二、GDB调试2.1 启动QEMU模拟器2.2 启动GDB调试器2.3 连接QEMU模拟器2.4 使用…

性能优化-02

uptime 依次显示当前时间、系统运行时间以及正在登录用户数&#xff0c;最后三个数字依次则是过去1分钟、5 分钟、15 分钟的平均负载(Load Average) 平均负载是指单位时间内&#xff0c;系统处于可运行状态和不可中断状态的平均进程数&#xff0c;也就是平均活跃进程数&#xf…

Vue3(四):Pinia

一、Pinia介绍 Pinia是一个专门为Vue.js设计的状态管理库&#xff0c;它提供了一种简单和直观的方式来管理应用程序的状态。在使用Pinia时&#xff0c;可以轻松地创建定义状态的存储&#xff0c;然后将其与Vue组件绑定&#xff0c;使它们能够使用该状态。和上一个博客提到的Vu…

【小程序】生成短信中可点击的链接

文章目录 前言一、如何生成链接二、仔细拜读小程序开发文档文档说明1文档说明2 总结 前言 由于线上运营需求&#xff0c;需要给用户发送炮轰短信&#xff0c;用户通过短信点击链接直接跳转进入小程序 一、如何生成链接 先是找了一些三方的&#xff0c;生成的倒是快速&#xf…