牧原共三面,二面为技术面,应聘的岗位为屠宰事业部嵌入式软件方向,主要问到项目经历和C语言基础知识偏多
目录
6.32位机器,结构体指针中成员有char、int、short各一个,指针步长为多少
17.如果有1000万预算,但是项目一直没有实质起色和成果,作为项目负责人你会怎么做?
18.如果项目初期攻坚内容比较复杂,公司也没有奖金支持,你会怎么缓解员工压力和焦躁?
1.简述一下项目中用到的SPI、UART通信协议
一文吃透常见通讯协议(SPI、IIC、UART、CAN)[面试重点]-CSDN博客
2.为什么用电机模块,电机的工作原理
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。
通俗易懂的说:就是给不同的项轮流通电,在电磁感应的作用下,每次产生一个很小的角位移,连贯起来就带动了电机的转动,从而驱动负载。
STM32驱动步进电机(原理、程序、解决电机只震动不转动问题)_stm32步进电机-CSDN博客
3.什么是指针,有什么用
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
4.指针多大,指针偏移量和什么有关
(C语言)指针初识(1)——指针概念及指针类型_指针类型是什么意思-CSDN博客
1、指针就是地址,是内存中一个最小单元的编号
2、口语中的指针其实指的是指针变量,是用来存放内存地址的变量
3、指针变量里面存放的是地址,而通过这个地址,就可以找到一个内存单元
指针的大小:在32位平台是4个字节,64位平台是8个字节(x86-->32位环境,x64-->64位环境)
指针的地址偏移量和保存这个地址的指针类型有关。
指针的类型占有的内存空间,就是 指针加1 的地址偏移量。
5.指针函数和函数指针的作用和区别
指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
定义不同
指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
写法不同
指针函数:int* fun(int x,int y);
函数指针:int (*fun)(int x,int y);
可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。
再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。
和此问题类似的还有指针数组和数组指针的问题:
6.32位机器,结构体指针中成员有char、int、short各一个,指针步长为多少
C语言各变量类型占字节数_c语言各种变量所占字节_大山很山的博客-CSDN博客
7.#include后面使用尖括号<>和双引号""的区别
#include使用引号“”和尖括号<>的区别?-CSDN博客
系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。
用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来设定)中查找,最后在系统文件中查找。
#include "文件名"命令则是先在当前文件所在的目录搜索是否有符合的文件,如果没有再到Include文件夹里去找对应的文件。因此,无论这个文件是C++提供的还是自己编写的,使用#include "文件名"命令一定是正确的。
8.结构体和联合体的作用和区别
结构体(struct)和联合体(union)的区别_结构体和联合体的区别-CSDN博客
结构体struct:各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
联合体union:各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名直接赋值或其他操作。
关于结构体大小的计算
9.gcc编译过程
gcc编译的四个过程:预处理、编译、汇编、链接
gcc在执行编译工作的时,分为以下四个过程:
1.预处理,生成.i的文件
2.将预处理后的文件转换成汇编语言,生成.s文件
3.汇编变为目标代码(机器代码),生成.o的文件
4.连接目标代码,生成可执行程序
10.堆和栈的作用和区别
详讲堆和栈的区别基础应用篇_堆栈什么时候下使用-CSDN博客
(1)管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏;
(2)空间大小不同。每个进程拥有的栈的大小要远远小于堆的大小。理论上,程序员可申请的堆大小为虚拟内存的大小,进程栈的大小 64bits 的 Windows 默认 1MB,64bits 的 Linux 默认 10MB;
(3)生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
(4)分配方式不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手工实现。
(5)分配效率不同。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多。
(6)存放内容不同。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保存,需要使用栈来实现,首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(EBP),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。
11.进程和线程的作用和区别、包含关系
进程:是一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。
线程:是进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
进程包含线程。
12.GPIO的输入输出模式
13.什么是中断,中断的过程和作用
什么是中断:中断是指CPU在执行当前程序时系统出现了某种状况,使得CPU必须停止当前程序,而去执行另一段程序来处理的出现的紧急事务,处理结束后CPU再返回到原先暂停的程序继续执行,这个过程就称为中断。
中断的作用:使得计算机系统具备应对对处理突发事件的能力,使其能及时响应紧急事件。提高处理器效率,如果没有中断系统,CPU就只能按照原来的程序编写的先后顺序,对各个外设进行查询和处理,即轮询工作方式,轮询方法貌似公平,但实际工作效率却很低。
中断的过程:
1. 保存现场
2. 执行具体的中断服务程序
3. 从中断服务返回
4. 恢复现场
14.什么是看门狗,看门狗的过程和作用
初学STM32之看门狗_stm32 watchdog_好运小枣的博客-CSDN博客
单片机在工作中常常会受到来自外界电磁场的干扰,造成程序跑飞,而陷入死循环,程序的正常运行被打断,使得系统无法正常工作,造成整个系统陷入停滞状态。所以为了对单片运行状态进行实时监测,便产生了一种专门用于检测单片机程序运行状态的模块或者芯片,俗称看门狗(watchdog)看门狗的作用就是在程序跑飞的情况下,系统复位,程序重新执行。
嵌入式系统的软件看门狗和硬件看门狗_软件看门狗 程序框图-CSDN博客
15.STM32最小系统板包括什么部分
主要由单片机、晶振电路、复位电路三部分构成。
晶振电路:主时钟晶振、RTC时钟晶振
外围电路:+5V转3.3V稳压电路、 状态指示灯、 SWD烧录接口、USB电源接口
16.const和static的作用和区别
【精选】static和const的作用与区别_const static-CSDN博客
const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态变量在函数执行后不会释放其存储空间。