嵌入式软件工程师常见面试题

[华曦达]

1 涉及模拟I2C通信协议速率和一些细节、ADC外设位数、FreeRTOS内核裁剪做了那些

2 问C中static关键字

  1. 关于模拟I2C通信协议速率和一些细节、ADC外设位数、FreeRTOS内核裁剪做了那些:

    • I2C通信协议:I2C(Inter-Integrated Circuit)是一种串行通信协议,它支持多主设备和多从设备之间的通信。在模拟I2C通信时,可能涉及调整通信速率(常见的有100KHz、400KHz和1MHz),处理起始和停止条件,以及发送/接收数据和ACK/NACK信号等。另外,还需要考虑总线仲裁和错误处理等问题。

    • ADC外设位数:ADC(Analog-to-Digital Converter)是一种将模拟信号转换为数字信号的设备。ADC的位数通常指的是其分辨率,即它可以将模拟信号分为多少个不同的级别。例如,一个8位的ADC可以将模拟信号分为256(即 2 8 2^8 28)个不同的级别。在设计ADC时,需要考虑其位数、采样率、输入范围等因素。

    • FreeRTOS内核裁剪:FreeRTOS是一种实时操作系统,适用于嵌入式系统。在实际应用中,为了节省资源,通常需要对FreeRTOS进行裁剪,即只保留必要的功能。这可能涉及移除某些任务调度策略、减少内核的大小、移除不需要的API等。具体的裁剪方法取决于应用的具体需求。

  2. C中的static关键字有三种主要的用途:

    • 限制变量的作用域:在函数内部声明的static变量只能在该函数内部访问,而且其值会在函数调用之间保持不变。这对于需要保持状态的函数来说非常有用。

    • 限制函数的作用域:在文件内部声明的static函数只能在该文件内部访问。这可以防止其他文件误用该函数,从而提高代码的模块化程度。

    • 限制全局变量的作用域:在文件内部声明的static全局变量只能在该文件内部访问。这同样可以提高代码的模块化程度,防止全局变量的滥用。

    使用static关键字可以提高代码的封装性和可维护性,但也需要注意其可能带来的问题,例如可能会增加代码的复杂性和理解难度。

诺瓦星云

一般怎么排查i2c设备的问题
硬件调试用过那些,功耗分析和soc降频怎么实现的
驱动代码有多少是自己写的,代码调试工具用过那些?

排查I2C设备问题通常可以采用以下步骤:

  1. 检查硬件连接:确保I2C设备的电源和地线已正确连接,SDA(数据线)和SCL(时钟线)也已连接到正确的I2C引脚。

  2. 检查设备地址:确保你在代码中使用的I2C设备地址与实际设备的地址匹配。

  3. 使用示波器或逻辑分析仪:这些工具可以帮助你直观地看到I2C总线上的信号,以便检查时序问题或数据传输错误。

  4. 检查代码:确保你的代码正确实现了I2C协议,包括起始和停止条件、数据传输和ACK/NACK信号等。

  5. 使用I2C调试工具:一些硬件如Raspberry Pi提供了用于调试I2C通信的工具,例如i2cdetect,可以用来检测总线上的设备。

硬件调试通常会使用以下工具:

  • 示波器:用于观察电压随时间的变化,可以用来调试时序问题或信号质量问题。
  • 逻辑分析仪:用于捕获数字信号,可以用来调试通信协议,如I2C、SPI等。
  • 多用表:用于测量电压、电流和电阻等,可以用来检查电源问题或连线问题。

功耗分析可以使用专门的功耗分析工具,如Joulescope,它可以实时测量电压和电流,从而计算功耗。另外,也可以使用示波器和电流探头进行测量。

SoC降频通常是通过修改时钟源或时钟分频器来实现的。这通常需要修改SoC的寄存器设置,具体方法取决于SoC的具体型号和数据手册。

代码调试工具有很多,以下是一些常见的:

  • GDB:GNU调试器,可以用来调试C、C++等语言的代码。
  • LLDB:LLVM项目的调试器,与GDB功能类似,但主要用于调试使用Clang编译的代码。
  • Valgrind:一个内存调试和泄漏检测工具。
  • IDE内置调试器:许多集成开发环境(IDE)如Visual Studio、Eclipse、IntelliJ IDEA等都有内置的调试工具。
  • printf调试:通过在代码中插入打印语句来观察程序的运行情况,虽然简单,但在某些情况下非常有效。

鼎信通讯

1.进程间通信的方法
2.进程与线程区别
3.static关键字作用
4.堆栈和静态区分别存放什么变量
5.如何写一段代码判断CPU是大端序还是小端序
6.讲讲进程死锁

  1. 进程间通信的方法:常见的进程间通信(IPC)方法有管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)、套接字(Socket)、信号量(Semaphore)、信号(Signal)等。

  2. 进程与线程区别:进程是操作系统资源分配的基本单位,是拥有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行。

  3. static关键字作用:在C/C++中,static关键字有以下几种作用:

    • 当static修饰局部变量时,会使得该变量的生命周期贯穿整个程序,而其作用域仅限于声明它的代码块。
    • 当static修饰全局变量或函数时,会使得其作用域仅限于声明它的文件,对其他文件是不可见的。
    • 在C++中,当static修饰类的成员变量时,会使得该变量成为类的所有对象共享的;当static修饰类的成员函数时,表明该函数不依赖于任何对象就可以调用。
  4. 堆栈和静态区分别存放什么变量:栈区通常用于存放函数的局部变量、函数参数以及函数的返回地址等。堆区可以动态分配,通常用于存放动态创建的对象和数据。静态区用于存放全局变量、静态变量和常量。

  5. 如何写一段代码判断CPU是大端序还是小端序:以下是一段简单的C代码,用于判断CPU是大端序还是小端序:

    #include <stdio.h>
    
    int main() {
         
        int num = 1;
        if (*(char *)&num == 1) {
         
            printf("Little-Endian\n");
        } else {
         
            printf("Big-Endian\n");
        }
        return 0;
    }
    

    如果输出"Little-Endian",则CPU是小端序;如果输出"Big-Endian",则CPU是大端序。

  6. 讲讲进程死锁:进程死锁是指两个或多个进程在运行过程中,因争夺资源而造成的一种僵局(即进程无法进行下去),若无外力作用,这些进程都将无法向前推进。产生死锁的四个必要条件:互斥条件、请求与保持条件、不剥夺条件和循环等待条件。解决死锁的基本方法有:预防死锁(破坏死锁的四个必要条件)、避免死锁(银行家算法)、检测死锁和解除死锁。

海康威视
进程间通信
中断函数应该注意什么
堆和栈
ping的工作原理
手撕:两个链表的第一个公共节点

  1. 中断函数应该注意什么

    中断函数(通常在操作系统或嵌入式系统中)是一种特殊的子程序,主要用于处理硬件中断。在设计和实现中断函数时,应注意以下几点:

    • 尽量减少中断函数的执行时间。因为在中断处理程序运行期间,系统不会响应其他中断,这可能导致系统性能下降或者错过某些重要的事件。
    • 避免在中断函数中使用可能会阻塞的操作,例如等待某个事件或者等待锁。
    • 尽量避免在中断服务例程中进行复杂的计算或者调用其他函数。这可能会增加中断处理的时间,降低系统的实时性。
    • 中断函数应当是可重入的。也就是说,如果在处理一个中断的过程中又发生了同类型的中断,新的中断应当能够正确地保存现场,等待旧的中断处理完毕后再进行处理。
    • 注意中断函数的堆栈使用。中断函数通常使用单独的堆栈,需要注意不要溢出。
  2. 堆和栈

    堆和栈是计算机程序中两种主要的内存分配方式。

    • 堆:是动态分配的内存,其生命周期由程序员控制。堆内存的大小不固定,可以在运行时动态改变。堆内存的分配和释放需要手动进行,如果不正确地管理堆内存,可能会导致内存泄漏或者其他问题。

    • 栈:是自动分配和释放的内存,通常用于存储函数的局部变量和函数调用的上下文信息。栈内存的大小在函数调用时确定,函数返回时自动释放。栈内存的分配和释放速度很快,但是空间有限,如果使用过多的栈内存,可能会导致栈溢出。

  3. ping的工作原理

    ping是一种网络诊断工具,用于测试主机之间网络的可达性。它的工作原理基于Internet控制报文协议(ICMP)。

    ping工具发送一个ICMP Echo请求报文到目标主机,如果网络连接正常,目标主机会返回一个ICMP Echo回应报文。通过测量发送请求和接收响应之间的时间差,ping可以计算出网络的延迟。

    如果没有收到回应报文,ping会报告网络不可达。这可能是由于网络故障,或者目标主机的防火墙设置阻止了ICMP报文。

  4. 手撕:两个链表的第一个公共节点

    这是一个经典的链表问题,可以通过两个指针解决。首先,创建两个指针pA和pB,分别指向两个链表的头节点。然后,同时遍历两个链表,如果pA到达链表的末尾,则将pA重定向到另一个链表的头节点;如果pB到达链表的末尾,则将pB重定向到另一个链表的头节点。如果两个链表有公共节点,那么pA和pB会在公共节点处相遇。如果没有公共节点,那么pA和pB会在遍历完两个链表后同时为null。

    这个算法的时间复杂度是O(N),空间复杂度是O(1),其中N是两个链表的长度之和。

小米
freertos的三个任务进行调度,从os的角度解释下这三个任务如何调度,三个任务哪个优先级较高
git常用命令

在FreeRTOS中,任务调度是由调度器(scheduler)负责的,它决定哪个任务应该在特定的时间运行。调度器的工作方式主要取决于任务的优先级,状态和系统的调度策略。

  1. 任务的优先级:在FreeRTOS中,每个任务都有一个关联的优先级,

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值