这几天陆陆续续又在复习和面试了,毕业已经快两个月了。复盘一下两个月的生活吧。
两个月玩的时间其实占了大多数,因为面试机会没几个,大多时间都是,等待面试机会,网上自学一下有的没的专业内容,为了让自己更好的记忆,还是写下来吧。
因为很多公司的需求各不相同,而且只是个普通本科应届生,所以任重道远呀。大概就应了那句话,硕士遍地走,本科皆是狗。前几次公司面试的时候有问我实时操作系统有没有了解过,我说知道但不了解,然后面试的三天后就收到了gg的消息。虽然其实我觉得主要原因是面试官问我的问题我都回答的不是很完整吧,就是都回答的有正确的点,但都不全,没那么流畅,所以就被pass了,也可能因为freertos吧,所以决定去学一学。说到这里,再复盘一下面试过程?
到公司之后人事很有和气的带我到面试的会议室,让我先填个面试信息的表格,填着填着就进来三哥们,我以为也是来面试的,抬眼看了一下他们就没管,直到他们坐下齐齐看着我。哈哈,说实话,没被三个一起面试过,最多两个人。
三个老大哥看起来应该是,两个90后,一个80后,两个90后分别负责嵌入式软硬件的面试,另外一个没怎么问我,问了我一些以前公司的事情。相比于大多公司面试的人,三哥们挺好的了。
开局先自我介绍,之后就是硬件的面试官问我,能不能看懂电路图什么的,知不知道给硬件高低电平,我说我知道,让他问我你用的那个开发板主频是多少,我一听有点迷糊,主频?是2.4GHZ那个吗,好像不是吧。然后跟他说我没注意过,他说,不知道也没事(我当时产生了以为真没事的错觉,真是年轻啊)。
软件的面试官问我的问题我有点记不全了,说一下我记得的吧。
一、数组和链表的区别:一般来说可以从三个方面说,逻辑关系(数组和链表都是线性关系);存储方式(数组只能连续储存,链表可以连续也可以不连续);访问方式(数组访问通过下标访问,链表需要指针一个结点一个结点的访问 数组的增删改需要对内存片进行操作,链表的增删改就是对结点的增删改,用指针访问到那个结点的位置然后进行增删改就好了,效率高点)。
还有一种我看到的网上稍微全面的回答:
1)逻辑结构。数组必须实现定义固定的长度,不能适应数据动态的增减的情况,即在数组使用前,就必须确定数组的大小。当数据增加时,可能超出原定义的元素的个数,当数据减少时,造成内存浪费。数组中插入删除数据项时,需要移动其他数据项。而链表采用动态分配内存的形式实现,可以适应数据动态增减情况,需要时可以用new/malloc分配内存空间,不需要时用delete/free将已分配的空间释放,不会造成内存空间的浪费,且可以方便的插入,删除数据项。
(2)内存结构。(静态)数组从栈中分配内存空间,对于程序员方便快速,但是自由度小。链表从堆中分配空间,自由度大,但申请管理比较麻烦。
(3)数据中数组的内存是顺序存储的,而链表是随机存取的。数组随机访问效率很高,可以直接定位,但插入删除操作的效率比较低。链表在插入删除操作上相对数组有很高的效率,而如果访问链表中的某个元素,那就要从表头逐个遍历,直到找到所需要的元素为止,所以链表的随机访问效率比数组低。
(4)链表不存在越界问题,数组有越界问题。数组便于查询,链表便于插入删除。数组节省空间但是长度固定。链表虽然变长,但是占了更多的存储空间。ps:感觉好多,感觉和我那个差不多的。
二、数组和链表哪一个存储的速度快,我经过一番我自己的理由辩解,得出了数组效率高。(什么理由还是去查一下吧,其实我觉得我自己说的很有道理,我是这样说的,数组直接申请空间(我想到了动态数组但我没说),链表需要手动malloc,所以数组更快),面试官说委婉一笑,说结论是对的。
三、让我讲了一下IIC,然后说了一下IIC和spi的区别:(我没想到会问这个,昂有好久没看了所以回答的有点少)
IIC是串行同步半双工的通信协议,有三根线,一根时钟线两根数据线,需要上拉电阻才能让总线在空闲状态时保持高电平,讲了一下IIc的四个信号是干什么的,起始信号,停止信号,应答、非应答信号。
IIC和SPI的区别:
IIC:串行同步半双工、三根线、主从机制,一般都是单主单从,有应答机制,速度最高是3.4Mbits。
spi:串行同步全双工、三/四根线、主从机制、没有应答机制、根据片选线确定从机,传输速率是系统时钟的1/2,比IIC高得多。
四、IIC和spi怎么找到从机的
IIC传输数据时:起始信号+七位从机地址、写位+应答+八位寄存器地址+应答+八位数据位+应答+停止信号
SPI是根据拉低哪条片选线选择从机的。
五、按键防抖:写个延时函数
六、uboot启动流程(这个我答的最烂,虽然我平时有重点复习这个,但是一次没遇上问就基本忘了,这次踩雷了):我自己总结了十个步骤
汇编启动部分:
1.设置异常向量表
2.关闭中断,设置svc
3.禁止mmu、禁止chache,禁止看门狗
4.初始化内存、网口、时钟
5.设置栈空间、代码自搬移
6.清除bss段,跳转到c代码
C语言启动部分
7.初始化大部分硬件串口内存全局变量
8.代码重定向
9.将内核从flash、sd、emmc中读取到ram中
10.根据设置好的uboot自启动参数、命令启动
ps:说实话,启动流程不好理解,而且还是没人跟你探讨的情况下,网上查资料去看那些启动流程的源码我也看过一些,各种宏定义函数,很多很多很多,看的我人都麻了,如果有懂得人带着去理解,我觉得效率高得多。突然记起来之前有面试官打电话问我uboot启动流程,我大概说了一下,他问我你懂不懂具体是怎么启动的,我说我自己在网上有看过但没看懂,然后面试官电话里表现出的各种不屑和嘲讽,记忆挺深刻的。
7.问我之前单独做但没写完的项目,问我了解dds协议吗,我说不了解(老实有罪)。。。
dds协议:是一种实时的分布式中间通信协议,采用订阅、发布式架构,有两层API(可用性上层的上层DDS和聚焦通道的底层rtps)
四层架构:应用层、FastDDS层、RTPS层、通道层
......看了下,我发现我以前其实是了解过的,但是好复杂估计就大脑待机了。
面试大概就这些,其他也没问啥,问了我个人有没有问的,我问了一下不太专业的问题,问了一下芯片使用,产品,出差,是否有人带的问题,没了。
那个80后的面试官还小声的提醒了一下说应届生,不要这么问。
说实话,这样就挂了挺不服气的,但我自己的表现也确实不亮眼。加油吧!