秋招日记
大三暑假实习:拿到了东信和平的offer,最后去珠海实习了两个月,体验了上市国企的日常工作及生活,对接下来的秋招有了更加明确的方向。
学习经历
大一下学期结束后的那个暑假,加入了嵌入式实验室,一待就是三年。从刚开始的玩STM32单片机,学习Linux基础知识;到之后开始接触像处理相关知识,学习了计算机视觉OpenCV,ResNet、YOLO系列网络模型,学习了Pytorch、tensorflow网络框架;
大二上学期参加了一个喷码机项目小组,通过这个项目学习Python基础语法,学习PyQT的使用,学习了PLC通信的基础知识,在项目期间还学会了如何通过阅读英文手册进行项目的开发
大二下学期参加并负责中国大学生工程训练大赛智能垃圾分类的视觉代码开发
大三上学期学习了ROS机器人操作系统,学习了分布式通信机制,学习了如何绘制PCB板,学习硬件基础知识,自己制作了一台基于ROS的智能小车;到后面不断地参加比赛,最印象深刻的是参加了RoboCup智能车比赛并获得了国家一等奖;
大三下学期协助导师开展Linux驱动教学,并制定uboot移植、Linux内核移植、根文件系统搭建、LED驱动开发实验手册,同时学习了FreeRTOS实时操作系统,并且在实训时完成了一个基于FreeRTOS的智能预警项目;在此期间和华南理工合作一个喷头驱动项目,学习了FPGA的使用。
秋招期间总共投递了50多家企业,每天都是早上9点左右起床,到实验室准备笔试面试一直到晚上10点左右回宿舍,持续了一个月左右,很累但是很值得!
实习经历
大三下学期,去到了东信和平智能卡股份有限公司实习,实习期间,担任了USBKEY实习小组项目负责人,主要负责了智能卡JavaCard应用的开发,以及协调小组内各个模块的联调。在实习过程中,还是交到了许多朋友,带我的导师也教会了我许多智能卡领域的专业知识,公司的领导对我们实习生还是很关心的,我也从我们副总身上学到了许多管理方面以及待人方面的知识。
总的来说,在我实习的这两个月里,每天都会有项目在Push你向前走,每一天都过的很充实,也十分感谢公司的培养和信任!
Offer收获情况
08月29日收到超睿科技Offer09月01日收到东信和平Offer09月13日收到星宸科技Offer09月21日收到比亚迪Offer09月24日收到美的Offer09月28日收到紫光同创Offer
投递公司情况
2022年08月10日
超睿科技–系统软件工程师08月12日已完成笔试08月23日已完成面试08月29日收到Offer岗位:系统软件工程师;地点:长沙
2022年08月27日
oppovivo紫光同创–嵌入式软件开发工程师09月02日已完成技术一面09月22日已完成笔试09月28日已收到Offer
工作:软件开发;岗位名称:嵌入式软件开发工程师;地点:深圳
2022年08月29日
TCL–软件驱动工程师
2022年08月30日
比亚迪–软件开发工程师09月17日已完成面试09月21日收到Offer工作:软件开发;岗位名称:软件开发工程师;部门:商用车研究院;地点:长沙
2022年09月04日
2022年09月05日
海康威视–软件开发工程师
09月07日已完成测评09月08日已完成笔试09月22日已完成技术面等待HR面
2022年09月06日
寒武纪–系统软件开发哈啰出行–嵌软ROS蔚来NIO–嵌入式软件开发09月10日已完成笔试泡池子ing小鹏汽车–嵌入式软件开发CVTE–嵌入式软件工程师目前公司的主营业务为液晶显示主控板卡和交互智能平板等显控产品的设计、研发与销售,建立了教育数字化工具及服务提供商希沃、智慧协同平台MAXHUB等多个业内知名品牌。09月08日已笔试09月16日已一面09月21日已二面09月24日二面挂感受:CVTE是面试的时候要手撕编程题的,所以大家一定要提前做好准备!滴滴出行–自动驾驶创新业务-嵌入式开发工程师09月17日已笔试泡池子ing
2022年09月07日返校
2022年09月08日
2022年09月09日简历改动
将原来的基于深度学习的垃圾投放智能小车项目经历修改为:基于FreeRTOS+Linux驱动的智能预警系统.将原来的基于STM32DAC模块的高精度任意波形实现修改为基于STM32+FPGADAC模块的高精度任意波形实现增加了“抗压能力强”
2022年09月09日
全志科技–嵌入式软件设计工程师泡池子ing海尔富士康09月09日已完成测评09月14日完成笔试09月22日给我打了个电话,让我去面试,拒了中兴通讯–软件开发工程师泡池子ing阿里泡池子ing
2022年09月10日
文远知行Momenta
2022年09月13日
荣耀–嵌入式软件开发工程师泡池子ing海能达–嵌入式软件开发工程师09月23日已完成笔试09月27日已完成技术一面科沃斯机器人–嵌入式开发工程师09月14日已完成测评理想汽车–软件工程师宁德时代–嵌入式软件工程师
2022年09月14日
乐鑫科技360–嵌入式软件开发工程师2022-10-0915:00笔试科大讯飞–嵌入式软件开发工程师09月15日已完成测评2022年-10-0919:00:00–21:00:00笔试商汤科技–浙江中控–嵌入式软件工程师京东方–嵌入式开发工程师09月15日已完成测评海信科技–软件开发工程师09月15日已完成测评、英语口语测试09月20日已完成笔试泡池子ing
2022年09月15日
顺丰科技–无人机应用开发工程师09月15日已完成测评韶音科技–嵌入式软件开发工程师虹软科技–嵌入式驱动开发工程师华勤技术–驱动开发工程师是全球智能硬件平台型企业。秉承改善人们沟通与生活的使命,为全球科技品牌客户提供产品级、系统级、软硬件研发、运营制造的端到端服务。主要产品有手机、平板、电脑、智能穿戴、AlOT、服务器等,是一家软实力较强的硬件公司。总部位于上海。09月15日完成测评、笔试09月21日已完成面试09月23日已完成技术二面等待HR面
2022年09月16日
字节跳动–C++研发工程师-智能创作笔试2022-10-0910:00
2022年09月17日
汇川技术–嵌入式软件开发工程师
2022年09月18日
ThunderSoft中科创达–C/C++开发工程师09月20日已完成笔试09月25日简历挂上海云骥智行–系统开发工程师麒麟信安–LinuxC/C++开发工程师
2022年09月19日
长虹–嵌入式软件开发英威腾–嵌入式工程师中联重科–嵌入式软件开发
各大公司笔面试真题
星宸科技
应聘岗位:Linux驱动工程师
2022年08月13日–笔试
进行了笔试题,选择题主要考的是操作系统的知识、编程题考了求矩形的最大面积、求链表倒数第K个节点。总体来说难度不大,但是要背好八股文以及刷题。
2022年08月18日–技术一面
进行了技术一面,面试的是部门的一个小组长。在面试的过程主要问了很多八股文相关的知识、然后就会展开问一下项目相关的知识点。
0.一定要认真复习笔试题
面试官一上来就对自己的笔试题目进行一个询问,问了编程题的具体实现的细节:包括了求矩形的最大面积、求第K个链表的数据
进程调度时机?
中断处理过程内核线程调用schedule进行进程切换用户态进程无法实现主动调度,只能通过内核态后某个时机点进行调度,即在中断处理过程中进行调度
孤儿进程和僵尸进程?
孤儿进程:
一个父进程退出,而其一个或者多个子进程还在运行,那么子进程将成为孤儿进程。将被init进程所收养,并且由init进程完成状态收集工作
僵尸进程:
一个进程使用fork创建子进程,若子进程退出,父进程没有调用wait或者waitpid获取子进程状态信息,那么子进程描述符仍然保存在系统中。这种称为僵尸进程
请说一下链表跟数组的区别?
答:数组静态分配内存,链表动态分配内存;数组在内存中连续,链表不连续;数组利用下标定位,时间复杂度为O,链表定位元素时间复杂度O;数组插入或删除元素的时间复杂度O,链表的时间复杂度O。
单链表和双链表的区别
答:单链表只有一个指向下一结点的指针,也就是只能next。双链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针,可以通过prev快速找到前一结点,顾名思义,单链表只能单向读取。
双向链表在存储空间上要大于单向链表。
2022年09月06日–技术二面
进行了第二轮的技术面试,面试的是主管。
面试的内容:
问了我一个自己觉得最有成就感的项目,并详细说一下项目中的具体实现的功能问了我关于Linux驱动中自己最熟悉哪一个驱动框架,做过哪些驱动框架。我面试的时候说我比较熟悉字符设备驱动框架,然后面试官就问我关于字符设备驱动框架自己是否实现了驱动函数,并且询问了我自己是否深究了驱动函数的内存分配,比如问了我ioremap函数的具体实现。答:问了我关于虚拟地址转换为物理地址的具体实现,以及多个物理地址转换冲突的问题。答:ioremap函数:几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类。外设寄存器通常被连续编址,分为:IO映射方式:为外设专门实现了一个单独的地址空,称为IO地址内存映射方式:只实现一个物理地址空间,外设I/O端口成为内存的一部分,CPU可以向访问内存单元那样访问外设IO端口,而不需要单独的IO指令驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内,然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。ioremap可以将IO内存资源的物理地址映射成为核心虚拟地址后,我们可以直接操作RAM那样操作IO口内存资源了,但是我们应该要使用Linux的特定函数来访问内存资源,而不是使用指针来访问,比如writel、readl等多个物理地址冲突问题:不同进程的虚地址可能对应着同一块物理地址,映射是可以重复存在的,典型的例子就是我说的共享库,操作系统为了节约物理内存使用,对于同一个DLL,在不同的进程中,其虚地址可能是不同的,但其对应的物理内存可能是同一块**。内核能看到所有进程的页表,自然也就能管理所有进程的内存映射,可以保证不冲突。**问了我关于Linux进程之间如何进行数据的共享的问题,问了我自旋锁、互斥锁的区别,此外还补充了一个读写锁的问题,即读的时候是否可以写入、写入的时候是否可以读取、是否可以同时读取和写入答:读写锁:给临界区加锁,在进行写操作的时候进行互斥;在进行读的时候可以共享访问。问了我关于FreeRTOS实时操作系统和裸机开发的区别,问了我关于Linux操作系统和FreeRTOS实时操作系统的区别答:FreeRTOS是实时操作系统,主要实现了任务调度、内存管理、IPC、中断管理这几个模块,它要求快速的处理任务。但是GUI、驱动框架、shell这些不是核心功能,而linux则是分时操作系统,是一种软实时系统,能够高效利用计算机的资源问了我为什么FreeRTOS实时操作系统可以实现多任务的,而裸机的多任务实现又是怎么样的答:裸机:通过中断实现,根据中断优先级实现,可以实现中断的嵌套;而实时操作系统则是通过任务优先机来实现,通过时间片轮转来实现,由任务就绪队列来确定。问了我关于FreeRTOS实时操作系统做过的项目。问了我Linux驱动做过哪些项目关于FreeRTOS问了我自己实现了一些网络协议栈没,对这种实时性的内核是否进行了一些优化改良。
2022年09月13日–HR面
进行了终面,面试的是HR小姐姐。
面试的内容:
2022年09月13日–性格测试
HR面完之后没过多久就发了性格测试的链接,这个月底谈薪资。
凌云光
应聘岗位:像应用开发工程师
2022年09月10日–笔试
编程题
英文翻译题
摘抄了论文中的一段话,要求翻译为中文,大致是关于3D像重构的内容,关键字stereovision
简答题
摄像头物镜的三个重要参数以及作用答:焦距、相对孔径、视场角。焦距:影响成像的大小,焦距越长,所得的像也越大,放大倍数越大。相对孔径越大,通过的光线越多,在像平面上的像越亮。物镜的视场角决定了在成像面上良好成像的空间范围当焦距f一定时,视场角越大,成像也越大;当成像面的尺寸一定时,焦距越长,视场角越小。开运算和闭运算的作用答:开运算:先进行腐蚀再进行膨胀。作用:消除小的物体,平滑形状边界,并且不改变其面积,可以很好地去除小颗粒的噪声,断开物体之间的连接。闭运算:先进行膨胀再进行腐蚀。作用:用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑边界而不改变其面积。像分割的作用和三种经典的方法答:像分割就是把像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。像识别的基础是像分割,其作用是把反映物体真实情况的、占据不同区域的、具有不同特性的目标区分开来,并形成数字特征。像分割是像识别和像理解的基本前提步骤,像分割质量的好坏直接影响后续像处理的效果,甚至决定其成败,像分割的作用是至关重要的。像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法、基于特定理论的分割方法等3D点云和2D灰度的融合答:
/**
* 将彩色图和深度图合并成点云
* @param matrix 相机内参矩阵3x3
* @param rgb 彩色图
* @param depth 深度图
* @param cloud 输出点云
*/
static void convert(Mat &matrix, Mat &rgb, Mat &depth, PointCloud::Ptr &cloud) {
double camera_fx = matrix.at<double>(0, 0);
double camera_fy = matrix.at<double>(1, 1);
double camera_cx = matrix.at<double>(0, 2);
double camera_cy = matrix.at<double>(1, 2);
cout << "fx: " << camera_fx << endl;
cout << "fy: " << camera_fy << endl;
cout << "cx: " << camera_cx << endl;
cout << "cy: " << camera_cy << endl;
// 遍历深度图
for (int v = 0; v < depth.rows; v++)
for (int u = 0; u < depth.cols; u++) {
// 获取深度图中(m,n)处的值
ushort d = depth.ptr<ushort>(v)[u];
// d 可能没有值,若如此,跳过此点
if (isnan(d) && abs(d) < 0.0001)
continue;
// d 存在值,则向点云增加一个点
PointT p;
// 计算这个点的空间坐标
p.z = double(d) / 1000; //单位是米
p.x = (u - camera_cx) * p.z / camera_fx;
p.y = (v - camera_cy) * p.z / camera_fy;
// 从rgb图像中获取它的颜色
// rgb是三通道的BGR格式图,所以按下面的顺序获取颜色
Vec3b bgr = rgb.at<Vec3b>(v, u);
p.b = bgr[0];
p.g = bgr[1];
p.r = bgr[2];
// 把p加入到点云中
cloud->points.push_back(p);
//cout << cloud->points.size() << endl;
}
// 设置并保存点云
cloud->height = 1;
cloud->width = cloud->points.size();
cout << "point cloud size = " << cloud->points.size() << endl;
cloud->is_dense = false;
}
int main(){
cv::Mat cameraMatrix; // 从文件加载相机内参
cv::Mat rgb; // 从相机得到RGB彩色图
cv::Mat depth; // 从相机得到depth深度图
PointCloud::Ptr pCloud = PointCloud::Ptr(new PointCloud);
convert(cameraMatrix, rgb, depth, pCloud);
}
3D点云拼接答:3D点云包括了像的X,Y,Z坐标,需要根据camera_fx、camer计算点的空间坐标,而2D灰度包包括了颜色坐标。通过灰度直方来判断灰度,以及如何改善灰度的视觉效果
答:通过像中灰度值的分布区域来划分判断。
我们可以通过灰度变换来使原来像的某些部分区域特征增强,使片变清晰。主要算法有:
对数变换、指数变换、gamma变换gamma>1,较亮的区域灰度被拉伸,较暗的区域灰度被压缩的更暗,像整体变暗;gamma<1,较亮的区域灰度被压缩,较暗的区域灰度被拉伸的较亮,像整体变亮;直方均衡化步骤:统计每个阶级灰度值的数量计算每个阶级灰度值出现的概率将每个概率的灰度值以前缀和的形式累加将片代入计算,p[x,y]*img[x,y]
2022年09月21日–一面
2022年09月23日–二面
2022年09月27日–部门HR面
晚上10点钟左右打电话过来和我洽谈一下工作的事项,主要聊了一下我的工作意愿、岗位的情况。和我说,凌云光主要是招聘硕士为主、本科吸纳优秀的本科生,且本科生一般偏向于前端以及管理路线。
我的工作主要是以python编程语言为主,进行一个定制化的前端任务,后期可以转为研发岗。技术路线的话分为:前期–>后期,管理路线:2年后可转为管理岗位。
级别:L6~L1一般两年后可升为L然后可以转管理岗或者继续走技术路线。
培养方案:导师带领制度,带领6个月,进行深度学习、3D视觉、2D视觉的开发。
应聘岗位:嵌入式软件开发工程师
2022年09月10日–笔试
选择题
进程间通信的方式不包括
共享内存管道消息队列全局变量
答:进程之间需要数据的共享、消息的发送、进程之间的控制,所以需要进程之间的通信。
方式:
管道:半双工通信,由pipe函数在内核中开辟一块缓冲区域用于通讯,read为读取数据,write为写入数据
消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号量:数据操作锁,用来负责数据操作过程中的互斥,同步等功能。信号量就相当于是一个计数器。当有进程对它所管理的资源进行请求时,进程先要读取信号量的值:大于0,资源可以请求;等于0,资源不可以用,这时进程会进入睡眠状态直至资源可用。当一个进程不再使用资源时,信号量+反之当有进程使用资源时,信号量-对信号量的值操作均为原子操作。
共享内存:共享内存是这五种进程间通信方式中效率最高的。但是因为共享内存没有提供相应的互斥机制,所以一般共享内存都和信号量配合起来使用。共享内存不涉及到程序与内核之间的数据传递,节省了时间。
inta和a
答:int*a是数组指针,表示一个数组中有10个int*类型的指针,而a表示a是一个指针指向了一个包含10个int类型元素的数组。
intfun和int)
答:int*fun是函数指针,表示函数的返回值是指针类型的,int;是指针函数,可以通过该指针去调用函数
数组大小动态扩容
答:数组中可以通过malloc函数去申请一块大的空间,然后使用memcpy将数据拷贝到新的数组中去,实现数组的大小动态扩容
ISR可以使用printf嘛
答:ISR为中断服务程序,printf是不可重入的函数,而中断中必须为可重入的函数,所以不能使用printf
注意事项:
ISR不能有返回值ISR不能传递参数ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。不能再ISR中使用printf,printf是不可重入的函数,而中断随时都可能发生,而中断内的函数必须是可重入的
拓展:不可重入和可重入
不可重入函数指的是该函数在被调用还没有结束以前,再次被调用可能会产生错误。其实现的时候通常使用了全局资源,在多线程的环境下若未处理好数据保护和互斥访问,则会发生错误。常见的不可重入函数有:printf--------引用全局变量stdoutmalloc--------全局内存分配表free--------全局内存分配表可重入函数:一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象。
编程题
返回排序后相邻两数的最大差值题目描述:给定一个整形数组arr,返回排序后相邻两数的最大差值arr=[9,3,1,10]。如果排序,结果为[1,3,9,10],9和3的差为最大差值,故返回arr=[5,5,5,5]。返回0。[要求]时间复杂度为O,空间复杂度为O输入:493110输出:6思路:准备n+1个桶,最大值放在n+1个桶内,其余的放在1~n个桶内,1~n个桶内元素为*n/号桶。最大差值为当前桶-前一个非空桶的最大值代码实现:intselectBuket{return*arr_len/);}intbuketSort{if{return0;}intmin_val=INT_MAX;intmax_val=INT_MIN;inti;for{min_val=min;max_val=max;}if{return0;}//标记每个桶的最大值和最小值intmaxs[len+1];intmins[len+1];boolhasNum[len+1];for{maxs[i]=INT_MAX;mins[i]=INT_MIN;hasNum[i]=false;}//接收元素分配的桶号,作为maxs和mins的下标intnumber=0;for{//获取元素桶号number=selectBuket;mins[number]=hasNum[number]?min:arr[i];/*如果有元素则比较,没有则加入*/maxs[number]=hasNum[number]?max:arr[i];hasNum[number]=true;}//找到第一个不为空的桶i=0;intlast_max=0;intres=0;while{if{last_max=maxs[i-1];break;}}/*从第i个桶之后那个值开始寻找*/for{if{//相邻两个桶之间的最大差值比较,大的赋值给resres=max);last_max=maxs[i];}}returnres;}voidtestBuketSort{intnum;cout<<"输入数组长度:";cin>>num;intarr[num];cout<<"输入数组元素:";for{cin>>arr[i];}intlen=sizeof/sizeof;intvalue=buketSort;cout<<"排序后相邻两数的最大差值为:"<
简答题
问:find查找.C结尾的文件,并且将结果显示在标准输出中
答:find./-name"*.c"-print
-print:将查找到的文件输出到标准输出【-execcommand{}】将查找到的文件执行command操作,{}和之间有空格【-ok】和-exec相同,只不过在操作前要询问用户
拓展:2>&1
几个基本符号及其含义
/dev/null表示空设备文件,可以将不需要的信息丢入到该文件当中去。0表示stdin标准输入1表示stdout标准输出2表示stderr标准错误
2>&1:相当于将标准错误等效于标准输出,&代表的是等效的含义,更加高效。此外,**command1>a2>&1与command1>a2>a还是有区别的,区别就在于前者只打开一次文件a,后者会打开文件两次,并导致stdout被stderr覆盖。&1的含义就可以理解为用标准输出的引用,引用的就是重定向标准输出产生打开的a。**从IO效率上来讲,command1>a2>&1比command1>a2>a的效率更高。
e.g.find./-name"*.c">/dev/null2>&1<==>find./-name"*.c"1>/dev/null2>&1
经纬恒润
应聘岗位:嵌入式软件工程师
2022年09月13日–技术一面
主要聊了三个项目,附带两个简单的C语言以及C++基础知识
问了个人在项目中所做的事情,所以一定要对项目中的事情进行总结归纳,对里面的相关的技术要熟悉。问了比赛中的创新点,以及比赛中运用到的知识技术和我详细聊了自己在项目中所用的技术栈C/C++知识:gcc的编译过程:预处理:将宏定义#define的内容进行替换,使用预处理器把源文件test.c经过预处理生成test.i文件gcc-Etest.c-otest.i注:文件大小会比源文件大很多编译:将预处理后的文件转换为汇编代码gcc-Stest.i-otest.s注:文件大小会比预处理后的小汇编:将汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式gcc-ctest.s-otest.o链接:使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件gcctest.o-otest一步到位的编译方法:gcc-otesttest.c#输出名为test的可执行程序,然后可以执行./testunion/struct的区别struct:各个成员有自己的内存,各自使用互不干扰,遵循内存对齐原则,一个struct的总长度等于所有成员的长度之和union:各个成员共用一块内存空间,各个变量共用一个内存首地址。一个union变量的长度至少能够容纳最大的成员变量,而且要满足所有成员变量类型大小的整数倍。大小端模式影响:大端模式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。反问:我应聘的岗位的主要职责?答:公司的主要方向为汽车电子,嵌入式部门主要负责的是门控制器和座椅加热、车窗控制等车内控制,主要从事底层驱动的开发、应用层的实现公司的人才培养方案?答:会有两个培训:一个是公司的培训,另外一个事部门的培训公司的人才职业发展的通道?答:包括技术能力以及管理通道的提升,每年一评
2022年09月18日–笔试
选择题
C语言的基本单位:inta=b=10是错误的,因为只是定义了a,但是b未定义就赋值。若为inta,b;a=b=10;则是正确的自增#defined2d++;//错误的,宏定义的变量不能使用自增符号floata=1f;a++;//float类型可以使用自增doubleb=2;charc="a";intd=20;b++;c++;d++;//都是正确的,intchardoubefloat都可以自增break使用访问:只能用于case语句或者循环语句中unsignedchar占1个字符,其取值范围为:0~255
编程题
计算斐波那契数列数组排序
2022年09月22日–技术二面
团队管理过程中出现的问题?以及如何解决的?讲一讲PID调节的基本原理,以及三个参数的代表的含义。PID调节这一块为啥要使用20次取平均、PID调节是否有想过用其它的方法进行调节问了我关于平均基尔霍夫变换那一块,说说创新点在哪以及说说基尔霍夫变换的基本原理最后问了一下我的实习经历,以及为啥不想再实习的公司继续待下去的原因。
应聘岗位:嵌入式软件工程师
2022年09月14日–笔试
个人心得:不知道为啥,应聘的是嵌入式岗位,但是考的知识点全是Java的
选择题
TCP通讯必要的五个信息答:连接使用的协议、本地主机的IP地址、本地的协议端口、远程主机的IP地址、远程主机的协议端口。二叉树的三种遍历方式:前、中、后序答:前序:根左右、中序:左根右、后序:左右根编译程序的组成部分以及功能答:一个典型的编译程序有:词法分析器、语法分析器、语义分析器、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理和错误处理程序词法分析器:输入源程序,拼接、检查、分析单词,输出单词的机内表达形式语法分析器:检查源程序中的存在的语法错误,输出错误处理信息语义分析器:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中中间代码生成程序:按照语义规则,将语法单位转换为一定形式的中间语言代码,如三元式、四元式中间代码优化程序:对中间代码进行优化,等价变换处理目标代码生成程序:将优化后的中间代码转换为目标代码表格管理程序:负责建立、填写和查找一系列表格工作。表格的作用是记录源程序的各类信息和编译阶段进展情况,编译的信息以及中间结果存储在表格中。错误处理程序:处理和校正源程序中的存在的词法、语法、语义错误,负责报告出错的位置和错误性质等,对发现的错误进行校正,使得编译程序能够继续分析和处理Linux操作系统中的系统资源管理:计算资源、存储资源、网络资源,没有中断这种资源跳表:增加了前向指针的链表,是可以进行二分查找的一个有序链表,可以通过索引来进行快速查找。堆排序和希尔排序:希尔排序是一种插入排序,非稳定排序;堆排序是通过二叉树进行排序,是一种非插入排序操作系统中的缺页中断概念:要访问的页不在主存中,需要将其调入主存中然后再进行访问。顺序:硬件陷入内核,在堆栈中保存程序计数器,将当前指令的各种状态信息保存在特殊的CPU寄存器中;保存通用寄存器和其他易失的信息,以免被操作系统破坏;当操作系统发现一个缺页中断时,尝试发现需要哪个虚拟页面。通常一个硬件寄存器包含了这一信息,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析这条指令,看看它在缺页中断时正在做什么;一旦知道了发生缺页中断的虚拟地址,操作系统检查这个地址是否有效,并检查存取与保护是否一致。如果不一致,向进程发出一个信号或杀掉该进程。如果地址有效且没有保护错误发生,系统则检查是否有空闲页框。如果没有空闲页框,执行页面置换算法寻找一个页面来淘汰;如果选择的页框“脏”了,安排该页写回磁盘,并发生一次上下文切换,挂起产生缺页中断的进程,让其他进程运行直至磁盘传输结束。无论如何,该页框被标记为忙,以免因为其他原因而被其他进程占用;一旦页框“干净”后,操作系统查找所需页面在磁盘上的地址,通过磁盘操作将其装入。该页面被装入后,产生缺页中断的进程仍然被挂起,并且如果有其他可运行的用户进程,则选择另一个用户进程运行;当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映它的位置,页框也被标记为正常状态;恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令;调度引发缺页中断的进程,操作系统返回调用它的汇编语言程序;该程序恢复寄存器和其他状态信息,返回到用户空间继续执行。UDP首部字段:八个字节,四个字段:源端口号+目的端口号+长度+校验和
编程题
链表中指定区间反转二叉搜索树转为双向链表
海信科技
应聘岗位:软件开发工程师
2022年09月15日–英语口语测试
跟着读一段英语文字。比较简单,就是一些常用的英语词汇听问题并给出你的回答。问题:WHATDOYOUDOINYOURFREETIME?答:ReadabookWhetheryouhave5minutesoranhour,pickingupagoodbookandspendingsometimereadingitisagreatwaytospendyourfreetimeinaproductiveway.Ifyourwholefamilyhasabitofsparetime,ratherthansittingdowntowatchTVchallengeeveryonetopickabookandspendacertainamountoftimereadingit.Notconvincedthatreadingisproductive?Readingreducesstress,stimulatesthebrain,providesyouwithknowledge,improvesyourmemory,helpsimprovefocusandconcentration,createsbetterwritingskills,andofcourseoffersfreeentertainmentforhoweverlongyouchoose.ExerciseYouknewthisonewasgoingtobeonthelist…youwerejustreallyhopingitwouldn’tbe.Iwashopingitwouldn’t,anyway.Exercising,evenifit’sjustaquick5-minutewalkdowntheroad,isafantasticwaytouseyourfreetime.Afteryouexerciseyouwillfeelsomuchmoreenergized,healthy,andreadytofacetherestoftheday,ratherthanwhenyousitonthecouchinfrontoftheTVandendupfeelingsluggishandlazyfortherestoftheday.看说话。英文分享如何面对工作的压力
答:
Howtoreducestressisaninevitablepartofourdailylife.Manythings,suchasnaturaldisasters,waranddeath,willbringtoomuchpressuretoourlives.Butaccordingtoapsychologist,basedontoday’ssituation,stressmaycomefromsomesmallthings:takingexams,queuingup,andhavingtoomanythingstodoinalimitedtimeWeallneedpressuretoincreasethetasteoflife,challengesandopportunities,buttoomuchpressurewillseriouslyaffectourphysicalandmentalhealth,reducebodyimmunityanddamagethebrain.
Ifthepressurelaststoolong,itmayleadtophysicaldiseases,insomnia,headache,lowbackpain,ulcer,hypertension.Evenifitisheartdisease,itisveryimportanttorecognizeanddealwithstresswhenitreallyhappens.Wecantrysomeways,alotofsportscanreducethepressure.
Itcanbeveryhelpfultosupportourstresstogetherwithothers.Makingtimeforfun,suchaslisteningtomusic,maybeagoodmedicine,andsometimescryingisaneffectivewaytorelievestress.
2022年09月20日–笔试
选择题
单片机的时钟由外部晶振决定的
答:时钟是单片机的脉搏,在统一的时脉冲控制下进行工作,由外部时钟和内部时钟共同决定。
64KB的空间表示范围:0xFFFF,64KB=64*1024B=64*1024个字节,故其表示的地址范围最大为FFFF逻辑地址空间程序编译后,每个目标模块都是从0号单元开始编址,称为该目标模块的相对地址当链接程序将各个模块链接在一起成为一个可执行目标程序是,链接程序依次按照各个模块的相对地址统一从0号单元开始编址的逻辑地址空间用户程序和程序员只需要知道逻辑地址,而内存管理机制是完全透明的,只有系统编程人员才会涉及不同进程可以有相同的逻辑地址,这些相同的逻辑地址可以映射到主存的不同位置进程的执行指令和访问数据都要将物理地址从主存中存取,当装入程序将可执行代码装入内存中,必须通过地址转换把逻辑地址转换为物理地址,称为地址重定位右斜树、左斜树、完全二叉树、满二叉树答:左斜树:所有的结点都只有左子树的二叉树叫左斜树。左斜树:所有结点都是只有右子树的二叉树叫右斜树。满二叉树
完全二叉树如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。二叉搜索树若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;平衡二叉树平衡二叉树要么是一棵空树,要么保证左右子树的高度之差不大于并且子树也必须是一棵平衡二叉树
中断清零答:中断可以使用硬件清零、软件清零、自动清零方式进行清理,不只是有硬件清零贪心算法活动安排最优规则:相容活动最大的时间linux线程绑定CPU查看进程pid绑核情况:taskset-ppid启动时绑定:taskset-c/dgram_servr&//CPU从0开始,启动时绑定到第二个CPU启动后绑定:taskset-cp1,2,5,119865//将进程9865绑定到####11上linux查找/usr/bin/htpasswd文件属于哪个包答:rpm-qf/usr/bin/htpasswdLinux统计物理CPU核数答:cat/proc/cpuinfo|grep"physicalid"|sort|uniq|wc-l可重入函数可以调用不可重入函数答:可重入函数:函数可以多线程同时调用,一般只有局部变量的函数内不可重入函数:不可多线程同时调用,一般由全局变量、静态变量,需要加入互斥锁/信号量/中断可重入和不可重入函数可以互相调用,但是不可重入函数需要添加互斥
编程题
求出数组中坏数"0"的个数?
注:坏数:即该元素为0,其左右两个元素的值也为0
华勤技术
应聘岗位:嵌入式驱动开发工程师
2022年09月15日–笔试
各种排序算法的时间复杂度x*=y+1,等价于x=x*空指针不是指针常量宏定义中未定义变量会在编译时报错%2=-1
2022年09月21日–老总一面
感受:我以为一面都是技术面,结果一上来是老总面,全程没有问我技术上的问题,问的都是生活方面的,问我有没有女朋友,家里住哪,有没有考虑来上海、南昌发展,然后就问我学习怎么样、导师是谁、项目中有啥难忘的事情嘛以及项目中遇到过一些委屈嘛?
反问:
岗位职责:BIOS做的是品牌笔记本软硬件开发,竞标,竞选联想、戴尔等大厂的笔记本电脑的生成,软硬件测试、项目管理培养方案:专业培训、导师上课晋升通道:认真做事
2022年09月23日–技术二面
技术面没有问知识点相关的内容,只是问了一下项目相关的内容以及实习经历
主要是问了第一个项目的相关细节,就是关于ROS无人驾驶智能小车的,说一说你的项目的经历、整体的项目的逻辑以及项目的困难点?
之后就问了一下你的一个实习收获?为什么不考虑留在实习的公司里?
最后问了一下,能不能接受南昌和上海地点
反问:
岗位分配:BIOS、BSP驱动、BMS三大岗位
应聘岗位:嵌入式
2022年09月16日–一面
手撕冒泡排序,给了选择题、填空题让我开个共享屏幕给他看一下项目的代码问了项目,就问了项目中你的代码量是多少,主要的职责是做啥的
感受:面试官最后说自己需要加强一下字符串那块知识的学习,需要多刷刷题目,然后的话呢,就是可能第一次遇到这种手撕题目的面试,还需要多积累积累经验
2022年09月21日–二面
手撕编程题:十六进制字符串转为十六进制数字问了我一些项目进度延期该怎么办?项目团队成员之间冲突怎么办?对哪方面感兴趣?反问岗位职责:研发嵌入式,TV板卡,分为三个方向:驱动程序测试、驱动开发、系统开发。培训方案:新人一个月的成长学院学习等下部门:1~2个月学习工具类,第三个月搞项目,进行答辩评估定岗,转为正式期。若定不了岗则可延长到6个月,若还不行则需转岗。晋升通道:定级,晋升标准会有晋升答辩,新人入职从11级开始做起,13级后HR会进行谈话,询问是转技术岗还是技术管理岗。
应聘岗位:硬件开发–嵌入式自动驾驶
2022年09月17日–笔试
编程题
考了四道编程题,美团自主命题的
感受:编程题这块,大厂还是相对来说比较重视的,日常中还得多加强这方面的训练
选择题
必须要擦除才能使用的存储介质SRAMDRAMEEPROMFlash
解析:flash芯片不支持覆盖写,只能在擦除过的区域进行写操作,而且擦除一般是按照扇区或者是块进行擦除。根本原因其实是flash芯片的写操作只能将1变为0,而不能将0变为擦除之后,flash中是全1的状态,若想将0变为1则只能通过擦除操作。
EEPROM的全称是“电可擦除可编程只读存储器。flash属于广义的EEPROM,因为它也是电擦除的rom,掉电后数据不丢失,可以保存100年,可以擦写100万次。具有较高的可靠性。
应聘岗位:自动驾驶创新业务-嵌入式开发工程师
2022年09月17日
选择题
编程题
都是滴滴自命题的编程题,难度适中,需要较好的逻辑思维能力
求墨水污染的数字刷油漆问题
应聘岗位:嵌入式软件开发工程师
2022年09月19日–群面
知识点补充:群面就是一堆人围绕着题目进行讨论,然后总结出规律,最后选出一名代表进行陈述,全程面试官是不参与话题讨论的,只有面试者要进行观点的阐述和总结。
我们总共有7个人进行群面,然后7个人围绕着一个方桌坐下,每个有都会有对应的座位牌,这次群面的题目是:
在数据量极大的情况下,如何进行数据的存储?请从架构方面以及具体技术方面阐述。你认为的智能家居系统由哪些部分组成?技术上如何实现以及采用哪种手段?
流程:
要点总结:
首先一定要针对问题进行剖析,然后一定要鲜明地表达自己的观点,要让面试官眼前一亮。组内讨论的时候一定要参与进来,要积极讨论,积极发言,表达清楚自己的观点总结的时候,若感觉自己总结的比较好的话就积极推荐自己,千万不要怯场,不要因为害怕而不敢去说
我的回答:
个人理解环节:对于第一个问题来说,我觉得可以构建一个分布式的存储系统,采用多节点的方式来进行存储,然后使用一个主节点对各个节点进行管理;对于第二个问题来说,我会考虑的更加贴近生活一点,比如从我在外面、进入家门、躺着沙发休息、厨房卫生、打扫卫生、洗浴、睡觉等各个方面都要进行一个智能化普及,比如说在外面通过APP来控制家内家具的状态,进门时通过人脸识别或者指纹识别来实现开门,在室内通过智能语音组手来控制家内的家具,比如沙发按摩、厨房水温调节、扫地机器人打扫卫生、浴室稳定水温、睡眠灯光控制、窗帘控制等。
总结环节:室外使用手机APP室内使用语音控制添加家居的传感器实时检测硬件的搭建
2022年09月20日–测评
测评主要包括了:性格测试、场景应变能力测试、逻辑思维测试两个部分
2022年09月22日–专业面试
面试主要先问了一个较为温和的问题,总共有两个面试官,两个都是机器人与自动化事业部的技术管,问了一下我在大学期间做的最有收获的一件事,之后就开始问技术了。
第一个面试官主要对我的第一个项目感兴趣,就和我一直讨论第一个项目,而第二个面试官主要对我的第二个项目感兴趣,就和我一直讨论第二个项目。所以主要要对自己做的项目里面的细节要了然于胸
反问:
岗位职责:做的是库卡机器人,是一种工业机器人,做的是本体的控制器,所以需要做的就是机器人的控制这一部分。培养方案:应届生培养计划、部门培养后续结果安排:HR面通过之后发Offer
2022年09月24日–收获Offer
今天中午11点在长沙北辰国萃酒店进行了谈薪,总体听下来福利还不错,而且公司的福利很多,工作时长是95不提倡加班,这一点的话,总体来说还是相对工资较高的。
签完约后就和部门的同事和HR见面,并开启了破冰之旅,玩了一些小游戏
中科创达
应聘岗位:畅行智驾-MCU开发工程师
2022年09月20日–笔试
选择题
海康威视
应聘岗位:软件开发工程师
2022年09月22日–技术一面
面试官全程问了几个技术问题以及了解一下我的性格方面的具体情况
性格问题:
讲一讲你是如何乐于助人的?讲一讲你的学习能力强体现在哪一方面呢?讲一讲你抗压能力强体现在哪一方面呢?讲一讲你的团队协作能力和沟通能力强体现在哪一方面呢?
技术问题:
讲一讲冒泡排序的基本思路?答:把第一个元素与第二个元素比较,如果第一个比第二个大,则交换他们的位置。接着继续比较第二个与第三个元素,如果第二个比第三个大,则交换他们的位置。我们对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样一趟比较交换下来之后,排在最右的元素就会是最大的数。除去最右的元素,我们对剩余的元素做同样的工作,如此重复下去,直到排序完成。Linux内存申请有哪些方式?答:malloc:在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,其在逻辑上是连续的kmalloc:void*kmalloc;kmalloc申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。kzallockzalloc和kmalloc一样,实际上只是额外附加了__GFP_ZERO标志。所以它除了申请内核内存外,还会对申请到的内存内容清零。
数据库用过哪些?如何应对大的数据库的巨大的查询量?答:Mysql、sqlite。子查询/连接+索引如何实现并发?如何保证上亿数据的并发?答:系统拆分。将一个系统拆解成多个子系统,使用dubbo来弄,将每个系统连接一个数据库,相当于一个系统多个库缓存。在数据库和缓存中都写一份,读的时候大量读走缓存就行MQ实现异步写,实现数据的读和写解耦的操作,从而达到异步的效果分库分表。将一个数据库拆分为多个库,多个库来抗更高的并发;然后将一个表拆分为多个表,每个表的数据量保持少一点,提高sql跑的性能。读写分离。弄个主从架构,主库写入,从库读取。Elasticsearch是分布式的,可随便扩容
反问:
培养方案:6个月试用期,导师一对一带领入门,分阶段检查,有答辩考核晋升通道:技术、管理:两年后可以转岗,负责团队管理后期安排:根据需要看是否需要技术加面,后就是HR面,最后入职
紫光同创
应聘岗位:嵌入式软件开发工程师
2022年09月22日–笔试
选择题
派生类析构函数调用顺序?答:析构函数调用顺序:首先调用派生类的析构函数;其次再调用成员类对象的析构函数;最后调用基类的析构函数;而构造函数恰好相反C++中引用和指针区别?答:引用必须初始化,但是不分配存储空间,指针不声明时初始化,需要分配空间引用初始化后不能被改变,指针可以改变所指的对象不存在指向空值的引用,但是存在指向空值的指针引用没有const,指针有const,const的指针不可变“sizeof*引用”得到的是所指向的变量的大小,而“sizeof“指针”得到的是指针本身的大小虚函数是析构函数吗?答:构造函数不可以是虚函数,析构函数常常是虚函数。当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构。虚函数表是由编译器自动生成与维护的,virtual成员函数会被编译器放入虚函数表中,当存在虚函数时,每个对象都有一个指向虚函数的指针。在实现多态的过程中,父类和派生类都有vptr指针。与构造函数不同,vptr已经完成初始化,析构函数可以声明为虚函数,且类有继承时,析构函数常常必须为虚函数。成员函数被重载的特征?答:具有相同的作用域函数名字相同参数类型,顺序或者数目不同virtual关键字可有可无
编程题
使用新字符替换字符串中的特定字符链表反转
海能达
应聘岗位:嵌入式软件开发工程师
2022年09月23日–笔试
海能达的笔试总体上来说还是很基础的,只要细心去做就没太大问题。
选择题
C语言和C++的基础知识,考了虚函数相关的内容,父类和子类虚函数调用的顺序
看一个虚函数的例子:
虚函数:指向基类指针在操作它的多态类对象的时候,可以根据指向的不同类对象调用其相应的函数
作用:在基类定义了虚函数后,可以在派生类中对虚函数进行重定义,并且可以通过基类的指针或者引用进行调用,在程序运行阶段动态地选择调用基类或者不同派生类的同名函数,若派生类没有对虚函数的重新定义则继承基类的虚函数并调用
#include "stdafx.h"
#include<iostream>
using namespace std;
class Base
{
public:
virtual void Print()//父类虚函数
{
printf("This is Class Base!
");
}
};
class Derived1 :public Base
{
public:
void Print()//子类1虚函数
{
printf("This is Class Derived1!
");
}
};
class Derived2 :public Base
{
public:
void Print()//子类2虚函数
{
printf("This is Class Derived2!
");
}
};
int main()
{
Base Cbase;
Derived1 Cderived1;
Derived2 Cderived2;
Cbase.Print();
Cderived1.Print();
Cderived2.Print();
cout << "---------------" << endl;
Base *p1 = &Cbase;
Base *p2 = &Cderived1;
Base *p3 = &Cderived2;
p1->Print();
p2->Print();
p3->Print();
}
/*
输出结果:
This is Class Base!
This is Class Derived1!
This is Class Derived2!
---------------
This is Class Base!
This is Class Derived1!
This is Class Derived2!
*/
编程题
比较基础,基本一个for循环就可以搞定,主要要注意边界问题
2022年09月27日–技术一面
主要问了我第一个项目的人员个数、你在项目中扮演的角色、项目成员之间是如何沟通的、项目中主要负责的是哪部分的任务、项目进行中遇到了哪些困难以及如何解决的、项目中的创新点。
岗位职责:嵌入式软件开发分为:平台部和DSP部。
有个半年的适应时间,6个月后转正,2~3年后可以走技术专家路线或者团队管理路线。
培训:部门级和公司级
后期:HR后进行相应的安排
文章为作者独立观点,不代表观点