嵌入式面试题3

1、讲一下STM32时钟系统
时钟系统类似于脉搏,控制着CPU的命脉,STM32的时钟源又不像51的时钟源那么单一,因为STM32的MCU较为复杂,且外设较多,并不是所有的外设都需要那么高的时钟频率,而且较高的频率对功耗和抗干扰都不具优势,所以对复杂的MCU系统往往采取多个时钟源,STM32有5个时钟源,HSI、HSE、PLL(这三个往往作为系统时钟)、LSI(外部看门狗时钟)、LSE(STC时钟源)。

2、c语言中堆和栈的区别
1、数据结构上:

  1. 都是一种数据项按序排列的数据结构。
  2. 栈:一种具有先进后出性质的数据结构
  3. 堆:堆是一种经过排序的树形数据结构、通常我们所说的堆的数据结构,是指二叉堆、虽然存储有序,但是我们取值是可以任意的。

2、申请与释放方式

  1. 栈:系统自动分配空间,生命周期在函数运行期间,运行结束便被系统回收
  2. 堆:程序员手动分配,如果不手动释放,所占用空间将一直存在

3、申请效率

  1. 栈:由系统自动分配,速度较快。但程序员是无法控制的。
  2. 堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

4、申请空间大小限制:

  1. 栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域,这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的
  2. 堆:堆的大小一般看内存的大小。

5、存放信息

  1. 栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
    当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
  2. 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排

3、假如一个单片机上电之后不运行?这是为什么?

  1. 检查晶振工作是否正常
  2. 检测EA脚是否拉低。单片机EA引脚表示存取外部程序代码之意,低电平动作,当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。EA引脚必须接低电平,因为其内部无程序存储器空间。

4、精度和分辨率有什么区别
像数字化的温度传感器,一般精度指的是传感器读回的数据与绝对温度的差值,而分辨率指的是传感器能感知的最小温度变化。

5、你来说一下中断的处理流程是什么样子的?

  1. 中断响应:设置程序断点,并将断点地址压入栈进行保护,接着将程序转到中断服务程序的入口地址。
  2. 中断处理:从中断服务程序的第一条指令开始执行直到返回指令为止。
  3. 中断返回:中断处理程序的最后一条指令是中断返回指令RETI,该指令的作用将断点地址从栈中弹出,程序继续从断点地址开始执行

6、中断的优点

  1. 实时性
  2. 充分利用系统资源,提高CPU效率

7、讲一下grep的作用

查找相应文件中符合条件的字符串

8、I2C的开始信号、I2C配置主机模式端口该怎么配置

  1. 开始信号: SCL为高电平期间,SDA由高电平向低电平进行跳边,产生开始信号。
  2. 主机模式端口的配置:
    1. 硬件模式:端口设置为复用模式,复用为I2C、开漏输出、既不上拉也不下拉。

      void I2C1_GPIO_Configuration(void)
      {
        GPIO_InitTypeDef  GPIO_InitStructure;
      
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //复用模式
          GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//必须设置为开漏输出,实现iic的线与逻辑
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_PuPd =   GPIO_PuPd_NOPULL; //不上拉也不下拉
          GPIO_Init(GPIOB, &GPIO_InitStructure);
          GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_I2C1); 
          GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_I2C1);
      }
      
      1. 软件模拟:设置普通输出模式,推挽输出、配置上拉电阻
      	void IIC_Init(void)
      	{			
      	  GPIO_InitTypeDef  GPIO_InitStructure;
      	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
      	  //GPIOB8,B9初始化设置
      	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
      	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
      	  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
      	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
      	  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
      	  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
      	  IIC_SCL=1;
      	  IIC_SDA=1;
      	}
      

9、讲一下extern的作用

  1. 声明外部变量

  2. 在C++文件中调用C方式编译的函数

    extern "C" {
      ... C++可以重定义,而C中没有重定义
    }
    

10、讲一下static的作用

  1. 函数内部的变量值保持不变
  2. 模块内、函数外的变量,模块内的任意函数都能使用,但模块外的函数无法调用
  3. 定义在模块内的函数,模块外无法调用。、

11、讲解下GPIO是什么,有几种模式

  1. GPIO就是通用的输入输出端口
  2. 有8中模式:4输入(上拉输入、下拉输入、浮空输入、模拟输入)、4输出(推挽输出、开漏输出、复用推挽输出、复用开漏输出)

12、进程通信的方法

  1. 管道
  2. FIFO
  3. 消息队列
  4. 信号量
  5. 共享内存

13、MQTT与HTTP的区别

  1. MQTT以数据为中心,传输量小、速度快
  2. HTTP以文本为中心,传输量大,速度较慢
  3. 两个都是基于TCP(传输层之上的),都是属于应用层的协议,MQTT协议一般采取明文传送,而HTTP可以采用HTTPS进行加密。

14、MQTT的消息类型有哪些

  1. 连接
  2. 发布
  3. 订阅
  4. 订阅确认
  5. 取消订阅

15、STM32-ADC配置

  1. 引脚配置
    • 使能引脚时钟与ADC时钟
    • 设置端口为模拟输入,不带上下拉电阻
  2. 设置ADC的通用控制寄存器CCR
    • 设置ADC的采样模式-独立模式
    • 设置ADC的分频系数
  3. 初始化ADC参数
    • 设置ADC的分辨率
    • 转换方式 - 关闭连续转换模式
    • 设置对齐方式 - 右对齐
  4. 开启AD转换器
	void Adc_Init(void)
	{
		GPIO_InitTypeDef GPIO_InitStructure;
		ADC_CommonInitTypeDef ADC_CommonInitStructure;
		ADC_InitTypeDef ADC_InitStructure;
		//①开启 ADC 和 GPIO 相关时钟和初始化 GPIO
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能 GPIOA 时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能 ADC1 时钟
		//先初始化 ADC1 通道 5 IO 口
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道 5
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
		GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
		RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1 复位
		RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束
		//②初始化通用配置
		ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
		ADC_CommonInitStructure.ADC_TwoSamplingDelay =
		ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟 5 个时钟
		ADC_CommonInitStructure.ADC_DMAAccessMode =
		ADC_DMAAccessMode_Disabled; //DMA 失能
		ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频 4 分频。
		//ADCCLK=PCLK2/4=84/4=21Mhz,ADC 时钟最好不要超过 36Mhz
		ADC_CommonInit(&ADC_CommonInitStructure);//初始化
		//③初始化 ADC1 相关参数
		ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12 位模式
		ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式
		ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
		ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
		//禁止触发检测,使用软件触发
		ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
		ADC_InitStructure.ADC_NbrOfConversion = 1;//1 个转换在规则序列中
		ADC_Init(ADC1, &ADC_InitStructure);//ADC 初始化
		//④开启 ADC 转换
		ADC_Cmd(ADC1, ENABLE);//开启 AD 转换器
		}
		//获得 ADC 值
		//ch:通道值 0~16: ch: @ref ADC_channels
		//返回值:转换结果
		u16 Get_Adc(u8 ch)
		{
		//设置指定 ADC 的规则组通道,一个序列,采样时间
		ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );
		ADC_SoftwareStartConv(ADC1); //使能指定的 ADC1 的软件转换启动功能
		while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
		return ADC_GetConversionValue(ADC1); //返回最近一次 ADC1 规则组的转换结果
		}
		//获取通道 ch 的转换值,取 times 次,然后平均
		//ch:通道编号 times:获取次数
		//返回值:通道 ch 的 times 次转换结果平均值
		u16 Get_Adc_Average(u8 ch,u8 times)
		{
		u32 temp_val=0; u8 t;
		for(t=0;t<times;t++)
		{
		temp_val+=Get_Adc(ch); delay_ms(5);
		}
		return temp_val/times;
	}
  • 4
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DJI嵌入面试是一个考察面试者在嵌入系统设计和开发方面的能力和经验的问。以下是对此目的一个可能回答: 在DJI嵌入面试中,我们需要展示自己在嵌入系统设计和开发方面的能力和经验。首先,嵌入系统是一种集成度很高的计算机系统,通常嵌入在特定的设备中,具有实时性和稳定性的要求。因此,对于DJI这样的无人机制造商而言,嵌入系统的设计非常重要。 在面试过程中,我们可能会被问到关于嵌入系统设计和开发的问。例如,如何设计一个满足实时性和稳定性要求的飞行控制系统?我们可以回答说,首先需要对传感器数据进行采集和处理,确保数据的准确性和实时性。然后,需要设计一个高效的控制算法,以响应不同的飞行指令,并保持飞行安全和稳定。此外,还需要考虑系统的可靠性和故障管理,以应对各种异常情况。 另一个可能的问是关于嵌入系统的软件开发。我们可以回答说,开发一个嵌入系统的软件需要熟悉不同的编程语言,例如C或C ++。同时,我们需要了解嵌入系统的硬件架构和接口,以便编写有效的驱动程序和应用程序。另外,了解嵌入操作系统(例如,FreeRTOS)和实时调度器的原理也是非常重要的。 总之,在DJI嵌入面试中,我们需要展示对嵌入系统设计和开发的理解和经验。不仅要熟悉硬件和软件的开发,还要考虑系统的实时性、稳定性和可靠性。这样才能胜任嵌入系统设计和开发的工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值