工程师笔记|常见的嵌入式软件工程师面试题

2023-05-16

Q:什么是ISR?

A:ISR 是指中断服务程序。 这些是存储在特定内存地址的函数,当发生某种类型的中断时会调用这些函数。 Cortex-M 处理器系列具有管理中断执行的 NVIC


Q:我们可以给ISP传递参数或从ISR返回一个值吗?为什么?

A:ISR 不返回任何内容并且不允许传递任何参数。

当硬件或软件中断发生时会调用 ISR,它不会被任何代码调用,所以这就是没有参数传递到 ISR 的原因。因为它不会被任何代码调用,所以它不会有返回值。


Q:什么是 volatile 关键字?

A:volatile 关键字是一个类型限定符,可防止对象进行编译器优化。根据 C 标准,具有 volatile 限定类型的对象可能会以实现未知的方式进行修改或具有其他未知的副作用。您也可以说 volatile 限定对象的值可以随时更改,而无需代码采取任何操作。如果对象由 volatile 限定符限定,则每次程序访问该对象时,编译器都会从内存中重新加载该值,这意味着它可以防止将变量缓存到寄存器中。从内存中读取值是检查值不可预测变化的唯一方法。


Q:标准C语言和嵌入式C语言有什么区别?

A:C语言:是一种通用编程语言,广泛用于设计任何类型的基于桌面的应用程序。 它是一种用于开发操作系统的系统编程语言。 C 语言的主要特点包括对内存的低级访问、一组简单的关键字和干净的风格,这些特点使 C 语言适用于操作系统或编译器开发等系统编程。 本质上它采用原生平台开发方案,即它开发的应用程序是平台相关的,只能在单一平台上使用。

嵌入式 C:是标准C的扩展,而不能说是标准C的一部分。嵌入式C语言用于开发基于微控制器的应用程序。 嵌入式C语言对标准C的扩展是I/O硬件寻址、定点算术运算、访问地址空间等。


Q:C 中的 const 和 volatile 限定符有什么区别?

A:const 关键字是编译器强制执行的,它表示程序无法更改对象的值,这意味着它使对象成为不可修改的类型。 让我们看一个例子,

const int a = 0;

如果我们尝试修改“a”的值,我们将得到编译器错误,因为“a”用 const 关键字限定,防止更改“a”(整数变量)的值。

volatile 会阻止任何编译器优化,并表示对象的值可以被程序控制之外的东西更改,因此编译器不会对对象做出任何假设。 看个例子,

volatile int a;

当编译器看到上面的声明时,它会避免对“a”做出任何假设,并在每次迭代中从分配给“a”的地址读取值。


Q:C中的变量可以既是const又是volatile吗?

A:是的,可以同时使用 const 和 volatile。

将 volatile 和 const 关键字一起使用的一个重要用途是在访问 GPIO 寄存器时。在 GPIO被配置为输入的情况下,读取到的值将取决于外部因素(如开关或其他设备的输出信号)的改变。在这种情况下, volatile 发挥着重要作用,并确保编译器始终从 GPIO 地址读取值并避免做出任何优化。

使用 volatile 关键字后,无论何时访问端口,您都会获得正确的值,但仍然存在另一个问题,因为指针不是 const 类型,当您的程序更改了指针的指向地址时,所获取的数值就是错误的,这样我们就必须创建一个带有 volatile 关键字的常量指针。

定义的用法为:

int volatile * const PortRegister;

理解:

图片


Q:常用的使用volatile的场合?

A:1、访问内存映射外设寄存器或硬件状态寄存器。

#define COM_STATUS_BIT  0x00000006

uint32_t const volatile * const pStatusReg = (uint32_t*)0x00020000;

unit32_t GetRecvData()
{
    unit32_t RecvData;
    
    //Code to receive data
    while (((*pStatusReg)  & COM_STATUS_BIT) == 0)
    {
        // Wait until flag does not set
        //Received data in RecvData

    }
    return RecvData;
}

2、在多个线程之间共享全局变量或缓冲区
3、在中断例程或信号处理程序中访问全局变量

volatile int giFlag = 0;

ISR(void)
{
    giFlag = 1;
}

int main(void)
{

    while (!giFlag)
    {
        //do some work
    }

    return 0;
}

Q:什么是中断延迟?

A:中断延迟是处理器响应中断请求所用的时钟周期数。 这个时钟周期数是在中断请求的发生和中断处理程序的第一条指令之间计数。

Cortex-M 处理器的中断延迟非常低。 在下表中列出了 Cortex-M 处理器的中断延迟。

图片


Q:如何减少中断延迟?

A:中断延迟取决于许多因素,我在下面的陈述中提到了一些因素。

平台和中断控制器。

CPU 时钟速度。

定时器频率

缓存配置。

应用程序。

因此,通过正确选择平台和处理器,我们可以轻松减少中断延迟。 我们还可以通过缩短 ISR 并避免在 ISR 内调用函数来减少中断延迟。


Q:在中断服务程序(ISR) 中调用printf() 是否安全?

A:不建议在接ISR中调用printf()


Q:可以在 ISR 中放置断点吗?

A:可以设置断点,但是不建议这么做。


Q:在ISR中可以调用任何函数吗?

A:是的,但是不建议在中断中直接调用函数;建议在中断中先设置相关标志或执行数据准备,在主循环中进行数据处理。


Q:什么是中断嵌套?

A:在嵌套中断系统中,即使正在执行中断服务函数,也可以随时随地进行中断。 但是,只有最高优先级的 ISR 会立即执行。 优先级次高的 ISR 将在最高优先级的 ISR 完成后执行。


嵌套中断系统的规则是:

所有中断都必须被设定中断优先级。

初始化后,任何中断都可以随时随地发生。

如果低优先级 ISR 被高优先级中断中断,则执行高优先级 ISR。

如果高优先级 ISR 被低优先级中断中断,则高优先级 ISR 继续执行。

必须按时间顺序执行相同优先级的 ISR


Q:ARM Cortex 中的NVIC是什么?

A:Cortex-M 处理器系列中的嵌套向量中断控制器 (NVIC) 是具有极其灵活的中断优先级管理的中断控制器的一个示例。 它支持可编程优先级、自动嵌套中断支持以及对多个中断屏蔽的支持,同时仍然非常易于程序员使用。

NVIC 的 Cortex-M3 和 Cortex-M4 处理器支持多达 240 个中断输入,具有 8 个多达 256 个可编程优先级。

图片


Q:可以更改 Cortex-M 处理器系列的中断优先级吗?

A:可以。


Q:什么是启动代码,在进入main函数前芯片都做了什么工作?

A:芯片上电后,进入 main 函数之前调用的代码是启动代码,一般是用汇编语言编写的一小段代码。
启动代码至少包括以下部分

堆栈区的声明

堆区的声明

矢量表

重置处理程序代码

其他异常处理程序代码


Q:如何访问内存的固定地址?

A:

//Memory address, you want to access
#define RW_FLAG 0x1FFF7800

//Pointer to access the Memory address
volatile uint32_t *flagAddress = NULL;

//variable to stored the read value
uint32_t readData = 0;

//Assign addres to the pointer
flagAddress = (volatile uint32_t *)RW_FLAG;

//Read value from memory
* flagAddress = 12; // Write

//Write value to the memory
readData = * flagAddress;

Q:什么是堆栈溢出?

A:如果您的程序尝试访问超出可用堆栈内存的限制,则会发生堆栈溢出。换句话说,如果调用堆栈指针超出堆栈边界,则可以说发生堆栈溢出。
如果发生堆栈溢出,程序可能会崩溃,或者可以说是堆栈溢出导致的分段错误


Q:I2C和SPI的区别是什么?

A:在嵌入式系统中,I2C和SPI都扮演着重要的角色。这两种通信协议都是同步通信的例子,但仍然有一些重要的区别。I2C 和 SPI 通信协议之间的重要区别。

I2C 支持半双工,而 SPI 是全双工通信。

I2C 只需要两线进行通信,而 SPI 需要三线或四线进行通信(取决于要求)。

与 SPI 通信相比,I2C 速度较慢。

I2C 比 SPI 消耗更多功率。

I2C 比 SPI 更不易受噪声影响。

与 SPI 通信协议相比,I2C 的实现成本更低。

I2C 工作在线路和逻辑上,它有一个上拉电阻,而在 SPI 的情况下不需要上拉电阻。

在 I2C 通信中,我们在每个字节后获得确认位,SPI 通信协议不需要。

I2C 确保从设备接收发送的数据,而 SPI 不验证数据是否正确接收。

I2C 支持多主机通信,而 SPI 不支持多主机通信。

I2C 和 SPI 之间的一大区别在于,I2C 支持同一总线上的多个设备,而无需任何额外的选择线(基于设备地址工作),而 SPI
需要额外的信号(从选择线)线来管理同一总线上的多个设备。

I2C 支持仲裁,而 SPI 不支持仲裁。

I2C 支持时钟延长,而 SPI 不支持时钟延长。

I2C 可以被一个未能释放通信总线的设备锁定。

由于起始位和停止位,I2C 有一些额外的开销。

I2C 更适合长距离,而 SPI 更适合短距离。


Q:RS232和RS485有什么区别?

A:RS232 和 RS485 之间的一些重要区别:

图片

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

工程师笔记|常见的嵌入式软件工程师面试题 的相关文章

  • FreeRTOS源码解析——第三章 内存管理

    FreeRTOS源码解析 第一章 FreeRTOS 整体架构 第二章 FreeRTOS 编程规范 第三章 FreeRTOS 内存管理 第四章 FreeRTOS 任务管理 第五章 FreeRTOS 消息队列 第六章 FreeRTOS 软件定时
  • sonic编译过程

    文章目录 1 0虚拟机选择2 0虚拟机安装3 0 系统配置4 0 安装docker5 0 安装sonic 1 0虚拟机选择 原则上所有的系统都可以编译sonic xff0c 此处我们选择centos 7 7 xff0c 虚拟机的内存空间建议
  • Sonic测试架构介绍

    Sonic项目简介 Sonic Software for Open Networking in the CloudSonic是基于Linux的开源网络操作系统 xff0c 可以跑在多个不同芯片厂商交换机上Sonic在2016年OCP峰会上
  • Sonic_cli常用命令

    用户名 xff1a admin 密码 xff1a YourPaSsWoRd 一 change password admin 64 sonic passwd Changing password for admin current UNIX p
  • SONIC config_db.json文件的前生今世

    config db json的使用 系统启动时从config db json中读取数据并写入CONFIG DB数据库 xff0c 前提是config db json存在 xff1b 保存当前系统的一些配置信息 xff0c 通过config
  • SONiC架构DOCKER组件交互分析

    BGP组件交互分析 内核中的bgp socket收到BGP更新报文 xff0c 然后被上送到bgpd进程bgpd处理该报文 xff0c 并通知zebra进程新增前缀和关联下一跳zebra确定该目的可达后 xff0c 生成一个路由网络链接信息
  • sonic处理netlink事件

    sonic处理netlink事件 sonic在处理路由 xff0c 接口up down 接口地址变化 xff0c team等事件上极大的依赖内核 sonic通过监听rtnl事件来响应linux事件 从而感知相关信息变化 libnl soni
  • sonic配置team与实现机制

    sonic实现team代码框架图 xff1a sonic修改lag模式配置步骤 1 修改文件teamd j2 docker exec it teamd bash cd usr share sonic templates vim teamd
  • asyncComputed 异步计算属性

    asyncComputed 异步计算属性 我们项目中最近使用了异步计算属性 xff0c 个人感觉很好用 xff0c 特此推荐给大家 一 案例 假设这样一个场景 xff1a 一个列表数据 data 是通过接口返回 xff0c 请求参数中有一个
  • sonic管理口信息处理流程

    sonic管理口信息处理流程 管理接口信息配置文件格式 管理信息使用MGMT INTERFACE 表进行配置 对象的key由管理接口名字和IP前缀使用 连接而成 属性 gwaddr用于执行默认路由指向管理口 xff0c 其值为默认网关 属性
  • SONIC VLAN配置流程

    SONIC VLAN配置流程 sonic vlan配置通过订阅config db的键空间事件完成vlan配置信息从config db到内核和硬件 config db json格式如下 xff1a 34 VLAN 34 34 Vlan1000
  • sonic容器构建

    sonic中大量的组件运行在docker容器中 xff0c 用于隔离彼此的运行环境 xff0c 从而解决相互之间的互斥问题 下面我们分析一下sonic中各个容器的构建过程 Dockerfile文件的生成过程 sonic中的容器Dockerf
  • ARM Cortex-M底层技术(九)KEIL MDK 分散加载示例1-更改程序运行基址

    KEIL MDK 分散加载示例1 更改程序运行基址 小编我一向主张在实战中学习 xff0c 不主张直接去去学习规则 amp 定义 xff0c 太枯燥 xff0c 在实际应用中去摸索 xff0c 才会真正理解具体的技术细节 xff0c 下面我
  • 如何修改已提交commit信息

    如何修改已提交commit信息 1 修改commit信息 1 1 修改最后一次提交信息 通过git log查看提交历史信息 xff1a 输入命令 xff1a span class token function git span commit
  • linux 安装mysql 以及常见错误总结

    安装的方法菜鸟教程上有 xff1a 入口 mysqld initialize 命令是出现如下错误Fatal error Please read 34 Security 34 section of the manual to find out
  • elementui下拉框多选报[Vue warn]: <transition-group> children must be keyed: <ElTag>

    elementui下拉框多选 xff0c 选值报错 选中一个值后所有的值都会被选中 经检查 xff0c 是由于我的下拉框的value值为一个对象而非单个值 值为对象时需要填入value key span class token operat
  • Hadoop_1 入门WordCount

    记录踩得坑以及部署环境流程 搭建的是伪分布Hadoop 首先环境需要安装zookeeper 这个好装 xff0c 不多说其次比较复杂的是安装openssh 我的Linux系统是centos 7 mini版本 安装openssh之前的准备工作
  • PX4无人机控制

    PX4无人机控制 向话题 mavros setpoint raw local发布无人机目标位置 43 偏航 xff0c 或者目标速度 43 偏航 发布目标位置 43 偏航 xff1a mission span class token pun
  • npm install 报错:gyp verb `which` failed Error: not found: python

    今天新启动一个项目 xff0c 在 npm install 安装依赖项时出现报错 npm install span class token operator gt span husky 64 span class token number
  • 24_ZYNQ7020开发板_SPI与Qflash芯片读写

    内核中使用spi master表示一个SPI主机控制器 一 SPI控制器驱动 1 xff09 spi master申请与释放 SPI申请 span class token keyword struct span spi master spa

随机推荐

  • python3的input函数实现回车换行,而不是结束输入

    span class token comment 实现回车换行 xff0c 而不是结束 span endstr span class token operator 61 span span class token string 34 34
  • rviz-Ros Wiki官网教程学习笔记(1)-用户指南

    0 rviz介绍 rviz是ROS自带的图形化工具 xff0c 可以很方便的让用户通过图形界面开发调试ROS 参考官网 rviz UserGuide 1 安装 根据自己的版本号 xff0c 在下面选择对应的命令执行 以ROS melodic
  • 轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议

    概述说明 CAS Server默认搭建出来 xff0c 客户端程序只能按照CAS自身的协议接入 CAS的强大在于 xff0c 有官方的插件 xff0c 可以支持其他的协议 本章节就让CAS Server怎么增加OAuth2 0的登录协议 安
  • 一起DIY四轴飞行器(二)初识飞控大脑

    系统 xff1a Windows 硬件 xff1a xff08 1 xff09 STM32F103C8T6最小系统板 某宝上搜索 STM32F103最小系统 xff0c 如上图所示这样的 xff08 2 xff09 ST LINK v2下载
  • STM32CubeMX基于HAL库点亮LED灯

    开发环境 xff1a Windows 软件 xff1a 1 STM32CubeMX 6 3 0 2 MDK 5 14 一 cubeMX的基本配置 1 选择MCU 2 配置时钟 查看电路图 xff0c 8MHz的高速外部晶振接到 OSCIN
  • 一起DIY四轴飞行器(三)添加实时操作系统--freeRTOS

    开发环境 xff1a Windows 软件 xff1a 1 STM32CubeMX 6 3 0 2 MDK 5 14 一 初识freeRTOS系统 1 什么是FreeRTOS xff1f Free 即免费的 xff0c RTOS 全称是 R
  • ESP8266 初次使用

    一 工具 1 ESP8266 01S 淘宝上搜索ESP8266 01S 引脚说明 xff1a 2 USB转串口 给设备供电3 3V xff08 官方说不要用USB转串口的3 3V xff0c 需要单独供电 xff09 xff0c USB转串
  • ubuntu安装boost

    ubuntu安装boost 系统 Ubuntu 18 04 boost中 xff0c 用到了别的函数库 xff0c 所以为了使用boost中相应的功能 xff0c 需要先安装系统中可能缺失的库 1 卸载已经安装的boost 删除 usr l
  • 简单的状态机图

    一 什么是状态机 xff1f 做产品的时候 xff0c 我们总能遇到一些比较复杂的逻辑问题 比如状态的转换 xff0c 字段状态的确认 xff0c 权限的控制 xff0c 状态的对应 而普通的流程图 xff0c 或时序图 xff0c 更侧重
  • js-对象转基本类型

    起因是收到朋友发的一道题 xff0c 如下 xff1a span class token comment 请在问号处填写你的答案 使下方等式成立 span span class token keyword let span a span c
  • 局域网内wakeonlan远程唤醒其它计算机

    背景 xff1a 需要管理多台计算机 xff0c 所有计算机在一个局域网内 xff0c 并且有的安装了Windows系统 xff0c 有的安装了Linux系统 我们想远程关闭和启动所有计算机 关闭计算机直接通过网络发生操作系统关机命令即可实
  • D3D中的三种Buffer

    在D3D中 针对视窗有三种Buffer 它们分别是 Color Buffer Depth Buffer和Stencil Buffer Color Buffer在D3D中又称为Render Target 意思是最后着色的目标Buffer 就是
  • 创建镜像(更新与构建镜像)

    创建镜像 有时从Docker镜像仓库中下载的镜像不能满足我们的要求 xff0c 此时可以基于这个镜像 xff08 基础镜像 xff09 封装一个自 己的镜像 两种方式 xff1a 更新镜像 xff1a 使用docker commit命令构建
  • (十)CMake链接已有的动态库

    使用一个已经存在的动态库 xff0c 需要用到CMake中两个命令 xff0c 分别是 xff1a link directoriestarget link libraries 下面先介绍以下两个命令的格式及其含义 xff0c 最后是一个使用
  • ROS入门21讲笔记(四)自定义话题消息类型和使用

    除了ROS内置消息外 xff0c 我们还能自定义消息 这一次我们不再与海龟较劲 xff0c 而是自定义一个订阅消息类型 xff0c 让订阅者和发布者通过这个结构进行数据通信 一 如何自定义话题消息 xff1f 话题消息是以 msg结尾的文件
  • ROS入门21讲笔记(七)自定义消息消息类型和使用

    这一节主要是学习如何自定义一个服务类型并使用它 一 如何自定义服务消息 xff1f 服务数据是以 srv结尾的文件 xff0c 是一个用于描述ROS服务信息简单文本文件 xff0c 用于生成不同语言消息的源代码 srv文件存放在packag
  • ROS入门21讲笔记(十二)常用可视化工具

    一 QT类可视化工具 1 1 rqt console rqt console 为显示和过滤ROS信息提供了一个GUI插件 1 2 rqt plot rqt plot使用不同的绘图后端提供数值可视化功能 1 3 rqt Image view
  • (二)CMake 使用头文件

    一 include directories 该命令用于增加一个编译头文件 其基本语法是 xff1a include directories span class token punctuation span span class token
  • cargo 宏展开遇到的问题

    最近学习rust xff0c 看到宏展开命令 span class token comment 单独文件 span rustc Z unstable options pretty span class token operator 61 s
  • 工程师笔记|常见的嵌入式软件工程师面试题

    Q xff1a 什么是ISR xff1f A xff1a ISR 是指中断服务程序 这些是存储在特定内存地址的函数 xff0c 当发生某种类型的中断时会调用这些函数 Cortex M 处理器系列具有管理中断执行的 NVIC Q xff1a