从今天起,豆芽有空也尽己所能,帮助一下大家。

面经来源:https://www.nowcoder.com/discuss/689866?source_id=discuss_experience_nctrack&channel=-1


1. C语言结构体怎么定义节省内存

  1. 在保证值域足够的情况下,用小字节变量代替大字节变量,如用short替代int,float替代double

  2. 将各成员按其所占字节数从小到大声明,以尽量减少中间的填补空间(字节对齐)。

  3. 可以取消字节对齐,#pragma pack(1),当然这会牺牲效率,谨慎采用。


2. 单片机main函数之前做了哪些工作

主要完成两部分工作,一个是硬件执行环境,如建立中断向量表、初始化堆栈寄存器、关闭看门狗、初始化内部或者外部RAM等,另一个是软件环境,如加载C库环境、ZI(未初始化的内存变量)、初始化堆栈指针等。


3. 程序是怎么编译成bin文件的

GCC的objcopy工具可以实现这个功能,具体方法是:

  1. 先用gcc把douya.c编译成douya.o:gcc -c douya.c -o douya.o

  2. 将douya.o转为bin文件:objcopy -O binary douya.o douya.bin


4. 用的什么烧录软件

STC型单片机:STC-ICP

STM32一般利用仿真器烧录:连接STLINK仿真器,使用ST-LINK Utility软件烧录


5. 写过驱动程序吗

一个驱动程序就是一个函数和数据结构的集合,它的目的是建立内核和实际硬件之间的连接,从而提供通过内核访问底层硬件的上层API接口。内核用这个接口请求驱动程序控制设备的I/O操作。

一般本科搞过单片机的同学,都写过直流电机、步进电机的驱动程序,可以说说,涉及到PWM


6. 说一下中断的原理

中断是指当出现需要时,CPU暂时停止当前进程的执行,转而执行处理新情况的中断处理程序。当执行完该中断处理程序后,则重新从刚才停下的位置继续当前进程的运行。

为了区分不同的中断,每个设备有自己的中断号。系统有0-255一共256个中断。系统有一张中断向量表,用于存放256个中断的中断服务程序入口地址。每个入口地址对应一段代码,即中断服务程序


7. 是怎么进入到中断服务程序的

为了区分不同的中断,每个设备有自己的中断号。系统有0-255一共256个中断。系统有一张中断向量表,用于存放256个中断的中断服务程序入口地址。每个入口地址对应一段代码,即中断服务程序

找到入口中断地址,也就进入服务程序了。


8. 中断开始前要进行些什么操作

保存现场。保存当前的PC值到R14,寄存器R14常用作链接寄存器(LR,Link Register),当进入子程序时,常用来保存PC(Program Counter,程序计数器) 的返回值。保存PC值后,接着保存当前的程序运行状态到SPSR(Storage Program Status Register,程序状态备份寄存器)。


9. 会C++吗

不会(不给面试官任何机会)

开玩笑的,得说会,具体看我博客面经学习。


10. 介绍一下stm32

STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM控制器。

我们以STM32F103为例,其具备以下资源:

  • 内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPSMHz。单周期乘法和硬件除法。
  • 存储器:片上集成512KB的Flash存储器。6-64KB的SRAM存储器。
  • 低功耗:3种低功耗模式:休眠,停止,待机模式。
  • 调试模式:串行调试(SWD)和JTAG接口。
  • DMA:12通道DMA控制器。
  • 支持的外设:定时器,ADC,DAC,SPI,IIC和UART。
  • 2个12位的us级的AD转换器(16通道):AD测量范围:0-3.6 V。双采样和保持能力。片上集成一个温度传感器。
  • 2通道12位DA转换器:STM32F103xC,STM32F103xD,STM32F103xE独有。
  • 最多高达112个的快速IO端口
  • 最多多达11个定时器:
    2个看门狗定时器(独立看门狗和窗口看门狗)。
  • 最多多达13个通信接口:2个IIC接口(SMBusPMBus)。5个USART接口(ISO7816接口,LIN,IrDA兼容,调试控制)。3个SPI接口(18 Mbits),两个和IIS复用。CAN接口(2.0B)。USB 2.0全速接口。SDIO接口。


以上所有题的答案其实都来源于我的博客面经,欢迎大家围观:https://blog.nowcoder.net/jiangwenbo