面试得很广,从硬件、软件、基础知识、简历内容都有涉及。
整个面试持续了将近三个小时,由三位面试官轮流来问,分别偏重硬件、软件、以及综合,但总的来说还是围绕
简历和
基础知识来问的。
第一位面试官面的比较偏重硬件,分别问了:
- 数据传输的时候如果上下升延双倍速率采集数字信号的话,如果有一个边沿正好采集到数字跳 变时怎么办(我回答是从布局布线、建立保持时间以及FPGA的引脚约束相关方面来回答的);
- 模电中的运放,叫画一个求对数的电路,表示好几年没复习过,完全忘了,面试官表明还是很注重基础的;
- 由于面试得是小米的智能家居相关部门,而面试得这个团队产品上用的操作系统不是linux,而是类似ucos这样的,问了好一些进程间同步及通信的手段,也就是自旋锁、信号量这些东西的原理,还叫自己实现自旋锁;
- 看我FPGA有相关经验,叫用Verilog写了个计数器;
- 单向链表的排序;
- 快速排序;
- C语言的一些基础知识(volatile、const、static、指针之类的);
第二位面试官稍微偏软一些,问的都是软件相关的问题:
- 实现memcpy(char*dest,char*sor,size_t size);
- 写一个宏OFFSET,已知结构体中一个成员,求出该成员在结构体中的内存偏移量,
#define OFFSET(type,member) ((size_t)&(((type*)0)->member))
- 结构体中的内存分布等;
- 出了一个题,已知有一个硬件计数器控制该计数器有两个寄存器,一个用于设置时钟的初始值,一个用于设置时钟的门限值,当时钟初始值设置好后开始计数,当计数值达到门限值后,便会触发一个函数的执行,让我编写两个函数,分别实现1:在任意时刻能够设置多少时间后触发某个函数的执行;2:在任意时刻能够取消之前设置的执行任务;(解决思路是用链表实现一个最小优先队列,设置任务对应着队列的插入,到时间执行和删除对应着优先队列的结点的删除,触发时跳到相应的函数中就行了);
最后一个面试官由于时间不足了,只问了一个比较发散的问题:
- 假设有一个很大的文件,里面的数据结构如下:
XXX.XXX.XXX.XXX(IP地址) 天气;如192.168.1.1 晴转多云
问怎么用最快的方式找到一个地区的天气状况(IP地址往往与地区有着对应关系)。我回答的思路是在存储文件的时候就将每一条信息对齐(即占用大小一样的地址),然后使用二分法搜寻每一个IP段的位置,移动文件指针即可(O(lgn));
当然,还问了些许关于简历上的项目,总的来说,问的很杂很多,但不会很难;