本文已参加 [新人创作礼] 活动,一同敞开创作之路。

秋招日记

一、个人布景

​ 秋招现已告一段落了,写了一些总结,记录了一下秋招期间的每个日日夜夜,总结了每次书面考试和面试的阅历以及个人的总结,希望能够协助之后找作业的小伙伴们。

​ 布景:双非一本本科

​ 大三暑假实习:拿到了东信平和(隶归于中电科旗下)的offer,最终去珠海实习了两个月,体会了上市国企的日常作业及日子,对接下来的秋招有了愈加明确的方向。

二、学习阅历

​ 大一下学期完毕后的那个暑假,加入了嵌入式试验室,一待便是三年。从刚开端的玩STM32单片机,学习Linux基础常识;到之后开端触摸图画处理相关常识,学习了核算机视觉OpenCV,ResNet、YOLO系列网络模型,学习了Pytorch、Tensorflow网络结构

​ 大二上学期参加了一个喷码机上位机软件开发的校企合作项目,经过这个项目学习了Python基础语法、PyQt根本控件及界面布局、PLC通讯基础常识。由于咱们的项目是要依据全英文的运用手册进行二次开发,所以也学会了怎样经过阅览英文手册进行项意图开发

​ 大二下学期担任我国大学生工程训练大赛智能垃圾分类的视觉部分(自己没有参赛报名,可是为这个竞赛付出了大半年的汗水)

​ 大三上学期首要是转向整机开发了,所以学习了硬件原理基础常识、原理图的绘制、PCB板的绘制、ROS机器人操作体系,自己制作了一台依据ROS的智能小车(依据万向轮、主控为Arduino、上层为Jetson Nano),后边参加了RoboCup智能车竞赛并获得了国家一等奖

​ 大三下学期协助导师展开Linux驱动教学,拟定了uboot移植、Linux内核移植、根文件体系建立、LED驱动开发试验手册,一起学习了FreeRTOS实时操作体系,在实训时完结了一个依据FreeRTOS的智能预警项目。在此期间和华南理工合作一个喷头驱动项目,学习了FPGA的根本运用。

​ 秋招期间总共投递了50多家企业,每天都是早上9点左右起床,到试验室预备书面考试面试一向到晚上10点左右回宿舍,持续了一个月左右,虽然很累可是很值得!

三、实习阅历

​ 大三下学期,去到了东信平和智能卡股份有限公司实习,实习期间,担任了USBKEY实习小组项目担任人,首要担任了智能卡JavaCard运用的开发,以及协调小组内各个模块的联调。在实习进程中,仍是交到了许多朋友,带我的导师也教会了我许多智能卡范畴的专业常识,公司的领导对咱们实习生仍是很关心的,我也从咱们副总身上学到了许多办理方面以及待人方面的常识。

​ 总的来说,在我实习的这两个月里,每天都会有项目在Push你向前走,每一天都过的很充分,也非常感谢公司的培育和信任!

四、Offer收成状况

  • 08月29日收到超睿科技Offer
  • 09月01日收到东信平和Offer
  • 09月13日收到星宸科技Offer
  • 09月21日收到比亚迪Offer
  • 09月24日收到美的Offer
  • 09月28日收到紫光同创Offer
  • 10月10日收到华诺星空Offer
  • 10月12日收到凌云光Offer
  • 10月12日收到经纬恒润Offer
  • 10月27日收到富士康Offer
  • 10月31日收到海康威视Offer
  • 11月09日收到奥比中光Offer
  • 11月14日收到乐动机器人Offer

五、各大公司笔面试真题

星宸科技

应聘岗位:Linux驱动工程师

2022年08月13日–书面考试

​ 进行了书面考试题,挑选题首要考的是操作体系的常识、编程题考了求矩形的最大面积、求链表倒数第K个节点。全体来说难度不大,可是要背好八股文以及刷题。

2022年08月18日–技能一面

进行了技能一面,面试的是部分的一个小组长。在面试的进程首要问了许多八股文相关的常识(牵涉最多的便是Linux操作体系相关的常识)、然后就会翻开问一下项目相关的常识点。

0.必定要仔细复习书面考试题

​ 面试官一上来就对自己的书面考试标题进行一个问询,问了编程题的详细完结的细节:包括了求矩形的最大面积、求第K个链表的数据

1.进程调度机遇?

答:

  • 中止处理进程

  • 内核线程调用schedule()进行进程切换

  • 用户态进程无法完结主动调度,只能经过内核态后某个机遇点进行调度,即在中止处理进程中进行调度

2.孤儿进程和僵尸进程?

答:

孤儿进程:

​ 一个父进程退出,而其一个或许多个子进程还在运转,那么子进程将成为孤儿进程。将被init进程(进程号为1)所收养,并且由init进程完结状况收集作业

僵尸进程:

​ 一个进程运用fork创立子进程,若子进程退出,父进程没有调用wait或许waitpid获取子进程状况信息,那么子进程描绘符依然保存在体系中。这种称为僵尸进程

3.请说一下链表跟数组的差异?

答:数组静态分配内存,链表动态分配内存;数组在内存中接连,链表不接连;数组运用下标定位,时刻杂乱度为O(1),链表定位元素时刻杂乱度O(n);数组刺进或删除元素的时刻杂乱度O(n),链表的时刻杂乱度O(1)。

4.单链表和双链表的差异

答:单链表只需一个指向下一结点的指针,也便是只能next。双链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针,能够经过prev()快速找到前一结点,望文生义,单链表只能单向读取。

​ 双向链表在存储空间上要大于单向链表。

2022年09月06日–技能二面

进行了第二轮的技能面试,面试的是主管。

面试的内容:

  1. 问了我一个自己觉得最有成就感的项目,并详细说一下项目中的详细完结的功用

  2. 问了我关于Linux驱动中自己最了解哪一个驱动结构,做过哪些驱动结构。我面试的时分说我比较了解字符设备驱动结构,然后边试官就问我关于字符设备驱动结构自己是否完结了驱动函数,并且问询了我自己是否深究了驱动函数的内存分配,比方问了我ioremap函数的详细完结。

    答:

  3. 问了我关于虚拟地址转化为物理地址的详细完结,以及多个物理地址转化抵触的问题。

    答:

    ​ ioremap函数: 几乎每一种外设都是经过读写设备上的寄存器来进行的,一般包括操控寄存器、状况寄存器和数据寄存器三大类。外设寄存器一般被接连编址,分为:

    • IO映射方法:为外设专门完结了一个单独的地址空,称为IO地址
    • 内存映射方法:只完结一个物理地址空间,外设I/O端口成为内存的一部分,CPU能够向拜访内存单元那样拜访外设IO端口,而不需求单独的IO指令

    驱动程序并不能直接经过物理地址拜访I/O内存资源,而有必要将它们映射到中心虚地址空间内(经过页表),然后才干依据映射所得到的中心虚地址规模,经过访内指令拜访这些I/O内存资源。

    ​ ioremap能够将IO内存资源的物理地址映射成为中心虚拟地址后,咱们能够直接操作RAM那样操作IO口内存资源了,可是咱们应该要运用Linux的特定函数来拜访内存资源,而不是运用指针来拜访,比方writel()、readl()等

    ​ 多个物理地址抵触问题:

    不同进程的虚地址或许对应着同一块物理地址,映射是能够重复存在的,典型的例子便是我说的同享库,操作体系为了节约物理内存运用,关于同一个DLL,在不同的进程中,其虚地址或许是不同的,但其对应的物理内存或许是同一块**。内核能看到一切进程的页表,自然也就能办理一切进程的内存映射,能够确保不抵触。**

  4. 问了我关于Linux进程之间怎样进行数据的同享的问题,问了我自旋锁、互斥锁的差异,此外还补充了一个读写锁的问题,即读的时分是否能够写入、写入的时分是否能够读取、是否能够一起读取和写入

    答:读写锁:给临界区加锁,在进行写操作的时分进行互斥;在进行读的时分能够同享拜访。

    2023届嵌入式笔面经&一位双非本科生的秋招日记

  5. 问了我关于FreeRTOS实时操作体系和裸机开发的差异,问了我关于Linux操作体系和FreeRTOS实时操作体系的差异

    答:FreeRTOS是实时操作体系,首要完结了使命调度、内存办理、IPC、中止办理这几个模块,它要求快速的处理使命。可是GUI、驱动结构、shell这些不是中心功用,而linux则是分时操作体系,是一种软实时体系,能够高效运用核算机的资源

  6. 问了我为什么FreeRTOS实时操作体系能够完结多使命的,而裸机的多使命完结又是怎样样的

    答:裸机:经过中止完结,依据中止优先级完结,能够完结中止的嵌套;而实时操作体系则是经过使命优先机来完结,经过时刻片轮转来完结,由使命组织妥当行列来确认。

  7. 问了我关于FreeRTOS实时操作体系做过的项目。问了我Linux驱动做过哪些项目(要体现个人在项目中学到了什么,面试官如同比较看重这个东西,越杂乱的话或许越好)

  8. 关于FreeRTOS问了我自己完结了一些网络协议栈没,对这种实时性的内核是否进行了一些优化改良。

2022年09月13日–HR面

​ 进行了终面,面试的是HR小姐姐。

面试的内容:

  1. 除了投递咱们公司,你还投递了其它的公司嘛?现在收到了几份Offer呢?公司的首要事务是啥呢?
  2. 在咱们公司内你有认识的熟人嘛?他是怎样样和你介绍公司的环境的呢?
  3. 聊一聊你的实习公司里边的气氛以及你实习公司里边搭档的作业状况?
  4. 你觉着上两轮面试官的面试状况怎样样呢?你觉得你发挥得怎样样呢?
  5. 你希望的薪资是多少呢?(PS:薪资的话讲一个大约的规模就行)
  6. 你还有什么想要问我的嘛? (PS:我首要问了一下公司的交通便利、公司里边的作业气氛、以及吃饭、住宿环境)

2022年09月13日–性情测验

​ HR面完之后没过多久就发了性情测验的链接,这个月底谈薪资。

凌云光

应聘岗位:图画运用开发工程师

2022年09月10日–书面考试

编程题
  • ifndef/define/endif效果

    答:避免头文件被重复引证。被重复引证是指在同一个cpp文件中被include屡次,比方:a.h文件中运用了#include “c.h”,而b.cpp中运用了#inlcude “a.h” 和#inlcude “c.h”,此刻就会造成c.h重复引证。

    ​ 成果:头文件重复引证会增加了编译的作业量,若头文件中重复包括,则会呈现编译过错。比方:头文件包括大局变量的界说那么会引起过错。

  • sizeof的根本用法,strlen的根本用法

    char a[] = "abc";
    sizeof(a)=4 //字符串的结束还有一个'\0'
    strlen(a)=3  //strlen输出的是字符串的长度,不包括'\0'
    //在C言语中,若形参为数组,则传递的是指向该数组首地址的指针,而不是数组自身   
    void foo(char a1[100])
    {
        int c3 = sizeof(a1); //64位体系下,c3 = 8;32位体系下,c3 = 4,由于函数参数a1已不再是数组类型,而是蜕变成指针
    }
    struct s1
    {
      char c;
      int i;
    };
    sizeof(s1) = 8 //char占1个字节,int占4字节,可是要考虑到字节对齐的状况,即让内存所占字节能够整除最大的变量所占字节数,所以这儿有必要要为4的倍数。字节对齐效果:削减访存指令周期,进步CPU存储速度。空结构体:sizeof为1
    Union U
    {
        int i;
        char c;
        s1 s; //8个字节
    }
    sizeof(U) = 8; //联合体各个成员同享一段内存,sizeof为每个成员sizeof的最大值,相同要考虑字节对齐的问题
    
  • memcpy函数的根本用法

    • 函数原型:void *memcpy(void*dest, const void *src, size_t n);

    • 功用:由src指向的地址的接连n个字节的数据赋值到dest指向的开端地址的空间内,能够用来仿制恣意的数据类型的目标

    • 头文件:#include <string.h>

    • 回来值:回来一个指向dest的指针

    • 说明:dest和src所指的内存区域不要重复,不然会呈现数据的掩盖的问题;与strcpy相比,memcpy并不会遇到’\0’就完毕仿制,必定会仿制完n个字节

英文翻译题

​ 摘录了论文中的一段话,要求翻译为中文,大致是关于3D图画重构的内容,关键字stereo vision(双目视觉)

简答题
  • 摄像头物镜的三个重要参数以及效果

    答:焦距、相对孔径、视场角。

    焦距:影响成像的巨细,焦距越长,所得的像也越大,扩大倍数越大 。

    相对孔径越大,经过的光线越多,在像平面上的像越亮。

    物镜的视场角决议了在成像面上良好成像的空间规模当焦距f必定时,视场角越大,成像也越大;一起,当成像面的尺度必定时,焦距越长,视场角越小。

  • 开运算和闭运算的效果

    答:

    • 开运算:先进行腐蚀再进行胀大。效果:消除小的物体,滑润形状边界,并且不改动其面积,能够很好地去除小颗粒的噪声,断开物体之间的衔接。

    • 闭运算:先进行胀大再进行腐蚀。效果:用来填充物体内的小空洞,衔接邻近的物体,衔接断开的轮廓线,滑润边界而不改动其面积。

  • 图画切割的效果和三种经典的办法

    答:

    图画切割便是把图画分成若干个特定的、具有一起性质的区域并提出感兴趣方针的技能和进程。图画辨认的基础是图画切割,其效果是把反映物体实在状况的、占据不同区域的、具有不同特性的方针差异开来,并形成数字特征。图画切割是图画辨认和图画理解的根本前提进程,图画切割质量的好坏直接影响后续图画处理的效果,甚至决议其成败,因此,图画切割的效果是至关重要的。

    ​ 图画切割办法首要分以下几类:依据阈值的切割办法、依据区域的切割办法、依据边际的切割办法、依据特定理论的切割办法等

  • 3D点云和2D灰度图的融合

    答:

2023届嵌入式笔面经&一位双非本科生的秋招日记

/**
     * 将五颜六色图和深度图合并成点云
     * @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, 较亮的区域灰度被紧缩,较暗的区域灰度被拉伸的较亮,图画全体变亮;

    2023届嵌入式笔面经&一位双非本科生的秋招日记

  • 直方图均衡化(增加图画的大局对比,直方图均值化,将低灰度值归并,高灰度值拉伸,当一个图画灰度散布均匀时,图画的全体细节与质量会进步许多)

    进程:(以灰度深度8为例)

    **1,**核算每个阶层灰度值的数量

    **2,**核算每个阶层灰度值呈现的概率

    3,将每个概率的灰度值以前缀和的方式累加

    4,将图片代入核算,p[x,y]*img[x,y]

2022年09月21日–一面

  • 面试官上来先介绍了一下岗位的详细作业:做手机和电脑的,我应聘的岗位首要是做视觉计划和运用的开发

  • 之后首要进行了一个自我介绍,然后开端问我自学的OpenCV包括哪些内容,问询我是怎样样的关键想到自学OpenCV的

  • 之后就问我的简历中的项目,只问了第一个项目:关于ROS体系的无人驾驶智能小车(由于第一个项目里边包括视觉处理),问询我项目里边的视觉处理:首要问了车道线辨认的基尔霍夫改换包括哪几种,然后怎样辨认的。

  • 之后问了我作为项目担任人在项目办理进程中呈现项目成员完结不了状况导致项目延期该怎样办?

  • 之后问了我三个项目中最有收成的一个项目?以及收成的点在哪些地方?

  • 之后问了几个C++常识点,首要包括了多态的完结和深仿制/浅仿制的差异

    答:多态的完结:

    • 静态多态:重载。编译期间确认函数的地址
    • 动态多态:重写基类的虚函数完结的多态,在运转时决议,运转时虚函数寻觅调用函数的地址

    深仿制/浅仿制:

    • 默许是浅仿制,体系会调用默许的仿制结构函数,即浅仿制,它能够完结成员的一一仿制。当数据成员中没有指针时,浅仿制是可行的,但当数据成员中有指针时,假如采用简略的浅仿制,则两类中的两个指针将指向同一个地址,当目标快完毕时,会调用两次析构函数,从而导致指针悬挂现象

      class Widget{
      public:
          Widget();//default结构函数
          Widget(const Widget&rhs);//copy结构函数  浅仿制函数
          Widget& operator=(const Widget &rhs);//copy assignment操作符
      };
      
    • 深仿制会在堆内存中别的请求空间来存储数据,咱们需求重写仿制结构函数或许运用运算符重载,当数据成员中有指针时,有必要要用深仿制

      class A
      {
      public:
          A(int _size):size(_size)
          {
      		data = new int[size];//指针变量名 = new type[内存单元个数]
          }
          A();
          ~A()
          {
              delete []data;
          }//析构时开释资源
      private:
          int *data;
          int size;
      }
      
  • 最终问了一下,我关于公司的事务的了解状况

  • 反诘:

    • 岗位所做的作业:前期:客户给需求,完结硬件计划规划、软件规划、功用调试。 后期:项目技能管控、技能管控 大后期:纯办理,只担任调配资源

    • 培育计划:入司(公司团体新人训练)、入行(各部分训练):包括光、机、电三方面以及渠道软件、3D视觉处理、实习期(导师全方位指导)

    • 进步通道:技能岗(初级、中级、中高档、高档),办理岗位

    • 后期组织:还有一次终面以HR面

2022年09月23日–二面

  • 面试我的是部分的经理,全程没有问我太多的技能问题,首要是和我介绍了一下图画运用开发部分的根本状况,以及问询我的意愿

  • 首要是图画运用开发部分首要是做机器视觉这一块的运用开发,9成时刻在开发,还有1成时刻需求和客户、技能支持等相关人员进行交流

  • 再者是这个部分总共有五六十号人,可是只需5个人是中心成员,为项意图事务担任人,和我说了一下部分的成员展开:技能岗位:前两年进步技能、两年后若优异则转为办理岗位,承担起部分的一个首要技能展开责任。 办理岗位:组长、部分经理等等

  • 问了一下我家里人住哪,有没有想过来广东展开(一般公司都会相对注重地域的,由于这牵涉到你是否能够安心在公司里边作业,能在这座城市展开)

  • 之后,和我说了一下便是部分里也有本科生在做机器视觉这一块,都是非常优异的本科生,包括广东工业大学、华南理工大学等等,老总和我说我的项意图阅历比较丰富,展开的前景相对较好(所以项目阅历越丰富,你受到的青睐越多)

  • 最终和我说了一下,便是他们在做的作业:为工业机器人植入眼睛和大脑,希望经过机器视觉的方法削减人力的劳动,进步出产的功率,老总给我举了iphone14的例子,说iphone14的零器材组装就需求用到机器视觉。

  • 反诘

    • 公司的培育计划:导师一对一指导
    • 后期组织:HR面谈

2022年09月27日–部分HR面

​ 晚上10点钟左右打电话过来和我洽谈一下作业的事项,首要聊了一下我的作业意愿、岗位的状况。和我说,凌云光首要是招聘硕士为主、本科吸纳优异的本科生,且本科生一般偏向于前端以及办理道路。

​ 我的作业首要是以python编程言语为主,进行一个定制化的前端使命,后期能够转为研发岗。技能道路的话分为:前期(项目开发)–>后期(研发),办理道路:2年后可转为办理岗位。

​ 级别:L6~L11。一般两年后可升为L8,然后能够转办理岗或许持续走技能道路。

​ 培育计划:导师带领准则,带领6个月,进行深度学习、3D视觉、2D视觉的开发。

蔚来

应聘岗位:嵌入式软件开发工程师

2022年09月10日–书面考试

挑选题

1.进程间通讯的方法不包括(D)

A. 同享内存 B.管道 C.音讯行列 D.大局变量

答:进程之间需求数据的同享、音讯的发送、进程之间的操控,所以需求进程之间的通讯。

​ 方法:

​ 管道(pipe):半双工通讯,由pipe函数在内核中拓荒一块缓冲区域用于通讯,read(pipefd[0])为读取数据,write(pipefd[1])为写入数据

2023届嵌入式笔面经&一位双非本科生的秋招日记

​ 音讯行列:音讯行列是由音讯的链表,存放在内核中并由音讯行列标识符标识。音讯行列克服了信号传递信息少、管道只能承载无格式字节省以及缓冲区巨细受限等缺点。

​ 信号量:数据操作锁,用来担任数据操作进程中的互斥,同步等功用。信号量就相当所以一个计数器。当有进程对它所办理的资源进行恳求时,进程先要读取信号量的值:大于0,资源能够恳求;等于0,资源不行以用,这时进程会进入睡觉状况直至资源可用。当一个进程不再运用资源时,信号量+1(对应的操作称为V操作),反之当有进程运用资源时,信号量-1(对应的操作为P操作)。对信号量的值操作均为原子操作。

​ 同享内存:同享内存是这五种进程间通讯方法中功率最高的。可是由于同享内存没有供给相应的互斥机制,所以一般同享内存都和信号量配合起来运用。同享内存不涉及到程序与内核之间的数据传递,节省了时刻。

2023届嵌入式笔面经&一位双非本科生的秋招日记

**2. int a[10]和(int )a[10]

答:int *a[10]是数组指针,标明一个数组中有10个int*类型的指针,而(int *)a[10]标明a是一个指针指向了一个包括10个int类型元素的数组。

*3. int fun()和int (*fun)())

答:int *fun()是函数指针,标明函数的回来值是指针类型的,int (*fun)(); 是指针函数,能够经过该指针去调用函数

4. 数组巨细动态扩容

答:数组中能够经过malloc函数去请求一块大的空间,然后运用memcpy将数据仿制到新的数组中去,完结数组的巨细动态扩容

5. ISR能够运用printf嘛

答:ISR为中止服务程序,printf是不行重入的函数,而中止中有必要为可重入的函数,所以不能运用printf

注意事项:

  • ISR不能有回来值
  • ISR不能传递参数
  • ISR应该是短而有功率的,在ISR中做浮点运算是不明智的。
  • 不能再ISR中运用printf,printf是不行重入的函数,而中止随时都或许产生,而中止内的函数有必要是可重入的

拓宽:不行重入和可重入

  • 不行重入函数指的是该函数在被调用还没有完毕曾经,再次被调用或许会产生过错。其完结的时分一般运用了大局资源,在多线程的环境下若未处理好数据维护和互斥拜访,则会产生过错。

  • 常见的不行重入函数有: printf ——–引证大局变量stdout malloc ——–大局内存分配表 free ——–大局内存分配表

  • 可重入函数:一般能够理解为一个函数在一起屡次调用,例如操作体系在进程调度进程中,或许单片机、处理器等的中止的时分会产生重入的现象。

编程题
  1. 回来排序后相邻两数的最大差值(桶排序)

    标题描绘:给定一个整形数组arr,回来排序后相邻两数的最大差值
    arr = [9, 3, 1, 10]。假如排序,成果为[1, 3, 9, 10],93的差为最大差值,故回来6。
    arr = [5, 5, 5, 5]。回来0。
    [要求] 时刻杂乱度为O(n),空间杂乱度为O(n)
    输入:
        4
    	9 3 1 10
    输出:
        6
    思路:预备n+1个桶,最大值放在n+1个桶内,其他的放在1~n个桶内,1~n个桶内元素为(val - min) * n / (max - min)号桶。最大差值为当时桶-前一个非空桶的最大值
    代码完结:  
    int selectBuket(long num, long min_val, long arr_len, long max_val)
    {
        return (int)((num - min_val) * arr_len / (max_val - min_val));
    }
    int buketSort(int arr[], int len)
    {
        if(NULL == arr || len < 2)
        {
            return 0;
        }
        int min_val = INT_MAX;
        int max_val = INT_MIN;
        int i;
        for(i = 0; i < len; i++)
        {
            min_val = min(min_val, arr[i]);
            max_val = max(max_val, arr[i]);
        }
        if(min_val == max_val)
        {
            return 0;
        }
        //标记每个桶的最大值和最小值
        int maxs[len + 1];
        int mins[len + 1];
        bool hasNum[len + 1];
        for(i = 0; i < len + 1; i++)
        {
            maxs[i] = INT_MAX;
            mins[i] = INT_MIN;
            hasNum[i] = false;
        }
        //接收元素分配的桶号,作为maxs和mins的下标
        int number = 0;
        for(i = 0; i < len; i++)
        {
            //获取元素桶号
            number = selectBuket(arr[i], min_val, len, max_val);
            mins[number] = hasNum[number] ? min(mins[number], arr[i]) : arr[i]; /*假如有元素则比较,没有则加入*/
            maxs[number] = hasNum[number] ? max(maxs[number], arr[i]) : arr[i];
            hasNum[number] = true;
        }
        //找到第一个不为空的桶
        i = 0;
        int last_max = 0;
        int res = 0;
        while(i <= len)
        {
            if(hasNum[i++])
            {
                last_max = maxs[i - 1];
                break;
            }
        }
        /*从第i个桶之后那个值开端寻觅*/
        for(; i <= len; i++)
        {
            if(hasNum[i])
            {
                //相邻两个桶之间的最大差值比较,大的赋值给res
                res = max(res,(mins[i] - last_max));
                last_max = maxs[i];
            }
        }
        return res;
    }
    void testBuketSort()
    {
        int num;
        cout << "输入数组长度:";
        cin>>num;
        int arr[num];
        cout << "输入数组元素:";
        for(int i = 0; i < num; i++)
        {
            cin >> arr[i];
        }
        int len = sizeof(arr)/sizeof(arr[0]);
        int value = buketSort(arr,len);
        cout <<"排序后相邻两数的最大差值为:" << value << endl;
    }
    
  2. 回来逆序对个数(快速排序)

    标题描绘:给定一个序列有n个数,求n个数中逆序对的个数,逆序对的界说:i < j && a[i] > a[j]。
    输入样例:
        6
        2 3 4 5 6 1
    输出样例:
    	5
    
  3. 给定一个字符串,请将字符串里的字符依照呈现的频率降序排列,假如频率相同,则依照字符的ASCII码升序排列。

简答题

问:find查找.C结束的文件,并且将成果显现在规范输出中

答:find ./ -name "*.c" -print

说明:

  • -print:将查找到的文件输出到规范输出

  • 【-exec command {} \】将查找到的文件履行command操作,{}和\之间有空格

  • 【-ok】和-exec相同,只不过在操作前要问询用户

拓宽:2>&1

几个根本符号及其意义

  • /dev/null 标明空设备文件,能够将不需求的信息丢入到该文件当中去。
  • 0 标明stdin规范输入
  • 1 标明stdout规范输出
  • 2 标明stderr规范过错

2>&1:相当于将规范过错等效于规范输出,&代表的是等效的意义,愈加高效。此外,**command 1>a 2>&1与command 1>a 2>a仍是有差异的,差异就在于前者只翻开一次文件a,后者会翻开文件两次,并导致stdout被stderr掩盖。&1的意义就能够理解为用规范输出的引证,引证的便是重定向规范输出产生翻开的a。**从IO功率上来讲,command 1>a 2>&1比command 1>a 2>a的功率更高。

e.g. find ./ -name "*.c" > /dev/null 2>&1 <==>find ./ -name "*.c" 1> /dev/null 2>&1

经纬恒润

应聘岗位:嵌入式软件工程师

2022年09月13日–技能一面

​ 首要聊了三个项目,顺便两个简略的C言语以及C++基础常识

  1. 问了个人在项目中所做的作业,所以必定要对项目中的作业进行总结概括,对里边的相关的技能要了解。

  2. 问了竞赛中的立异点,以及竞赛中运用到的常识技能

  3. 和我详细聊了自己在项目中所用的技能栈

  4. C/C++常识:

    • gcc的编译进程:

      • 预处理(Preprocessing):将宏界说#define的内容进行替换,运用预处理器把源文件test.c经过预处理生成test.i文件

        gcc -E test.c -o test.i
        

        注:文件巨细会比源文件大许多

      • 编译(Compilation):将预处理后的文件转化为汇编代码

        gcc -S test.i -o test.s
        

        注:文件巨细会比预处理后的小

      • 汇编(Assemble):将汇编代码转化成机器码,这一步产生的文件叫做方针文件,是二进制格式

        gcc -c test.s -o test.o
        
      • 链接(Linking):运用链接器将该方针文件与其他方针文件、库文件、发动文件等链接起来生成可履行文件

        gcc test.o -o test
        

      一步到位的编译办法:

      gcc -o test test.c # 输出名为test的可履行程序,然后能够履行./test
      
    • union/struct的差异

      struct:各个成员有自己的内存,各自运用互不干扰,遵循内存对齐原则,一个struct的总长度等于一切成员的长度之和

      union:各个成员共用一块内存空间,各个变量共用一个内存首地址。一个union变量的长度至少能够容纳最大的成员变量,并且要满意一切成员变量类型巨细的整数倍。

      巨细端方式影响:大端方式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。小端方式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

  5. 反诘:

    • 我应聘的岗位的首要责任?

      答:公司的首要方向为汽车电子,嵌入式部分首要担任的是门操控器和座椅加热、车窗操控等车内操控,首要从事底层驱动的开发、运用层的完结(依据用户的需求来完结)

    • 公司的人才培育计划?

      答:会有两个训练:一个是公司的训练(新员工入职训练),别的一个事部分的训练(包括专业技能的训练,会有课程组织的;此外会分配专门的导师,能够为你解答疑惑)

    • 公司的人才作业展开的通道?

      答:包括技能能力(有五个等级:A、B、C、D、E)以及办理通道的进步,每年一评

2022年09月18日–书面考试

挑选题
  1. C言语的根本单位:(函数)

  2. int a=b=10是过错的,由于仅仅界说了a,可是b未界说就赋值。若为int a,b; a=b=10;则是正确的

  3. 自增

    #define d 2
    d++; //过错的,宏界说的变量不能运用自增符号
    float a = 1.1f;
    a++;  //float类型能够运用自增
    double b = 2.2;
    char c = 'a';
    int d = 20;
    b++;c++;d++; //都是正确的,int char doube float都能够自增
    
  4. break运用拜访:只能用于case语句或许循环语句中

  5. unsigned char占1个字符,其取值规模为:0~255

编程题
  1. 核算斐波那契数列
  2. 数组排序(降序排序)

2022年09月22日–技能二面

​ 由于经纬的二面是需求做PPT的,所以上来我就先经过PPT介绍了一下我的根本状况、掌握的技能、项目阅历(最拿手的一个)、实习阅历、作业规划。

​ 介绍完后,面试官就开端对我的PPT上的描绘内容进行提问了。首要问了我关于:

  • 团队办理进程中呈现的问题?以及怎样处理的?

  • 讲一讲PID调理的根本原理,以及三个参数的代表的意义。PID调理这一块为啥要运用20次取均匀、PID调理是否有想过用其它的办法进行调理

  • 问了我关于均匀基尔霍夫改换那一块,说说立异点在哪以及说说基尔霍夫改换的根本原理

  • 最终问了一下我的实习阅历,以及为啥不想再实习的公司持续待下去的原因。

小米

应聘岗位:嵌入式软件工程师

2022年09月14日–书面考试

个人心得:不知道为啥,应聘的是嵌入式岗位,可是考的常识点全是Java的

挑选题
  1. TCP通讯必要的五个信息

    答:衔接运用的协议、本地主机的IP地址、本地的协议端口、长途主机的IP地址、长途主机的协议端口。

  2. 二叉树的三种遍历方法:前、中、后序

    答:前序:根左右 、中序:左根右、后序:左右根

  3. 编译程序的组成部分以及功用

    答:一个典型的编译程序有:词法剖析器、语法剖析器、语义剖析器、中心代码生成程序、中心代码优化程序、方针代码生成程序、表格办理和过错处理程序

    • 词法剖析器:输入源程序,拼接、检查、剖析单词,输出单词的机内表达方式
    • 语法剖析器:检查源程序中的存在的语法过错,输出过错处理信息
    • 语义剖析器:进行语义检查和剖析语义信息,并把剖析的成果保存到各类语义信息表中
    • 中心代码生成程序:依照语义规矩,将语法单位转化为必定方式的中心言语代码,如三元式、四元式
    • 中心代码优化程序:对中心代码进行优化,等价改换处理
    • 方针代码生成程序:将优化后的中心代码转化为方针代码(可履行文件)
    • 表格办理程序:担任建立、填写和查找一系列表格作业。表格的效果是记录源程序的各类信息和编译阶段进展状况,编译的信息以及中心成果存储在表格中。
    • 过错处理程序:处理和校对源程序中的存在的词法、语法、语义过错,担任报告出错的方位和过错性质等,对发现的过错进行校对,使得编译程序能够持续剖析和处理
  4. Linux操作体系中的体系资源办理:核算资源(CPU、内存)、存储资源(硬盘)、网络资源(IP、子网掩码、网关、DNS),没有中止这种资源

  5. 跳表:增加了前向指针的链表,是能够进行二分查找的一个有序链表,能够经过索引来进行快速查找。

  6. 堆排序和希尔排序:希尔排序是一种刺进排序,非稳定排序;堆排序是经过二叉树进行排序,是一种非刺进排序

  7. 操作体系中的缺页中止

    概念:要拜访的页不在主存中,需求将其调入主存中然后再进行拜访。

    次序:

    • 硬件陷入内核,在堆栈中保存程序计数器,将当时指令的各种状况信息保存在特别的 CPU 寄存器中;

    • 保存通用寄存器和其他易失的信息,避免被操作体系损坏;

    • 当操作体系发现一个缺页中止时,测验发现需求哪个虚拟页面。一般一个硬件寄存器包括了这一信息,假如没有的话,操作体系有必要检索程序计数器,取出这条指令,用软件剖析这条指令,看看它在缺页中止时正在做什么;

    • 一旦知道了产生缺页中止的虚拟地址,操作体系检查这个地址是否有用,并检查存取与维护是否一起。假如不一起,向进程发出一个信号或杀掉该进程。假如地址有用且没有维护过错产生,体系则检查是否有闲暇页框。假如没有闲暇页框,履行页面置换算法寻觅一个页面来淘汰;

    • 假如挑选的页框“脏”了,组织该页写回磁盘,并产生一次上下文切换,挂起产生缺页中止的进程,让其他进程运转直至磁盘传输完毕。无论怎样,该页框被标记为忙,避免由于其他原因而被其他进程占用;

    • 一旦页框“洁净”后,操作体系查找所需页面在磁盘上的地址,经过磁盘操作将其装入。该页面被装入后,产生缺页中止的进程依然被挂起,并且假如有其他可运转的用户进程,则挑选另一个用户进程运转;

    • 当磁盘中止产生时,标明该页现已被装入,页表现已更新能够反映它的方位,页框也被标记为正常状况;

    • 恢复产生缺页中止指令曾经的状况,程序计数器从头指向这条指令;

    • 调度引发缺页中止的进程,操作体系回来调用它的汇编言语程序;

    • 该程序恢复寄存器和其他状况信息,回来到用户空间持续履行。

  8. UDP首部字段:八个字节,四个字段:源端口号(2个字节)+意图端口号(2个字节)+长度(2个字节)+校验和(2个字节)

编程题
  1. 链表中指定区间反转
  2. 二叉查找树转为双向链表

海信科技

应聘岗位:软件开发工程师(嵌入式)

2022年09月15日–英语口语测验

  1. 跟着读一段英语文字。比较简略,便是一些常用的英语词汇

  2. 听问题并给出你的答复。问题:WHAT DO YOU DO IN YOUR FREE TIME?

    答:

    Read a book

    Whether you have 5 minutes or an hour, picking up a good book and spending some time reading it is a great way to spend your free time in a productive way. If your whole family has a bit of spare time, rather than sitting down to watch TV challenge everyone to pick a book and spend a certain amount of time reading it.

    Not convinced that reading is productive?

    Reading reduces stress, stimulates the brain, provides you with knowledge, improves your memory, helps improve focus and concentration, creates better writing skills, and of course offers free entertainment for however long you choose.

    Exercise

    You knew this one was going to be on the list… you were just really hoping it wouldn’t be. I was hoping it wouldn’t, anyway.

    Exercising, even if it’s just a quick 5-minute walk down the road, is a fantastic way to use your free time. After you exercise you will feel so much more energized, healthy, and ready to face the rest of the day, rather than when you sit on the couch in front of the TV and end up feeling sluggish and lazy for the rest of the day.

  3. 看图说话。英文分享怎样面临作业的压力

​ 答:

​ How to reduce stress is an inevitable part of our daily life. Many things, such as natural disasters, war and death, will bring too much pressure to our lives. But according to a psychologist, based on today’s situation, stress may come from some small things: taking exams, queuing up, and having too many things to do in a limited time We all need pressure to increase the taste of life, challenges and opportunities, but too much pressure will seriously affect our physical and mental health, reduce body immunity and damage the brain.

​ If the pressure lasts too long, it may lead to physical diseases, insomnia, headache, low back pain, ulcer, hypertension. Even if it is heart disease, it is very important to recognize and deal with stress when it really happens. We can try some ways, a lot of sports can reduce the pressure.

​ It can be very helpful to support our stress together with others. Making time for fun, such as listening to music, may be a good medicine, and sometimes crying is an effective way to relieve stress.

2022年09月20日–书面考试

挑选题
  1. 单片机的时钟由外部晶振决议的(X)

答:时钟是单片机的脉息,在一致的时脉冲操控下进行作业,由外部时钟(操控外设)和内部时钟(操控内部芯片)一起决议。

  1. 64KB的空间标明规模:0xFFFF,64KB= 64*1024B = 64 * 1024个字节,故其标明的地址规模最大为FFFF

  2. 逻辑地址空间

    • 程序编译后,每个方针模块都是从0号单元开端编址,称为该方针模块的相对地址(或许逻辑地址)

    • 当链接程序将各个模块链接在一同成为一个可履行方针程序是,链接程序顺次依照各个模块的相对地址一致从0号单元开端编址的逻辑地址空间

    • 用户程序和程序员只需求知道逻辑地址,而内存办理机制是彻底通明的,只需体系编程人员才会涉及

    • 不同进程能够有相同的逻辑地址,这些相同的逻辑地址能够映射到主存的不同方位

    • 进程的履行指令和拜访数据都要将物理地址从主存中存取,当装入程序将可履行代码装入内存中,有必要经过地址转化把逻辑地址转化为物理地址,称为地址重定位

  3. 右斜树、左斜树、彻底二叉树、满二叉树

    答:

    • 左斜树:一切的结点都只需左子树的二叉树叫左斜树。

    • 左斜树:一切结点都是只需右子树的二叉树叫右斜树。

    • 满二叉树

    • 彻底二叉树

      ​ 假如二叉树中除掉最终一层节点为满二叉树,且最终一层的结点顺次从左到右散布,则此二叉树被称为彻底二叉树。

    • 二叉查找树

      若左子树不空,则左子树上一切结点的值均小于它的根结点的值; 若右子树不空,则右子树上一切结点的值均大于或等于它的根结点的值;

    • 平衡二叉树

      平衡二叉树要么是一棵空树,要么确保左右子树的高度之差不大于 1,并且子树也有必要是一棵平衡二叉树

  4. 中止清零

    答:中止能够运用硬件清零、软件清零、主动清零方法进行整理,不仅仅有硬件清零

  5. 贪心算法活动组织最优规矩:相容活动最大的时刻

  6. linux线程绑定CPU

    • 检查进程pid绑核状况:taskset -p pid
    • 发动时绑定:taskset -c 1 ./dgram_servr& //CPU从0开端,发动时绑定到第二个CPU
    • 发动后绑定:taskset -cp 1,2,5,11 9865//将进程9865绑定到#1、#2、#2、#11上
  7. linux查找/usr/bin/htpasswd文件归于哪个包

    答:rpm -qf /usr/bin/htpasswd

  8. Linux核算物理CPU核数

    答:cat /proc/cpuinfo | grep "physical id" |sort | uniq | wc -l

  9. 可重入函数能够调用不行重入函数

    答:

    • 可重入函数:函数能够多线程一起调用,一般只需局部变量的函数内
    • 不行重入函数:不行多线程一起调用,一般由大局变量、静态变量,需求加入互斥锁/信号量/中止
    • 可重入和不行重入函数能够相互调用,可是不行重入函数需求增加互斥
编程题

​ 求出数组中坏数”0″的个数?

注:坏数:即该元素为0,其左右两个元素的值也为0

华勤技能

应聘岗位:嵌入式驱动开发工程师

2022年09月15日–书面考试

  1. 各种排序算法的时刻杂乱度
  2. x*=y+1,等价于x=x * (y+1)
  3. 空指针不是指针常量
  4. 宏界说中未界说变量会在编译时报错
  5. (-5) % 2 = -1

2022年09月21日–老总一面

感触:我认为一面都是技能面,成果一上来是老总面(BIOS十年开发阅历的老总),全程没有问我技能上的问题,问的都是日子方面的,问我有没有女朋友,家里住哪,有没有考虑来上海、南昌展开,然后就问我学习怎样样、导师是谁、项目中有啥难忘的作业嘛以及项目中遇到过一些冤枉嘛?

反诘:

  • 岗位责任:BIOS做的是品牌笔记本软硬件开发(从无到有),竞标,竞选联想、戴尔等大厂的笔记本电脑的生成(从规划到研发到出产),软硬件测验、项目办理
  • 培育计划:专业训练、导师上课(有习题练习)
  • 进步通道:仔细做事(每年有两次)

2022年09月23日–技能二面

​ 技能面没有问常识点相关的内容,仅仅问了一下项目相关的内容以及实习阅历

​ 首要是问了第一个项意图相关细节,便是关于ROS无人驾驶智能小车的,说一说你的项意图阅历、全体的项意图逻辑以及项意图困难点?

​ 之后就问了一下你的一个实习收成?为什么不考虑留在实习的公司里?

​ 最终问了一下,能不能承受南昌和上海地址

反诘:

  • 岗位分配:BIOS、BSP驱动、BMS三大岗位

CVTE

应聘岗位:嵌入式(Linux方向)

2022年09月16日–一面

  1. 手撕冒泡排序,给了挑选题(首要考的是linux基础常识)、填空题(首要靠的是字符串仿制以及C言语的&&和||操作)

  2. 让我开个同享屏幕给他看一下项意图代码

  3. 问了项目(问的不深),就问了项目中你的代码量是多少,首要的责任是做啥的

感触:面试官最终说自己需求加强一下字符串那块常识的学习,需求多刷刷标题,然后的话呢,便是或许第一次遇到这种手撕标题的面试,还需求多堆集堆集阅历

2022年09月21日–二面

  • 手撕编程题(40min):十六进制字符串转为十六进制数字(CVTE的实在场景标题)

  • 问了我一些项目进展延期该怎样办?项目团队成员之间抵触怎样办?对哪方面感兴趣?

  • 反诘

    • 岗位责任:研发嵌入式,TV板卡(电视智能板卡),分为三个方向:驱动程序测验、驱动开发、体系开发(全栈)。

    • 训练计划:

      • 新人一个月的成长学院学习(学习西装礼服、西餐、时刻办理、古典音乐鉴赏、个人健康、心理咨询)等
      • 下部分:1~2个月学习工具类,第三个月搞项目,进行辩论评估定岗,转为正式期。若定不了岗则可延长到6个月,若还不行则需转岗。
    • 进步通道:定级(每年3、7、11月进步),进步规范(11.1、11.2、11.3、12等等顺次类推)会有进步辩论(8个维度的辩论),新人入职从11级开端做起,13级后HR会进行谈话,问询是转技能岗仍是技能办理岗。

美团

应聘岗位:硬件开发–嵌入式主动驾驶

2022年09月17日–书面考试

编程题
  • 考了四道编程题,美团自主出题的

感触:编程题这块,大厂仍是相对来说比较注重的,日常中还得多加强这方面的训练

挑选题
  • 有必要要擦除才干运用的存储介质(CD)

    A. SRAM B. DRAM C. EEPROM D.Flash

​ 解析:flash芯片不支持掩盖写,只能在擦除过的区域进行写操作,并且擦除一般是依照扇区或许是块进行擦除。根本原因其实是flash芯片的写操作只能将1变为0,而不能将0变为1,擦除之后,flash中是全1的状况,若想将0变为1则只能经过擦除操作。

​ EEPROM的全称是“电可擦除可编程只读存储器。flash归于广义的EEPROM,由于它也是电擦除的rom,掉电后数据不丢失,能够保存100年,能够擦写100万次。具有较高的可靠性。

滴滴

应聘岗位:主动驾驶立异事务-嵌入式开发工程师

2022年09月17日

挑选题
  1. 接连子序列最大和

  2. 贪心算法缺点

    答:(1) 不能满意求得的最终解是最佳的 (2) 不能用来求最大或许最小解的问题 (3) 只能求满意某些约束条件的可行解的规模。

  3. 勘探主机开发的端口:netstat -a -n

  4. 字节省数组的运用:ByteArrayInputStream is = new BByteArrayInputStream("hello,world")

  5. apache装备多个网站:(1)依据IP的虚拟主机,每个虚拟主机有必要有仅有的IP (2)依据姓名的。只需求依托客户端发送的HTTP头信息的HOST字段来判别,服务器到底要服务哪个虚拟主机。

  6. 代码剖析:

     File file = new File("D:\\test\\1.txt");
    // 假如D:/test 目录下没有 1.txt文件,则创立该文件;假如没有test目录,直接抛出反常,假如1.txt现已存在,那么文件创立失利。
    boolean res = file.createNewFile();
     if(!res)
     {
     	System.out.println("创立失利!");
     }
    
  7. C++虚函数:运用父类的指针指向的是子类的实例,调用的时分经过父类的指针能够调用实践子类的成员函数

  8. 二叉查找树的均匀长度:∑(本层高度元素个数)/ 节点个数

  9. 内核级线程(KLT):线程一切的办理作业都由操作体系内核完结

  10. mysql锁特性:(1)表级锁:开支小,加锁快,不会呈现死锁,并发度最低。 (2) 行级锁:开支大,加锁慢,会呈现死锁,并发度最高 (3) 页面锁:开支介于表级锁和行级锁之间,会呈现死锁,并发度一般

  11. mutex为1,标明没有进程进入临界区;mutex为0,标明有一个进程进入临界区,mutex为-1,标明一个进程现已进入,别的一个进程等候进入。

  12. 页式存储办理:页式存储体系的逻辑地址是由页号和页内地址两部分组成。

编程题

都是滴滴自出题的编程题,难度适中,需求较好的逻辑思维能力

  1. 求墨水污染的数字
  2. 刷油漆问题

美的

应聘岗位:嵌入式软件开发工程师(机器人与主动化事业部)

2022年09月19日–群面(省会城市的大酒店)

常识点补充:群面便是一堆人围绕着标题进行评论,然后总结出规则,最终选出一名代表进行陈述,全程面试官是不参加话题评论的,只需面试者要进行观点的论述和总结。

​ 咱们总共有7个人进行群面,然后7个人围绕着一个方桌坐下,每个有都会有对应的座位牌,这次群面的标题是:

  1. 在数据量极大的状况下,怎样进行数据的存储?请从架构方面以及详细技能方面论述。
  2. 你认为的智能家居体系由哪些部分组成?技能上怎样完结以及采用哪种手法?

​ 流程:

  • 先进行1分钟的自我介绍以及对这两个标题的作答
  • 20分钟的组内评论,我们评论一下各个细节方面的事项以及交流一下各自的定见。
  • 5分钟的总结。选出一名代表进行总结

​ 要点总结:

  • 首要必定要针对问题进行剖析,然后必定要鲜明地表达自己的观点,要让面试官眼前一亮。
  • 组内评论的时分必定要参加进来,要活跃评论,活跃发言,表达清楚自己的观点
  • 总结的时分,若感觉自己总结的比较好的话就活跃引荐自己,千万不要怯场,不要由于惧怕而不敢去说

​ 我的答复:

​ 个人理解环节:关于第一个问题来说,我觉得能够构建一个散布式的存储体系,采用多节点的方法来进行存储,然后运用一个主节点对各个节点进行办理;关于第二个问题来说,我会考虑的愈加贴近日子一点,比方从我在外面、进入家门、躺着沙发歇息、厨房卫生、打扫卫生、洗浴、睡觉等各个方面都要进行一个智能化遍及,比方说在外面经过APP来操控家内家具的状况,进门时经过人脸辨认或许指纹辨认来完结开门,在室内经过智能语音组手来操控家内的家具,比方沙发按摩、厨房水温调理、扫地机器人打扫卫生、澡堂稳定水温、睡觉灯光操控、窗帘操控等。

​ 评论环节:在家居中增加传感器,完结传感器的数据融合;在家居中增加智能预警体系,当电量过低的时分报警以及实时检测电量状况;相比较于刚刚我们评论的算法运用,我其实愈加重视于底层硬件的建立,怎样完结成本的降低以及怎样完结能够高效搭载软件算法的硬件。

​ 总结环节:1. 室外运用手机APP 2. 室内运用语音操控 3. 增加家居的传感器实时检测 4. 硬件的建立

2022年09月20日–测评

​ 测评首要包括了:性情测验、场景应变能力测验、逻辑思维测验两个部分

2022年09月22日–专业面试

​ 面试首要先问了一个较为温文的问题,总共有两个面试官,两个都是机器人与主动化事业部的技能管,问了一下我在大学期间做的最有收成的一件事,之后就开端问技能了。

​ 第一个面试官首要对我的第一个项目感兴趣,就和我一向评论第一个项目,而第二个面试官首要对我的第二个项目感兴趣,就和我一向评论第二个项目。所以首要要对自己做的项目里边的细节要了然于胸

​ 反诘:

  • 岗位责任:做的是库卡机器人,是一种工业机器人,做的是本体的操控器,所以需求做的便是机器人的操控这一部分。
  • 培育计划:应届生培育计划、部分培育
  • 后续成果组织:HR面经过之后发Offer

2022年09月24日–收成Offer

​ 今天正午11点在长沙北辰国萃酒店进行了谈薪,全体听下来福利还不错,本科生20W+,研究生30w+,sp Offer 40w+,并且公司的福利许多,作业时长是955,不提倡加班,这一点的话,全体来说仍是相对薪酬较高的。

​ 签完约后就和部分的搭档和HR碰头,并敞开了破冰之旅,玩了一些小游戏(PS: 酒店的甜点和美食是真的蛮不错的,还有各种饮料^-^)

中科创达

应聘岗位:畅行智驾-MCU开发工程师(校招)

2022年09月20日–书面考试

挑选题
  1. a=c+2=b合法吗(x)

  2. #include “”和#include <>的差异?

    答:#include <>直接从体系的类库中查找头文件,若没有话则报错;#include “”先从作业目录中查找,若没有则从体系类库中查找,若未找到则报错。#include “”查找的规模要比#include <>要广

  3. 作业和进程的对应联系? 答:进程和程序是一一对应的联系,一个作业能够由多个进程组成,且有必要至少由一个进程组成,当一个进程不能构建多个作业

  4. relloc函数用法?

    答:将请求的内存空间进行扩大或许削减。

    • 若为削减,则仅仅改动索引即可
    • 若为增加,则
      • 若当时内存段后边有需求的内存空间,则直接扩展这段内存空间,relloc放回原指针
      • 若当时内存段后边没有需求的内存空间,则在堆中从头请求一块满意要求的内存块,将本来的数据仿制过去,并开释本来的数据块
      • 若请求失利则回来NULL,此刻,本来的指针依然有用
  5. UART波特率是固定的吗?

    答:波特率是要依据其时钟频率来确认的,而时钟频率是可调的,所以波特率是可调的

  6. enum{1,2,3}是正确的吗?

    答:是过错的,由于1,2,3是枚举的标号,若这样写的话无法差异是咱们界说的变量仍是枚举的标号

  7. undef用法?

    答:用来将前面界说的宏标识符撤销界说,能够避免宏界说抵触、增强代码可读性、增加调试接口

    #define MAX 200
    printf("MAX = %d\n", MAX); 
    #undef MAX //运用完后就撤销界说
    int MAX = 10;
    printf("MAX = %d\n", MAX); 
    

海康威视

应聘岗位:软件开发工程师(嵌入式C/C++)

2022年09月22日–技能一面

​ 面试官全程问了几个技能问题以及了解一下我的性情方面的详细状况

性情问题:

  • 讲一讲你是怎样乐于助人的?
  • 讲一讲你的学习能力强体现在哪一方面呢?
  • 讲一讲你抗压能力强体现在哪一方面呢?
  • 讲一讲你的团队协作能力和交流能力强体现在哪一方面呢?

技能问题:

  • 讲一讲冒泡排序的根本思路?

    答:

    ​ 把第一个元素与第二个元素比较,假如第一个比第二个大,则交流他们的方位。接着持续比较第二个与第三个元素,假如第二个比第三个大,则交流他们的方位。

    ​ 咱们对每一对相邻元素作相同的作业,从开端第一对到结束的最终一对,这样一趟比较交流下来之后,排在最右的元素就会是最大的数。除掉最右的元素,咱们对剩余的元素做相同的作业,如此重复下去,直到排序完结。

  • Linux内存请求有哪些方法?

    答:

    • malloc:在内存中找一片指定巨细的空间,然后将这个空间的首地址规模给一个指针变量,这儿的指针变量能够是一个单独的指针,也能够是一个数组的首地址,其在逻辑上是接连的

    • kmalloc():void *kmalloc(size_t size, gfp_t flags);

      kmalloc() 请求的内存位于物理内存映射区域,并且在物理上也是接连的,它们与实在的物理地址只需一个固定的偏移,由于存在较简略的转化联系,所以对请求的内存巨细有约束,不能超过128KB。

    • kzalloc()

      kzalloc()和kmalloc相同,实践上仅仅额外附加了 __GFP_ZERO 标志。所以它除了请求内核内存外,还会对请求到的内存内容清零。

  • 数据库用过哪些?怎样应对大的数据库的巨大的查询量?

    答:Mysql、sqlite。子查询/衔接+索引

  • 怎样完结并发?怎样确保上亿数据的并发?

    答:

    • 体系拆分。将一个体系拆解成多个子体系,运用dubbo来弄,将每个体系衔接一个数据库,相当于一个体系多个库

    • 缓存。在数据库和缓存中都写一份,读的时分大量读走缓存就行

    • MQ完结异步写(音讯行列),完结数据的读和写解耦的操作,从而到达异步的效果

    • 分库分表。将一个数据库拆分为多个库,多个库来抗更高的并发;然后将一个表拆分为多个表,每个表的数据量保持少一点,进步sql跑的功用。

    • 读写分离。弄个主从架构,主库写入,从库读取。

    • Elasticsearch是散布式的,可随意扩容

反诘:

  • 培育计划:6个月试用期,导师一对一带领入门,分阶段检查,有辩论查核
  • 进步通道:技能(每年一查核)、办理:两年后能够转岗(转为办理),担任团队办理
  • 后期组织:依据需求看是否需求技能加面,后便是HR面,最终入职

紫光同创

应聘岗位:嵌入式软件开发工程师

2022年09月22日–书面考试

挑选题
  1. 派生类析构函数调用次序?

    答:析构函数调用次序:首要调用派生类的析构函数; 其次再调用成员类目标的析构函数;最终调用基类的析构函数;而结构函数恰好相反

  2. C++中引证和指针差异?

    答:

    • 引证有必要初始化,可是不分配存储空间,指针不声明时初始化,需求分配空间
    • 引证初始化后不能被改动,指针能够改动所指的目标
    • 不存在指向空值的引证,可是存在指向空值的指针
    • 引证没有const,指针有const,const的指针不行变
    • sizeof*引证”得到的是所指向的变量(目标)的巨细,而“sizeof “指针”得到的是指针自身的巨细
  3. 虚函数是析构函数吗?

    答: 结构函数不行所以虚函数,析构函数常常是虚函数。

    ​ 当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构。虚函数表是由编译器主动生成与维护的,virtual成员函数会被编译器放入虚函数表中,当存在虚函数时,每个目标都有一个指向虚函数的指针(vptr指针)。在完结多态的进程中,父类和派生类都有vptr指针。

    ​ 与结构函数不同,vptr现已完结初始化,析构函数能够声明为虚函数,且类有承继时,析构函数常常有必要为虚函数。

  4. 成员函数被重载的特征?

    答:

    • 具有相同的效果域
    • 函数姓名相同
    • 参数类型,次序或许数目不同
    • virtual关键字可有可无
编程题
  1. 运用新字符替换字符串中的特定字符
  2. 链表反转

海能达

应聘岗位:嵌入式软件开发工程师

2022年09月23日–书面考试

​ 海能达的书面考试全体上来说仍是很基础的,只需细心去做就没太大问题。

挑选题

​ C言语和C++的基础常识,考了虚函数相关的内容,父类和子类虚函数调用的次序

​ 看一个虚函数的例子:

​ 虚函数:指向基类指针在操作它的多态类目标的时分,能够依据指向的不同类目标调用其相应的函数

​ 效果:在基类界说了虚函数后,能够在派生类中对虚函数进行重界说,并且能够经过基类的指针或许引证进行调用,在程序运转阶段动态地挑选调用基类或许不同派生类的同名函数,若派生类没有对虚函数的从头界说则承继基类的虚函数并调用

#include "stdafx.h"
#include<iostream> 
using namespace std;
class Base
{
public:
    virtual void Print()//父类虚函数
   {
        printf("This is Class Base!\n");
   }
};
class Derived1 :public Base
{
public:
    void Print()//子类1虚函数
   {
        printf("This is Class Derived1!\n");
   }
};
class Derived2 :public Base
{
public:
    void Print()//子类2虚函数
   {
        printf("This is Class Derived2!\n");
   }
};
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年后能够走技能专家道路或许团队办理道路。

​ 训练:部分级和公司级(20个课程的展开)

​ 后期:HR后进行相应的组织

2022年10月3日–放弃后续面试

奥比中光

应聘岗位:嵌入式软件开发工程师

2022年10月28日–技能一面

  • 关于STM32开发的项意图阅历,问了我遇到了哪些项目上的问题,是怎样处理这些问题的
  • 关于STM32外设的运用,用过IIC、SPI、UART、定时器中止的哪些外设功用,让我讲讲IIC的通讯协议
  • 关于linux驱动的开发相关的内容,用过Platform总线匹配驱动的功用,用过哪些结构,比方字符设备结构、块设备结构、网络设备结构
  • 是否触摸过USB协议,如MITT协议
  • 讲一讲作业行列的相关内容

反诘:

  • 作业内容

    方向一:STM32开发。奥比中光首要有自研的3D芯片(Cortex-M),所以要依据其进行固件开发;

​ 方向二:Linux开发。奥比中光运用的是海思、全志、英伟达等芯片原厂的芯片,所以要依据其芯片进行驱动匹配,适应各个渠道,如安卓等体系,并且还要进行3D算法的调试,比方适配RGB摄像头、3D摄像头号

  • 培育计划

    会有公司层面、部分层面、小组层面训练,总共有6个月,并且有一对一导师

  • 人才展开通道

    首要有办理和技能两条道路,办理的话和技能是同步的。

2022年11月02日–技能二面

  • 详细介绍一下第二个项目:依据STM32 FPGA的高精度恣意波形模块,问了我关于第二个项目个人所做的作业是哪些
  • 详细介绍一下第一个项目:依据ROS体系的无人驾驶智能小车,问了我关于这个项目中个人所做的作业是哪些,以及项目中成员小组的分工是哪些
  • PCB规划的时分是否运用过高速的信号线
  • 个人的一个作业规划,是更偏向于底层仍是更偏向于上层
  • 和我说了一下底层的话,首要是要对Linux体系的运用和STM32开发了解,当然也要具有多线程和多进程的能力。

2022年11月02日–HR面

  • 做了个简略的自我介绍,问了一下家庭状况,问了爸爸妈妈在哪里上班、兄弟姐妹在哪里上班
  • 其它公司的Offer以及问了为什么还没有签三方呢?
  • 个人平时的爱好
  • 其它公司给我开了多少,公积金怎样核算的
  • 现在手上的Offer排序,以及为什么要这样排序

2022年11月09日–收到Offer

得一微

应聘岗位:嵌入式软件开发工程师

2022年11月07日–HR面

  • 在校的成绩怎样样,在年级排多少名
  • 英语四六级过了嘛
  • 在学校期间获得过哪些奖学金以及获得过哪些奖项
  • 介绍一下家庭布景,爸爸妈妈是做什么的
  • 在项目中遇到过哪些难题,最终是怎样处理的
  • 性情上的优缺点
  • 假如上级组织一个全新的课题给你,可是你没有触摸过这方面的范畴,你会怎样去做呢?
  • 了解公司吗?知道公司首要是做什么的呢?
  • 讲一讲自己上一次生气是什么时分
  • 希望的薪资是多少

总结:在校期间,虽然说是要多参加竞赛和项目,可是学习成绩也尽量不要拉下,多拿奖学金;在大学期间,英语四六级必定要去过了,英语很重要!!

2022年11月09日–技能一面

  • 讲一讲大学四年的技能栈道路

  • 谈一下你在项目中的责任,你们项目中的难点是什么

  • 多核怎样完结Spin Lock

    答:运用owner,next机制

    owner指示自旋锁当时拥有者序号,next 标明当时恳求线程的等候序号,

    每次进入读取lock当时值并测验next加一,经过LL/SC指令确保该值仅有;

    假如local->next和lock->owner不等,则循环查询等候(自旋)。每次开释锁时owner加一,指示下一个自旋等候线程(处理器)能够持续运转

    拓宽:

    1. spin锁是针对多核规划的。单核状况下锁中止就能够测验进入临界区,可是多核状况下,锁中止仅仅锁定了当时核,其他核还在运转,所以需求自旋锁来作为一个能够进入临界区的flag,当多个核竞赛进入一个 临界区时,自旋锁能够让没有得到锁的中心自选等候。
    2. LL操作:回来一个内存地址上当时存储的值;SC操作:向这个内存地址写入一个新值,只需在这个内存地址上存储的值,从上个LL操作开端直到现在都没有产生改动的状况下,写入操作才干成功,不然都会失利。
  • 实习做的作业是哪部分?实习中遇到的团队成员定见不一起怎样处理?项目和公司的对接人是谁呢?

  • 反诘

    • 公司岗位责任:首要是做固件库的开发,先从事HAL库的开发、后边再从事TAL库的开发,也便是公司的中心事务
    • 人才的进步通道:3年内得到一个技能上的展开,能够独立完结作业使命、5年内能够独立带领团队和项目

乐动机器人

应聘岗位:机器人软件开发工程师

2022年11月08日–技能一面

  • 关于Linux和STM32中止的差异
  • Linux中Uboot的效果以及Uboot传递给Linux内核的参数是什么
  • 项目中遇到哪些难点,怎样处理的
  • 在不同开发板中遇到过信号呈现差异状况嘛,以及怎样处理呢
  • 反诘:
    • 作业的责任:首要分为激光雷达的自研发以及机器人处理计划的供给,其间机器人包括了扫地机器人、除草机器人、服务机器人、搬运机器人等等,公司会依据应届生的个人能力来确认岗位

2022年11月09日–技能二面

  • 介绍一下自己的实习项目?实习项目首要是做什么的呢?
  • 你自己在实习进程中的首要作业是做什么呢?实习中有代码编写嘛?代码量是多少呢?
  • 能详细讲一讲你们实习的作业细节是什么呢?
  • 讲一讲你的STM32相关的项目吧,在项目中你首要做哪部分作业呢?硬件是你们自己的弄的嘛?
  • 有没有愈加杂乱的项目呢?第一个项目中你们改善的算法是哪个呢?能详细讲一讲小车操控这一块是怎样做的呢?

2022年11月14日–收到Offer