项目问答

💡通用技能类问题

(对应你的技能描述部分)

  1. 你在项目中是如何进行模块化编程的?
    → 考点:代码结构设计、函数封装、模块解耦思维。

    在我的项目中,我尽量将每个功能进行独立封装,使其尽可能独立。比如在车控系统中,油门,刹车,胎压监控等功能模块分别设计成独立的单元,其实也是模仿了SquareLIne Studio低代码ui设计软件导出的ui文件夹格式,每个模块都通过接口与其他模块进行通信。这不仅提高了代码的可维护性,也方便后期的扩展和调试。每个模块有明确的输入和输出,减少了模块间的依赖关系,确保了系统的稳定性。

  2. 你使用 FreeRTOS 时,任务之间的通信是如何实现的?
    → 考点:队列(Queue)、信号量(Semaphore)、互斥锁(Mutex)。

    在FreeRTOS时,任务之间的通信通常使用信号量或队列。在我的遥控器项目中,我使用了队列集来传递来自遥感电位器ADC传感器的数据。此外,任务间需要同步时,我也是用了互斥锁信号量来保护共享内存。

  3. 你在多线程编程中如何避免资源竞争?
    → 考点:互斥锁、信号量、临界区。

    在多线程编程中,为了避免资源竞争,我使用了互斥锁(mutex)和信号量来保证共享资源的互斥访问。在我的云智平板项目中,为了避免音乐播放时界面更新产生冲突,我使用了互斥锁来保护音乐控制和播放控制的共享资源,确保多个线程不会同时操作。

  4. 你在Linux环境下调试过哪些问题?怎么排查?
    → 考点:gdb、top、dmesg、系统文件查看等工具使用。

    在linux环境下,我遇到了一些栈溢出的问题,也就是内存问题,比如访问了非法内存,这个时候程序会发出一个“ Segmentation Fault)”的段错误,这个时候我们可以使用linux的gdb指令,我们可以使用gcc -g xxx.c -o output,来生成一个可以被gdb命令执行的可执行文件output,然后通过gdb output,来执行output可执行文件,然后在调试窗口,执行run,就可以找到那个地方发生了段错误。

  5. 请说说你对TCP/IP协议的理解,它和UDP的主要区别是什么?
    → 考点:可靠传输 vs. 实时性,连接方式与应用场景。

  6. 你是如何使用Git进行团队协作的?
    → 考点:分支管理、冲突解决、提交规范。

    在团队协作中,我使用Git进行版本控制,严格遵循分支管理的规范。通过我们会将每个功能点创建一个新的分支,开发完成后通过Pull Request提交到主分支,并进行代码审核,我会确保提交信息简介明了,便于团队成员理解每次提交的目的。我还会定期拉取主分支代码,避免冲突。

  7. 在嵌入式调试中,你如何利用J-Link或逻辑分析仪?
    → 考点:信号时序分析、断点调试、串口抓包。

    对于J-Link来说,对Windows11不太友好,我一般用的是JTlink烧录器,用JTlink来进行debug单片机 也是可以的,我们在debug过程中,可以通过在程序编辑窗口左边进行打断点,也可以通过快捷键ctrl+B进行查看断点的情况以及添加断点,如果程序卡住了,用debug进行也是蛮不错的,可以通过打断点进行检查,这个程序卡在了那个位置。

    对于逻辑分析仪来说,一般用于捕获和分析数字信号,比如定时器的波形和频率和周期什么的,只需要两根线,一根接GND,一根接你需要捕获的数字信号。也可以把它用来测试那个io的高低电平,如果逻辑分析仪亮了,证明是低电平,如果是暗的,就是高电平。


🚗 车控显示系统(LVGL 仪表盘)

  1. 油门控制和胎压、油表之间的关系是如何设计的?
    “在设计油门控制与胎压、油表的关系时,我们建立了一个参数映射模型。油门控制通过调整转速来控制车速,车速又间接影响胎压和油表的读数。例如,随着车速的增加,胎压需要相应增加以保证轮胎的正常工作;油量与油表的关系则根据油门开度、油耗率和剩余油量进行计算。我们在系统中实现了实时的数据采集与动态调节,确保车辆各项参数的联动与实时性。”
  2. 你在LVGL界面开发中遇到的最大难点是什么?怎么解决的?
    “在LVGL界面开发过程中,最大的挑战是内存管理和刷新效率问题。由于嵌入式系统内存有限,LVGL图形界面所需的内存和刷新频率较高。在解决这个问题时,我通过优化界面更新机制,避免了频繁刷新整个界面,并利用层次化的界面元素来减少内存消耗。此外,我使用了延迟刷新策略,根据实际需求只更新需要变化的部分,确保了系统流畅运行。”
  3. 系统是如何检测油量过低或油温过高的?
    “油量和油温的检测依赖于传感器采集的数据。我们通过模拟油量传感器和温度传感器的输入,当油量低于设定阈值或油温超过预设限值时,系统会触发报警逻辑。报警信号会通过图形界面实时显示警告标志,并通过蜂鸣器发出声音提示。这一过程使用了中断机制来确保实时响应。”
  4. 左/右转向灯的逻辑是怎么设计的?
    “转向灯的控制逻辑基于简单的状态机设计。当用户按下转向灯开关时,系统会通过GPIO控制左右转向灯的闪烁状态。闪烁的频率和持续时间是通过定时器控制的,确保转向灯在预定时间内闪烁。同时,我们还在仪表盘界面上显示转向灯的状态,确保驾驶员能够清晰地看到当前的操作。”
  5. 项目中的“算法设计”具体指什么?
    “项目中的算法设计主要包括两部分:首先是油量、油温、车速与胎压之间的动态关系建模,保证各个模块能根据实时数据进行智能调整;其次是图形界面上的数据展示与更新算法,包括数据的平滑处理和实时更新机制,确保界面显示的准确性和流畅性。”

📱 云智平板项目(LVGL + MQTT + API + 多线程)

  1. 天气显示模块中数据是如何从API获取并显示的?
    “在天气显示模块中,我使用libcurl库发起HTTP请求,获取JSON格式的天气数据。获取到的数据通过cJSON库进行解析,提取出需要展示的信息,如温度、湿度、天气状况等。为了确保实时性,我在系统中设计了定时器,每隔一定时间就刷新一次天气数据,并更新界面上的显示内容。”
  2. 你如何解决音乐播放器界面卡顿的问题?
    “音乐播放器卡顿问题主要是由于界面更新和音频播放共享同一线程导致的。在解决此问题时,我将音频播放任务和UI更新任务分别放在不同的线程中,通过FreeRTOS的任务调度来保证每个任务的优先级和响应时间。同时,使用互斥锁来保护共享资源,确保音频播放和UI更新不会互相干扰,从而消除了卡顿现象。”
  3. MQTT协议在你的项目中起什么作用?
    “MQTT协议在我的项目中主要用于实现聊天机器人模块的实时通信。客户端通过MQTT协议将用户输入的消息发送到服务器,服务器通过API调用ChatGPT接口获取回复,并通过MQTT将回复消息推送到客户端显示。这种发布/订阅模式使得通信非常高效且低延迟,非常适合我们的实时应用场景。”
  4. 为什么选择用LVGL来开发平板的UI?
    “选择LVGL是因为它是一个轻量级且高性能的嵌入式图形库,特别适合资源有限的嵌入式设备。LVGL支持丰富的UI组件,并且能够优化内存和CPU的使用,这对于我的云智平板项目非常重要,特别是要在嵌入式系统上实现流畅的用户界面。此外,LVGL的跨平台特性也使得项目开发更加高效。”
  5. CPU信息监控模块的数据更新机制是怎样的?
    “CPU信息监控模块通过读取Linux系统中的/proc/stat和/proc/meminfo文件来获取CPU和内存的使用情况。为了确保信息的实时性和准确性,我使用了定时器定期读取这些文件,并将数据更新到UI界面上。每次更新时,我会使用LVGL的Arc控件来展示CPU和内存的占用率,确保用户能够清晰地看到系统的负载情况。”
  6. 你如何保证多模块同时运行时系统的稳定性?
    “为了保证多模块的稳定性,我在系统中设计了合理的任务优先级和资源保护机制。使用FreeRTOS对不同的任务进行调度,确保实时性任务优先处理。我还通过互斥锁和信号量等机制来保护共享资源,避免多任务间的资源竞争,确保系统在多任务同时运行时的稳定性。”

🤖 平衡车项目(STM32 + MPU6050 + PID + FreeRTOS)

  1. 平衡算法的核心是什么?
    “平衡算法的核心是PID控制原理。通过实时测量小车的俯仰角、翻滚角和偏航角,PID算法根据这些误差进行调整,通过比例(P)、积分(I)和微分(D)来优化控制效果。比例项用于响应当前误差,积分项修正长期累积误差,微分项则对短期误差进行预测,从而使小车保持平衡。”
  2. MPU6050姿态数据是如何计算的?
    “MPU6050的姿态数据通过加速度计和陀螺仪的融合计算得到。加速度计用于检测重力方向,陀螺仪则提供旋转角速度信息。为了提高姿态计算的准确性,我使用了互补滤波算法,将加速度计和陀螺仪的数据加权融合,以减少噪声和漂移,从而得到准确的俯仰角、翻滚角和偏航角。”
  3. 你是如何调节PID参数的?
    “在项目中,PID参数的调节是一个反复实验的过程。我使用了Ziegler–Nichols调节法来初步设置PID参数,并根据实际测试效果对参数进行微调。通过调整比例、积分和微分的系数,我能够优化系统的响应速度和稳定性,减少小车倾斜时的过度调整或滞后。”
  4. FreeRTOS在项目中扮演什么角色?
    “FreeRTOS在平衡车项目中主要负责任务调度和资源管理。我们将不同的任务(如传感器数据采集、PID计算、控制信号输出等)分配给不同的线程,并通过FreeRTOS的调度机制保证这些任务能够实时、高效地执行。FreeRTOS的任务优先级机制和时间片轮转调度确保了系统在多任务环境下的稳定运行。”
  5. 系统如何判断小车倾倒?
    “系统通过实时监测小车的俯仰角和翻滚角来判断是否倾倒。当俯仰角或翻滚角超过设定的阈值时,系统会触发保护机制,立即调节电机以恢复平衡。PID算法在这里起到关键作用,通过不断调整