嵌入式面试题3

2023-05-16

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;
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式面试题3 的相关文章

随机推荐

  • python 手眼标定OpenCV手眼标定(calibrateHandeye())一

    以下代码来源 本篇博客通过该代码 xff0c 附上记录的公式与查找连接 xff0c 方面以后调用能弄懂各个参数的意思 本篇看完看第二篇代码踩坑部分python 手眼标定OpenCV手眼标定 xff08 calibrateHandeye xf
  • ROS+VNC+Docker(docker下的可视化ROS)镜像源分享

    两个都可用 xff0c 推荐第二个毕竟要新一些 xff0c 以下docker环境中安装vscode链接的方法 1 作者 ct2034 截至本博客写的时候 xff0c 最后更新于2020 xff08 亲测感觉不错 xff09 带有完整 ros
  • 使用docker下的硬件使用(一)之双目摄像头

    本篇博客又名 xff1a 物理机 xff08 宿主机win xff09 下虚拟机 xff08 ubuntu xff09 中的docker下硬件 xff08 双目相机 xff09 调用 一 环境介绍 如下图 xff1a 我在windows10
  • AI自主图像生成 之 stable-diffusion(Anaconda+pycharm)本地部署

    无需订阅专栏 AI自主图像生成 之 stable diffusion 运行效果展示 一 介绍与实验效果 文章末尾包含 1 我已打包到百度云的部署验证成功并包含模型权重的代码文件 可直接链接完成python环境配置的anaconda环境下使用
  • AI自主图像生成 之 stable-diffusion—运行效果展示

    stable diffusion用途 xff1a 输入文字描述 xff0c 输出对应图片 The chicken with the hair parted in the middle and the suspenders is playin
  • python画甘特图

    1 使用plotly 安装包下载 span class token keyword import span plotly span class token punctuation span express span class token
  • bat 打开exe文件,并显示进度条

    如下 C camera flow njl CAM exe是你的exe文件路径 180 就是 180 s xff0c 即三分钟显示完毕 chcp span class token number 65001 span span class to
  • 基于opencv的掩膜生成 python

    代码将遍历JPG dir文件夹中的所有jpg文件 xff0c 并对于每一个jpg文件 xff0c 读取同名的JSON文件 xff0c 然后根据JSON文件中记录的标注区域的坐标在JPG图像上绘制掩膜图像 最后 xff0c 将掩膜图像保存到O
  • 用 Python 解数独(Sudoku)

    芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独 数独是 9 横 9 竖共有 81 个格子 xff0c 同时又分为 9 个九宫格 规则很简单 xff1a 每个空格填入 1 9 任意一个数字 xff0c 需要保证每个横排和竖排以
  • alembic 如何使用?

    在之前的数据库操作中 xff0c 我们新增一个字段是不是每次都得删除数据库表 xff0c 然后再重新将新创建的数据库表映射到数据库中 这样操作是不是很蛋疼 xff1f 是吧 xff1f 于是sqlalchemy作者拜尔为了解决这一问题 xf
  • ROS中用opencv库实现物体中心点提取

    老师搞了个很简陋的双目摄像头 xff0c 只能输出两个摄像头的图像 xff0c 所以为了提取定位物体中心坐标 xff0c 还得算个深度距离 先对两个摄像头图像处理一下 xff0c 基于阈值分割 xff0c 然后提取个轮廓 xff0c 计算个
  • linux c语言高级编程-目录操作

    目录操作总共有以下几个函数 xff1a 1 创建目录 int mkdir const char pathname mode t mode 2 删除目录 int rmdir const char pathname 3 查看目录状态 int s
  • BeagleBone Black使用(一):狗板简介

    前言 BeagleBone 与 Arduino 和 Raspberry Pi xff08 树莓派 xff09 可以说是目前应用最广泛的三大嵌入式开源平台 而 BeagleBone 在一定程度上可视为融合了 Arduino 与树莓派的优点 x
  • 慧数汽车大数据分析:车市竞争将由打造爆款向构建“产品矩阵”转型

    在车企只要完成年销量三十万辆的目标时 xff0c 只需认认真真培育出一款爆款车就足够了 xff0c 如哈弗H6 完成年销量50万辆的目标时 xff0c 只需认认真真培育出一两款爆款车就足够了 xff0c 如哈弗H6 43 哈弗H2 但为什么
  • 4.10 Python tuple元组详解

    元组 xff08 tuple xff09 是 Python 中另一个重要的序列结构 xff0c 和列表类似 xff0c 元组也是由一系列按特定顺序排序的元素组成 元组和列表 xff08 list xff09 的不同之处在于 xff1a 列表
  • 使用ROS和RealSense直接获取点云

    点云获取 Realsense获取内参创建ROS工作环境创建ROS工作包package向package中添加cpp代码catkin make编译失败失败1 使用ROS订阅节点 xff08 rgb和depth xff09 ROS包安装升级Rea
  • 集成单点登录

    随着现在的系统越来越多 xff08 OA考勤 xff0c 学生宿舍管理等等 xff09 在使用中是不是还在为一次一次的登录而烦恼 xff1f 或者忘了密码而尴尬 xff0c 现在 xff0c 有一个好东西来解决这个问题了 那就是单点登录 单
  • PID算法入门与C语言代码实现

    PID算法的入门理解以及C代码实现 在结束了自控原理的学习后 xff0c 了解到PID算法是一种万能算法 xff0c 在课设中也是经常使用到的一种算法 xff0c 所以想具体的来进行以下总结与学习 xff0c 如果有错漏的地方 xff0c
  • 【Ubuntu18.04安装px4+mavros(解决mavros报错问题)】

    Ubuntu18 04安装px4 43 mavros xff08 解决mavros报错问题 xff09 安装ros melodic重新安装gazebo9 19安装mavros安装px4 我的电脑为联想R7000P2021款 xff0c 之前
  • 嵌入式面试题3

    1 讲一下STM32时钟系统 时钟系统类似于脉搏 xff0c 控制着CPU的命脉 xff0c STM32的时钟源又不像51的时钟源那么单一 xff0c 因为STM32的MCU较为复杂 xff0c 且外设较多 xff0c 并不是所有的外设都需