嵌入式方向秋招知识点准备

1. ARM指令和Thumb指令

在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态。而ARM状态和Thumb状态可以直接通过某些指令直接切换,都是在运行程序,只不过指令长度不一样而已。

2. 指针常量和常量指针 (高频)

  1. const char * ptr;  // 常量指针,指向的内容不能修改
  2. char * const ptr; // 指针常量,指向的地址不能修改,但内容可以修改

3. 大端小端编码

解释:小端:低地址存储数据的低字节部分, 高地址存储数据的高字节部分。大端:低地址存储高字节部分,高地址存储低字节部分。举个例子:我们用的linux系统中内存数据表示用的是小端表示,比如int i = 0x1234; 在内存中的表示为 34 12。大端中的内存表示为: 12 34

4. volatile和extern关键字的作用

volatile关键字用于修饰变量,指示编译器不应对该变量进行某些优化,以确保对变量的访问具有可见性和顺序性。它用来表示变量的值可能会在意料之外的时间被修改,因此编译器不应该对该变量的读取和写入进行优化或重排。这对于与外部设备的交互、中断处理等场景非常重要。当使用volatile修饰的变量被读取或写入时,编译器会生成相应的读取和写入操作的汇编代码,而不是从寄存器或缓存中获取或写入变量的值。

extern关键字用于声明外部变量或函数,它告诉编译器该变量或函数的定义存在于其他文件中。1)使用extern关键字声明变量时,变量的实际定义可以在其他源文件中,这样可以在多个源文件中共享同一变量的值。在链接过程中,编译器会在其他文件中查找该变量的定义。 2)当使用extern关键字声明函数时,它表示函数的定义存在于其他源文件中,允许在当前源文件中调用该函数而不需要提供函数的实际实现。

5. 线程之间的同步方式

  1. 临界区(Critical section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任何时候只允许一个线程访问共享资源,如果有多个线程访问,那么当有一个线程进入后,其他试图访问共享资源的线程将会被挂起,并且等到进入临界区的线程离开,临界在被释放后,其他线程才可以抢占。
  2. 互斥量(Mutex):为协调对一个共享资源的单独访问而设计。互斥量只有一个,只有拥有互斥量的线程,才有权限去访问系统的公共资源,保证资源不会被多个线程访问。互斥不仅能实现同一个应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。 比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
  3. 信号量(Semphore):为控制一个具有有限数量的用户资源而设计。它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
  4. 事件(Event):用来通知线程有一些事件已发生,从而启动后继任务的开始。

6. 哈佛结构和冯诺依曼结构的区别和联系 

区别:1)存储器结构:哈佛结构采用独立的指令存储器和数据存储器,而冯诺依曼结构使用统一的存储器空间,将指令和数据存储在同一存储器中。2)总线设计:哈佛结构中的指令和数据使用不同的总线进行读取和写入操作,而冯诺依曼结构中的指令和数据通过共享总线进行传输。3)并行性:哈佛结构可以并行地从指令存储器和数据存储器中取出指令和数据,从而提高指令获取和数据传输效率,而冯诺依曼结构需要按序从同一存储器中获取指令和数据。 4)硬件实现:由于哈佛结构需要独立的指令存储器和数据存储器,实现上可能需要更多的硬件资源,而冯诺依曼结构相对较简单。

联系:1) 数据处理:无论是哈佛结构还是冯诺依曼结构,都可以进行指令的执行和数据的处理,实现计算功能。2) 指令执行:两种结构都需要将指令从存储器中取出并送入处理器执行。3) 存储器:无论是哈佛结构还是冯诺依曼结构,都需要存储指令和数据,以便进行读取和写入操作。 4) 计算机体系结构:哈佛结构和冯诺依曼结构都是计算机体系结构的设计范式,用于指导计算机系统的组织和功能划分。

7. 关键字static 的作用 

1. 函数体内的静态变量在该函数被调用结束后不释放其存储空间。注意,定义为static的局部变量的存储在全局区(静态区)而一般的局部变量存储在栈中。

2. 模块内的静态变量可以被模块内所用函数访问,它是一个本地的全局变量。若要被模块外其它函数访问,则可通过extern关键字来实现。

3. 在模块内的静态函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

4. 类中定义的static数据成员属于所有该类对象共享,在内存中只占一份空间,而不是每个对象都分别为它保留一份空间。

5.类中static的成员函数只能直接调用static数据成员,若要访问非静态数据成员,需要加上对象名。因为静态成员函数没有this指针。

8. 嵌入式系统总线接口协议介绍

UART:UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种串行通信接口,常用于连接微控制器、传感器、模块等设备。UART支持双向通信,数据传输速度通常较慢,但在短距离通信和实时数据传输方面具有优势。

IIC:IIC(Inter-Integrated Circuit,集成电路互连)是一种串行通信接口,用于连接多个芯片或器件,常用于连接传感器、存储器、显示器等设备。IIC总线包括两条信号线,一条是时钟线SCL,另一条是数据线SDA。IIC总线具有简单、可靠、灵活的特点。

SPI:SPI(Serial Peripheral Interface,串行外围接口)是一种串行通信接口,常用于连接微控制器、存储器、显示器等设备。SPI支持高速数据传输和全双工通信,具有高效性和可靠性。SPI总线包括四条信号线,一条是时钟线SCK,另外三条是数据线MISO、MOSI和SS。

CAN:CAN(Controller Area Network,控制器局域网)是一种广泛应用于汽车、工业自动化等领域的实时通信协议。CAN总线支持多主从通信、错误检测和纠错等功能,具有高可靠性和实时性。CAN总线使用差分信号传输,包括两条信号线CANH和CANL。

USB:USB(Universal Serial Bus,通用串行总线)是一种广泛应用于电脑、手机等设备的外部总线标准。USB总线支持高速数据传输、热插拔、供电等功能,具有灵活性和兼容性。USB总线包括四条信号线,一条是数据线D+,另外三条是数据线D-、VCC和地线。

232/485:232和485是两种串口标准。232标准是一种单工、点对点的串行通信标准,常用于连接计算机和外部设备。485标准是一种半双工、多点的串行通信标准,支持多个设备同时通信,常用于工业自动化等领域。232和485总线使用串口连接,232总线包括三条信号线,分别是TXD、RXD和地线,485总线包括两条信号线A和B,以及一个地线。

SDIO:SDIO(Secure Digital Input/Output,安全数字输入输出)是一种串行总线,用于连接存储卡、无线网卡等设备。SDIO总线包括四条信号线,一条是时钟线CLK,另外三条是数据线CMD、D0和D1~3。SDIO总线支持高速数据传输和DMA传输等功能。

9.介绍总线接口USRT、I2C、USB的异同点(串/并、速度、全/半双工、总线拓扑等)

USRT(Universal Synchronous/Asynchronous Receiver/Transmitter)、I2C(Inter-Integrated Circuit)和USB(Universal Serial Bus)都是常见的总线接口,它们在串/并传输、速度、全/半双工和总线拓扑等方面的异同点:

1.  串/并传输:USRT和USB采用串行传输方式,即数据位逐位地传输,而I2C采用并行传输方式,即数据位同时传输。

2.  速度:USRT通常可以支持较高的数据传输速率,可以达到Mbps级别。I2C通常较慢,传输速率一般在几百Kbps范围内。USB具有较高的传输速度,可以根据不同的USB版本支持从低速(1.5 Mbps)到超速(10 Gbps)的不同速率。

3.  全/半双工:USRT和USB都可以支持全双工通信,即同时进行发送和接收。而I2C通常采用半双工通信,同一时刻只能进行发送或接收操作。

4.  总线拓扑:USRT通常是点对点的通信,即一对一的连接方式。USB支持多种拓扑结构,包括主从结构、集线器结构和星型拓扑等。I2C也支持多种拓扑结构,包括主从结构和多主结构。

对USRT、I2C和USB的比较:

1.  USRT:传输距离通常受到物理层的限制,可以根据具体的传输介质和驱动电路来确定。对于串行通信,传输距离一般可以达到数十米,但随着距离增加,信号衰减和噪音干扰可能会影响通信质量。

2.  I2C:I2C总线通常被设计为短距离通信,适用于连接在同一板上或近距离设备之间的通信。传输距离一般在几米以内,超过一定距离可能会受到信号衰减和干扰的影响。

3.  USB:USB总线设计用于在电脑和外部设备之间进行短距离数据传输。USB的传输距离通常在5米以内,这是USB规范所定义的标准长度。对于超过5米的传输距离,可以使用USB延长器或中继器来扩展传输距离。

10. 进程和线程的对比

进程和线程是操作系统中的两个核心概念:

进程(Process)是指在计算机中正在运行的一个程序的实例。每个进程都有自己的地址空间、数据栈和控制流,相互独立且受操作系统管理。进程可以包含多个线程。

线程(Thread)是进程中的执行单元。一个进程可以拥有多个线程,这些线程共享进程的资源,包括内存空间、文件描述符等。线程可以看作是进程中的一个子任务,多个线程之间可以并发执行,从而提高程序的效率和资源利用率。

关系:一个进程可以包含多个线程,这些线程共享进程的资源,但每个线程拥有自己的执行栈和程序计数器。线程之间的切换更轻量级,开销较小,因此线程的创建、销毁和切换速度通常比进程快。

同步机制:线程之间可以通过共享内存进行通信和同步,但也需要注意处理线程间的数据竞争和同步问题。进程之间通信的机制通常较为复杂,如管道、消息队列、共享内存等。

总之,进程是系统分配资源的基本单位,而线程是进程的执行单位,它们的关系是进程包含线程,线程共享进程资源,通过并发执行提高程序效率

11. 实时操作系统和非实时操作系统的区别

实时操作系统(Real-time Operating System,RTOS)和非实时操作系统(Non-real-time Operating System)之间有几个主要区别:

1.  响应时间保证:实时操作系统对任务的响应时间有硬性要求,即任务必须在特定的时间限制内完成。实时操作系统可以提供确定性的响应时间,确保关键任务在规定的时间范围内完成。而非实时操作系统没有对任务响应时间有硬性要求,任务的执行时间可以是不确定的。

2.  任务调度策略:实时操作系统使用预定的调度策略,以确保关键任务的及时执行。常见的实时调度策略包括固定优先级调度、循环调度、最早截止时间优先等。非实时操作系统通常使用抢占式或协同式调度策略,根据任务的优先级或时间片轮转来进行任务调度。

3.  可靠性和确定性:实时操作系统在任务执行和系统运行方面更注重可靠性和确定性。它们通常采用各种技术和机制来确保任务的正确执行,如优先级继承、互斥锁、信号量等。非实时操作系统更注重系统的灵活性和通用性,对于可靠性和确定性要求相对较低。

4.  系统负载:实时操作系统通常设计用于处理实时任务,其资源管理和调度算法更加注重对实时任务的优先处理。非实时操作系统可以更好地处理高负载的环境,能够同时运行多个任务,并对处理器和资源进行更灵活的管理。

12. 简述处理器中断处理的过程

主要为以下几个步骤:

1.  中断触发:当发生中断事件(如外部设备请求、时钟中断等),处理器会检测到中断信号的到来。

2.  中断向量:中断向量是一个唯一的标识符,用于区分不同的中断类型。处理器通过中断向量来确定要执行的中断处理程序。

3.  中断保护现场:在处理器进入中断处理程序之前,它会保存当前的执行现场(也称为上下文)。这包括保存当前指令的位置、寄存器中的值以及其他与当前任务相关的状态信息。

4.  中断处理程序执行:处理器根据中断向量找到对应的中断处理程序,并开始执行该程序。中断处理程序是事先编写好的用于处理特定中断类型的代码段。

5.  中断嵌套:在某些情况下,可能会发生多个中断事件同时发生的情况,这就导致了中断的嵌套。处理器具有中断优先级,当较高优先级的中断发生时,处理器会立即响应并处理该中断,而较低优先级的中断将被挂起。一旦较高优先级的中断处理完成,处理器会返回到原来的中断处理程序继续执行。

6.  中断返回:当中断处理程序执行完毕后,处理器会从中断处理程序返回到先前中断发生的位置,恢复中断时的上下文。这包括恢复之前保存的寄存器值和执行位置等。

7.  恢复现场和继续执行:处理器恢复先前的执行现场,并从中断发生时的下一条指令继续执行原来的程序。

13.  CPU核、缓存(Cache)、MMU如何协同工作

CPU核、缓存和MMU都是现代CPU架构中的关键部件:

  1. CPU核心是执行指令和处理数据的功能单元。每个CPU核心都有自己的寄存器和执行单元,可以并行执行指令。
  2. 缓存是高速的内存,它放在核心和主内存之间。缓存将频繁访问的数据块存储在离核心更近的地方,这减少了访问主内存的延迟。CPU通常有三级缓存- L1,L2和L3,L1最近核心,L3最大。
  3. MMU(内存管理单元)管理虚拟地址到物理地址的映射。它使用页表来实现这个转换。页表存放在主内存中。MMU将活动页面的映射缓存在Translation Lookaside Buffer(TLB)中,这避免每次都访问页表。

协作机制:

  1. 当CPU需要读取数据时,它首先检查核心的L1缓存,如果不在,则检查L2,之后是L3和主内存,直到找到需要的数据。数据会被加载到更接近核心的缓存中。
  2. 当CPU要写入数据时,数据会被写入到最近的缓存层,之后可能被写入到主内存中。
  3. 在访问主内存前,MMU使用页表和TLB来翻译虚拟地址为物理地址。这允许操作系统使用虚拟地址空间。
  4. 如果TLB中没有地址的映射,会触发页表访问来 Populate TLB。页表也可能被加载到缓存中。
  5. 操作系统和硬件会使用缓存一致性协议来确保不同核心缓存中的数据副本保持一致。

缓存,MMU和核心互相协作,使得指令和数据访问更快,提高了整体系统性能。

14. linux内核态和用户态之间的通信方式是什么?哪个效率最高?

通信方式主要有:

  1. 系统调用:用户程序调用内核提供的系统调用接口,切换到内核态执行。这是最常见的内核/用户空间交互方式。
  2. 中断:硬件设备触发中断,控制切换到内核执行中断处理程序。
  3. 信号:内核向进程发送信号,通知用户空间发生的事件。
  4. 共享内存:内核和进程通过共享内存传递信息,如共享缓冲区、管道等。
  5. 套接字:进程之间通过套接字通信,内核负责数据传输。
  6. 文件:通过文件系统的文件读写来传递数据。
  7. 消息队列、信号量:用于进程间同步和通信。

效率最高的通信方式是共享内存和套接字,因为:1)共享内存由于与内核地址空间重叠,可以零拷贝高效传递数据。2)套接字利用内核缓冲区,避免复制从而提高效率。内核可以利用 DMA 直接传输到网卡。3)而系统调用、信号、文件IO由于需要进程切换和数据复制,相对效率较低。

所以对高性能通信,共享内存和套接字是最好的选择。但其他机制也有各自的用途,应根据需要选择合适的方式。

15. ARM中R15除了本身的功能还可以作为?

在ARM架构下,寄存器R15是程序计数器(PC),用于存储当前指令的地址。除了作为指令地址计数器的功能外,在ARM架构下,R15还可以用于以下几个用途:

分支跳转:通过修改R15的值,可以实现分支和跳转到不同的指令地址。例如,使用带有链接(Link)的分支指令(如BL)时,可以将目标地址存储在R15中,以便在分支指令执行后返回到正确的位置。

存储异常处理向量地址:异常处理向量表存储了不同异常类型的处理程序地址。当发生异常时,处理器会根据异常类型选择相应的异常处理向量,并将其地址存储在R15中,以便跳转到异常处理程序。

切换执行模式:R15的最低两位(CPSR寄存器的T位)用于表示当前执行的模式。通过修改R15的最低两位,可以切换执行模式,例如从ARM模式切换到Thumb模式。

16. 介绍一下DMA和缓存

DMA是一种允许外部设备(如网络适配器、硬盘控制器等)直接与系统内存进行数据传输,而无需CPU的干预的机制。DMA通过在总线上与主存进行直接传输,提高了数据传输的效率,减轻了CPU的负担,使CPU能够更多地专注于其他任务。

缓存是一种高速临时存储器,用于缓存最近访问的数据和指令,以提高CPU对内存的访问效率。缓存分为多级,包括L1、L2、L3等级别,离CPU越近的缓存级别速度越快,容量越小。缓存可以减少CPU访问内存的延迟,提高指令和数据的读取速度。

在使用DMA时,与缓存的关系在于数据的一致性。由于DMA直接与内存交互,而不经过CPU缓存,可能导致缓存中的数据与内存中的数据不一致。当DMA操作读取或写入内存时,CPU缓存中可能还保存着旧的数据,而不是最新的数据。这可能会导致数据的不正确或不一致。

为了解决数据一致性的问题,在使用DMA时,需要采取特定的措施,如使用内存屏障、缓存无效操作和写缓冲管理等技术。这些措施可以确保在DMA操作期间,CPU缓存中的数据与内存中的数据保持一致,以避免数据错误。

17. 介绍一下信号量和互斥量

互斥量(Mutex)和信号量(Semaphore)是并发编程中常用的同步机制,用于管理对共享资源的访问。它们在功能和使用方式上有一些区别:

功能:互斥量用于提供对共享资源的互斥访问,即在任意时刻只允许一个线程或进程访问共享资源。它提供了独占的访问权限,确保资源在被一个线程使用时,其他线程不能同时访问该资源。信号量用于控制对一组资源的访问,它可以允许多个线程同时访问资源,但可以限制同时访问资源的线程数量。

计数:互斥量只有两个状态:锁定(被某个线程持有)和解锁(可供其他线程获取)。信号量具有一个计数器,可以是任意非负整数。计数器表示可用的资源数量。当计数器为正数时,表示有可用的资源,线程可以获取资源并将计数器减一;当计数器为零时,表示资源已被占用,线程需要等待直到有一个资源可用。

使用方式:互斥量通常用于保护临界区(Critical Section),即一段需要互斥访问的代码。一个线程在进入临界区之前会尝试获取互斥量的锁,如果锁已被其他线程持有,则该线程会被阻塞直到锁被释放。信号量用于控制资源的访问和共享,线程在访问资源之前会尝试获取信号量,如果信号量的计数器大于零,则线程可以继续访问资源并将计数器减一;如果计数器为零,则线程可能会被阻塞等待。

应用场景:互斥量通常用于保护共享变量或临界资源,以避免并发访问导致的数据竞争和不一致性。信号量通常用于限制资源的并发访问量,例如限制同时访问某个资源的线程数量或者控制线程的执行顺序。

 18. RTOS如何保障它的实时性

1) 任务调度:RTOS使用优先级调度算法来管理任务的执行顺序。每个任务都被分配一个优先级,高优先级的任务将优先执行。RTOS会根据任务的优先级动态调整任务的执行顺序,确保高优先级任务能够及时响应。

2)中断处理:RTOS具备快速响应外部中断的能力。当发生中断时,RTOS会迅速切换到中断服务程序,并按照事先定义好的中断处理程序执行相应的操作。这保证了对实时事件的即时响应。

3)时间管理:RTOS使用定时器和时钟来管理时间。它能够精确地跟踪时间的流逝,并根据需要进行任务调度和时间敏感操作。RTOS可以提供定时器服务、延时函数和定时触发等机制,以确保任务在特定时间内完成。

4)任务通信与同步:RTOS提供了各种通信和同步机制,如信号量、互斥锁、消息队列和事件标志等。这些机制允许任务之间进行有效的信息交换和同步操作,以确保任务按照特定的时间要求协调工作。

5)内存管理:RTOS通常使用静态内存分配或固定大小的内存池来管理任务的堆栈和其他数据结构。这种内存管理方式能够提高系统的可预测性和实时性,避免动态内存分配可能引起的延迟和碎片问题。

6)错误处理与容错机制:RTOS提供错误处理和容错机制,以应对系统错误和异常情况。例如,它可以检测任务的死锁或超时情况,并采取相应的措施,如自动重启任务或进行错误报告。

通过以上手段,RTOS能够有效地管理任务的调度、中断处理、时间管理、任务通信与同步、内存管理以及错误处理与容错,从而保证系统的实时性和可靠性。这使得RTOS广泛应用于对实时性要求较高的领域,如嵌入式系统、工业控制、航空航天等。

参考资料:

【机试题】2019大疆嵌入式笔试题A卷(附超详细解答)_大疆笔试_Yngz_Miao的博客-CSDN博客

2020年大疆秋招嵌入式笔试题A卷(部分)_大疆嵌入式笔试_zhangp334的博客-CSDN博客

大疆2021笔试题_51CTO博客_大疆笔试题

【投稿】大疆DJI嵌入式软件开发面经汇总_牛客网

大疆嵌入式工程师面经(base:深圳),为社区做下贡献_牛客网

[深入剖析STM32]STM32 启动流程详解 - 知乎

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值