9.24 面试复盘
1.关于atomic和mutex的区别2.项目描述3.自我介绍您好我本科专业是环境科学但因为自己比较喜欢编程所以从大学期间开始系统学习 C。目前主要掌握 C、数据结构、Linux、多线程以及 Qt 开发。C方面学习过面向对象、STL、内存管理等基础知识也通过技术博客和项目进行巩固。Linux方面主要学习了常用命令、进程线程以及多线程同步。项目方面我做过一个基于 Qt 的音乐播放器以及一个仿 muduo 的高并发服务器对 Qt 开发和 Linux 网络编程都有一定实践。实习期间主要负责 Qt 上位机开发其中比较核心的是 FPGA IQ 数据采集链路包括 UDP 通信、协议封装、数据包重排、IQ 数据处理、实时显示和数据落盘。目前我希望找 C/Qt、Linux C 或网络编程相关的开发岗位。4.你为什么专业是环境科学却来做 C我本科虽然是环境科学但我在大学期间逐渐发现自己对编程和计算机系统更感兴趣所以从 C 开始自学。最开始主要学习数据结构和 C 基础之后为了真正做项目又继续学习 Linux、网络编程、多线程和 Qt。我不是只停留在课程学习而是通过音乐播放器、服务器以及实习项目不断验证自己是否适合这个方向。到实习以后我实际参与了 FPGA IQ 数据采集和 Qt 上位机开发也进一步确定自己希望以后从事 C 开发。5.你 Linux 学到了什么虽然我不是科班出身但系统自学了 Linux 开发知识并且写了 Reactor 网络项目落地。Linux 基础命令、Makefile、gcc/gdb 调试静态库动态库进程、线程、信号线程同步互斥互斥锁、读写锁、自旋锁、信号量基础 IO、fd、mmap 内存映射进程间通信 IPCExt 文件系统Socket 网络编程TCP/UDP、HTTP/HTTPSARP、DNS、NAT会 tcpdump 抓包。 我基于这些知识用 C 实现主从 Reactor 高并发 TCP 服务器使用 epoll IO 多路复用将 Linux 网络、多线程、IO 相关知识做了实战。6.你实习主要做什么我实习主要负责频谱监测设备的 Qt 上位机开发其中我负责的核心模块是 IQ 数据采集链路。具体来说上位机需要接收 FPGA 通过 UDP 发送过来的 IQ 数据我负责了应用层通信协议的封装和对接之后实现 UDP 数据接收、数据包重排、IQ 帧重组、数据处理和 Qt Charts 实时显示同时还负责原始 IQ 数据的文件落盘。7.你说协议封装具体怎么做的协议主要分成控制命令和数据包两部分。控制方向由上位机根据采集参数组装命令发送给 FPGA数据方向由 FPGA 按照约定的数据结构封装 IQ 数据。数据包中包含当前包的packet_id、这一帧的total_packets、当前有效数据长度packet_length以及 IQ 数据 payload。我们和硬件工程师确认这些字段的定义后上位机根据packet_id把收到的数据放到对应的缓存位置最后根据total_packets判断一帧是否接收完整。8.UDP 为什么会乱序因为 UDP 本身不提供可靠、有序的传输保证所以发送端连续发送多个数据报之后接收端不能假设它们一定按照发送顺序到达。因此我们在应用层协议中增加了packet_id接收端根据这个序号把数据包放回对应位置从而完成乱序重排。9.你们 UDP 有没有考虑丢包我们在应用层通过 total_packets、packet_id 和 packet_length 对 IQ 数据进行分包和组帧。UDP 本身不保证可靠传输所以理论上存在丢包问题。对于实时频谱监测场景如果为了一个丢失的数据包阻塞等待重传会增加处理延迟因此是否重传需要根据应用场景权衡。如果是实时监测可以选择丢弃当前不完整帧继续处理下一帧如果是对原始 IQ 数据完整性要求较高的采集场景则可以结合 FPGA 侧缓存设计 ACK/NACK 和重传机制。10.你介绍一下你在这个项目中主要负责什么整个数据链路是怎么样的我主要负责 IQ 数据接收和后处理这一部分。FPGA 将一帧原始 IQ 数据分成多个 UDP 数据包发送到上位机我负责接收并解析数据根据包序号、总包数和包长度等信息对数据进行重排和组帧放入应用层缓冲区。之后根据配置的抽取参数对 IQ 数据进行处理再通过 Qt 的跨线程消息机制将处理后的数据投递到 UI 主线程使用 Qt Charts 绘制实时 IQ 波形。同时将原始 IQ 数据保存为 BIN 文件便于后续分析和数据回放。11.如何判断缺包、如何决定等待还是放弃一帧为单位,用包序号判断是否收齐0到N-1号包;在一个很短的超时窗口内等待剩余包,超时仍缺则记为不完整帧。不阻碍实时显示,并记录完整率作为质量指标。这个做法和实时业务目标一致,在取舍上更偏向可用性而非传输完美无缺。12.颜色地址Pastel Color Tones Color Scheme - Palettes - SchemeColor.com13.讲一讲什么是信号和槽机制信号槽是 Qt 元对象系统提供的对象间通信机制用来解耦。 moc 在编译预处理阶段扫描头文件生成元对象相关代码。调用 connect 的时候会把槽函数注册到这个信号对应的回调链表里面不是全局哈希表。 emit 发射信号的时候会遍历该信号绑定的所有槽函数传递参数并执行。 信号是事件发生时对外发出的通知没有函数体但可以携带参数必须写在 signals 下通过 emit 触发。 槽本质就是成员函数。Qt5 新的函数指针 connect 语法普通成员函数不需要写 slots 关键字也能作为槽槽的作用就是收到信号后执行业务逻辑。14.请问槽函数的执行是同步的还是异步的15.你们的设备的协议是如何规定的我们项目没有直接使用 HTTP而是基于 UDP/TCP 之上的自定义二进制应用层协议。代码中的这些 struct 相当于协议报文的数据结构定义程序根据结构体填充同步字、长度、请求 ID、命令字以及具体参数然后经过协议封装/序列化通过 Socket 发送给设备设备按照相同的字段约定进行解析。16.你在简历中写的数据完整率是什么意思你怎么证明是你的分包方案把 90% 提升到了 95%原来的数据传输以一帧 IQ 数据为单位一帧大约 4096 Byte数据量较大。后来我在协议层增加了帧 ID、包序号、帧长度等字段将一帧数据拆分成多个较小的数据包进行传输。接收端根据帧 ID 和包序号进行重组并以完整帧作为统计单位计算数据完整率使完整率从原来的约 90% 提升到了 95%左右。我通过实际运行测试对修改前后的数据完整率进行了对比。在相同测试条件和测试时长下修改前完整率大约 90%增加协议字段并进行分包重组后完整率提升到约 95%。这里的完整率是按照完整 IQ 帧数量与理论应接收帧数量的比例进行统计。项目中原先通过senddatastruct.h和receivedatastruct.h分别定义上下位机之间的控制命令和接收数据结构后续通过NewProtocol.h重新定义了一套统一的协议报文其中Packet_Command负责参数配置Packet_Data负责分包数据传输。相比旧协议新协议最大的变化是协议结构更加统一。旧协议主要按照发送命令和接收数据分别定义结构新协议则把命令和数据统一封装成标准数据包并且对数据分包中的总包数、包序号、有效长度进行了明确描述更方便上位机进行协议解析和IQ数据的组帧处理。17.你的频谱上位机开发为什么要用dialog而不是widget18.如何确定一包数据是否完整到达19.如何解决cpu问题我的实现中每 100ms 检查一次数据更新状态如果允许绘制就通过 QtConcurrent 异步执行 paint。paint 内部需要复制采集数据、进行数据抽取以及最大保持、最小保持、平均等轨迹处理最后再更新 Qt Charts 曲线。因此数据量较大或者刷新频率较高时CPU 开销主要来自数据处理和图表重绘。为了控制开销我做了复用缓冲区、预分配以及超过 5000 点时进行 max/min 抽取等优化同时通过原子标志避免 paint 重入。”20.C中常用的四个类型转换是什么分别适用什么样的场景

相关新闻

数字化转型实践方法⑨|点·线·面推进法:不要一上来就全公司全盘数字化

数字化转型实践方法⑨|点·线·面推进法:不要一上来就全公司全盘数字化

介绍 “点・线・面” 推进策略;优先做必要的信息数字化,不必一次性全量数字化全部资料;从过程数字化切入,举动态定价需要历史销售数据作为示例。上一篇文章我们聊了速赢——如何在3个月内通过业务改善打开局面。但很多企业走到这一…

2026/10/24 14:30:20 阅读更多 →
蓝牙芯片驱动开发-第5章第6题-如何根据优先级合理分配DMA通道

蓝牙芯片驱动开发-第5章第6题-如何根据优先级合理分配DMA通道

蓝牙面试题解析:如何根据优先级合理分配 DMA 通道? 难度:⭐⭐⭐⭐ 较难 | 场景:社招二面/三面、MCU 驱动设计 | 高频:🔥🔥🔥🔥 标准答案 DMA 通道分配遵循 高优任务独占 + 低优任务共享 + 静态预留 + 动态调度 的原则: ① 蓝牙 SoC 中的典型 DMA 通道分配 // …

2026/10/24 21:40:59 阅读更多 →
蓝牙芯片驱动开发-第5章第7题-在多DMA通道的资源竞争中如何避免冲突

蓝牙芯片驱动开发-第5章第7题-在多DMA通道的资源竞争中如何避免冲突

蓝牙面试题解析:在多 DMA 通道的资源竞争中如何避免冲突? 难度:⭐⭐⭐⭐ 较难 | 场景:社招二面/三面、MCU 驱动 | 高频:🔥🔥🔥🔥 标准答案 多 DMA 通道冲突通过 仲裁优先级 + 通道隔离 + 队列缓冲 + 监控 四层机制避免: ① DMA 仲裁机制 // STM32 DMA 仲裁器工…

2026/11/2 0:39:45 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/3 1:09:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/3 2:27:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/3 10:57:33 阅读更多 →

日新闻

周新闻

月新闻