2020秋季招聘面试-嵌入式开发面试问题大疆华为
大疆
数据通信协议
常见的有SPI、I2C、UART、CAN等单线收发的通信协议和RS485
总结图有空再补上。
SPI需要几根线?工作原理?
通常需要4条线,分别为主输出从站3358www.Sina.com/、主输入从站输出MOSI、主输出时钟MISO、主输出com
SPI在时钟极性SCK和时钟相位NSS:CPOL为0时,定义SCK怠速状态为低电平; 当CPOL为1时,SCK空闲状态为高电平。 当CHA为0时,用SCK的CPOL进行采样; 在CHA为1的情况下,用SCK的CPHA进行采样。
这样,可以基于CPOL和CPHA的值定义四种执行模式。 一般使用模式0和模式3。
模式CPOLCPHA空闲电平采样沿000低电平上升沿下降沿101低电平下降沿上升沿210高电平下降沿311高电平上升沿下降沿在相应边缘处对电平进行采样,即,将此时的电平作为信号读出并输出(要求信号在此时是稳定的)。
对应数据的变更即触发,在相反的边缘进行。 (注意:模式采样沿指主从输入。)
奇数边沿
UART不是USART,只能通过偶数边沿和UART需要几根线,初始化配置需要配置什么?这两条线路进行通信。 通信双方必须使用相同的Rx,将正确电平的信号采样为0/1的信号。 FPGA实现UART的时序图如下所示。
要在STM32中配置UART,请参阅Tx,波特率,波特率,字长,33333333http://
停止位数
少废话直接上图:
分子f是UART的时钟,一般是安装在该UART中的(APB1/APB2 )总线时钟。 USARTDIV是波特率寄存器的校验位:高12位为整数部分,低4位为小数部分。
当然,平时使用库函数配置波特率,库函数会自动计算分频系数。
硬件流控制
正确答案为读写功能时发生中断,发生两个事件时串行端口的对应标志所在,发生对应的中断。 但是,通常也可以通过接收中断、发送轮询的方式进行UART通信,根据需要搭载DMA。 不是很美吗?
UART波特率如何设置?
无符号定点数
串口的接收和发送哪个会触发中断?
中断处理的流程为两个、中断更及时还是轮询更及时?、中断、中断现场保存的过程。、3http://ww/Sina/com
现场保护:发生中断时,将CPU的当前状态,也就是中断的出口程序保存在寄存器中,然后执行中断服务,中断返回时,从寄存器中取出地址并继续执行。 遵守现场的开始,是在不丢失中断前的状态的情况下进行保存。
33559 www.now coder.com/question terminal/2e 85847 c 06684 C2 FAE af 8728 f 72e 5045? toCommentId=426573
请求中断
在函数a调用函数b的情况下,首先在自己的堆栈帧中压入函数的返回地址,然后比特函数b制作新的堆栈帧并压入系统堆栈。
在函数堆栈帧中,首先从右到左依次对参数进行堆栈,然后对返回地址进行堆栈,然后进行堆栈帧的调整。 保存当前堆栈帧的状态值,将当前帧切换到新的堆栈帧,并将其指定给新的堆栈帧
空间。C程序分段
分为代码段、BSS段、数据段、栈和堆五个部分:
代码段: 存储二进制指令,通常是一块存储程序执行代码的内存;
BSS段:存放未初始化的全局变量和静态变量的一块内存;
数据段:存放已初始化的全局变量及静态变量;
栈:自动变量(函数内的局部变量)和数组;
堆:手动申请空间的变量。
全局、静态和自动变量的区别
全局变量是在所有函数体外定义的,在某文件中定义后改文件所有函数都可直接调用,外部文件通过 extern 声明后也可调用,生命周期为定义处至程序结束;
静态变量是用 static 修饰的变量,其生命周期同全局变量一致。在函数内定义的静态变量,在此进入函数时保留前次退出函数时的值;以 static 修饰的全局变量,通常不可被外部文件访问,外部文件若定义一个相同名称的全局变量,这两个变量是不一致的,编译器不会报错。
自动变量是在函数内定义的变量,其生命周期为定义处到本次函数调用结束。自动变量需要赋初值,否则为随机值、无效值,而全局、静态变量初值默认为0;
BootLoader启动过程
初始化处理器及外设、建立内存空间映射图、调用系统内核、跳转到用户程序。
MCU启动操作
A.初始化时钟;B.关闭看门狗;
C.建立中断向量表;
D.初始化堆栈寄存器;
E.内存初始化。
STM32F1和F4的区别
内核不同:F1是ARM M3内核,F4是ARM M4内核;
主频不同:F1主频72MHz,F4主频168MHz;
浮点运算:F1无浮点运算单位,F4有;
功能性能:F4外设比F1丰富且功能更强大,比如GPIO翻转速率、上下拉电阻配置、ADC精度等;
内存大小:F1内部SRAM最大64K,F4有192K(112+64+16)。
内联函数
内联函数和宏很像,是代码被插入到调用者代码处的函数,通过编译器实现,调用时不需要像普通函数一样入栈,所以效率高。
它通过Inline进行限制。
它内部执行代码不能太多,一般不超过10行,不能有循环,不能有过多判断,也不能对内联函数取址。
启动文件的作用:
A.初始化堆栈指针SP
B.初始化PC指针,指向复位程序(其实就是BootLoader)
C.初始化中断向量表
D.配置系统时钟
E.调用C库函数 _main
内联函数和宏定义的区别
A.宏是在代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用处,而减少了普通函数调用时的资源消耗;
B.宏定义在预处理阶段进行替换(预处理器处理),内联函数在编译阶段进行替换(编译器处理);
C.内联函数在运行时可调试,宏定义不行;
D.编译器会对内联函数的参数类型做安全检查或自动类型转换,宏定义不会;
E.内联函数可以访问类的成员变量,宏定义不能;
进程间通信方式
管道、FIFO、消息队列、信号量、共享存储、套接字