首页 > 其他分享 >理论概念-常见嵌入式岗位面试题

理论概念-常见嵌入式岗位面试题

时间:2023-09-26 22:16:20浏览次数:47  
标签:面试题 变量 岗位 嵌入式 STM32 关键字 volatile 内存 寄存器

一、问题一:
结合阅读ARMQ、STM32技术手册,深入思考STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置的一般步骤。回答:
1)嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器--->对应相关管脚)的操作有哪些相同与差别?

2)为什么51单片机的LED点灯编程要比STM32的简单?
二、问题二:
与PC平台上的一般程序不同,嵌入式C程序经常会看见register和volatile关键字,请解释这两个变量修饰符的作用,并用C代码示例进行说明。

三、问题解决:
3.1、问题一:
3.1.1、第一小问:

相同点:
1.都可以通过变量名或地址访问,进行读写操作。
⒉读取操作都需要将数据从内存/寄存器加载到CPU的寄存器或缓存中。
3.写操作都需要将CPU的数据写入内存/寄存器中。
4.都需要注意数据同步,例如通过volatile关键字。
5.都可以使用相同的数据类型来定义内存中的变量和表示寄存器中的数据。同时意味着可以使用相同的数据类型来处理它们。
差异点:
1.内存变量直接通过变量名访问,外部寄存器需要知道它的地址。
2.内存变量修改直接生效,寄存器需要根据时序要求才能生效。
3.内存变量可以直接读取/修改,寄存器可能需要设置控制位才能访问。
4.同一内存变量可以被多个任务随时访问,寄存器可能存在访问冲突或优先级问题。
5.内存变量的大小灵活,寄存器大小固定。
6.内存变量不需关心电平电压,寄存器需要匹配芯片的逻辑电平。
7.内存变量不需考虑存储保留的问题,寄存器的某些位可能有特殊使用限制。
总结:寄存器操作更复杂;需要参考芯片手册,注意访问时序、电平控制、优先级等因素;对内存中的变量进行修改操作和对外部设备的操作有一些相同的地方,但也存在一些差异。在编写嵌入式C程序时,需要根据具体的需求和硬件平台来选择合适的操作方式,并注意处理数据的有效性和正确性。

3.1.2、第二小问:
1.51单片机GPIO端口与外部管脚连接更直接,不需要复用设置,可以直接访问端口寄存器控制LED。STM32的GPIO需要先配置复用才能映射到管脚。
2.51单片机中文资料丰富,例程多,上手容易。STM32资料相对较少,学习门槛更高。3.51单片机系统结构简单,编程模型直观。STM32系统复杂,需要理解编程框架。
4.51单片机GPIO单一功能,只能设置输入输出,不需要另选功能。STM32的GPIO多功能可配置,需要选定要使用的功能5.51单片机中断响应快速,不需考虑响应时间和优先级问题。STM32需要注意中断优先级和抢占。
6.51单片机GPIO电压转换直接,不需要考虑电平匹配问题。STM32的GPIO需要注意输入输出电压匹配。7.51单片机可以直接对GPIO寄存器操作,STM32需要初始化配置GPIO才能使用。
综上所述:51单片机没计更简单,上手更容易。但STM32硬件功能更强大完善。51能比较简单完成的LED点灯,在STM32中就需要更复杂的配置。

3.2、问题二:
3.2.1、第一小问:
在C语言中,register是一个变量修饰符,它建议编译器将某个变量存储在处理器的寄存器中,而不是RAM中。这样做的目的是为了提高访问速度,因为寄存器的访问速度比RAM快得多。然而,这只是一个建议,编译器可以选择忽略它。此外,寄存器的数量有限,因此不能将所有变量都声明为register。在嵌入式C编程中,register关键字可能会更常见,因为在这些系统中,性能优化尤为重要。以下是一个使用register关键字的示例:

 

在这个例子中,我们将变量i声明为register变量。由于i在循环中频繁使用,所以将其存储在寄存器中可以提高程序的运行速度。但请注意,这只是一个建议,编译器可能会选择忽略它。如果你的程序没有运行得更快,那可能就是这个原因。总的来说,现代编译器通常能够自动确定哪些变量应该存储在寄存器中,因此在大多数情况下,你可能不需要显式地使用register关键字。但在某些特定的、对性能要求极高的情况下,显式使用register关键字可能会有所帮助。
3.2.2、第二小问:
在C语言中,volatile是一个变量修饰符,它告诉编译器该变量可能会在任何时候被意外地修改。这可能是由于操作系统、硬件或其他并发线程的操作。当一个变量被声明为volatile时,编译器将生成代码,确保对该变量的每次读取都将从其所在的内存地址中获取,每次写入都将直接写入其所在的内存地址。
在嵌入式C编程中,volatile关键字尤其重要,因为这些系统通常会有硬件寄存器或其他可以随时改变的外部因素。例如,如果你正在编写一个需要读取硬件寄存器状态的程序,那么你可能需要将该寄存器地址映射到一个volatile变量。以下是一个使用volatile关键字的示例:

在这个例子中,我们将变量i声明为volatile。如果没有volatile关键字,编译器可能会认为在循环中i的值不会改变,并优化掉对i的检查,导致无限循环。但由于我们使用了volatile关键字,编译器会正确地生成代码来检查i的值。

总的来说,当你认为一个变量可能会被程序之外的因素改变时((例如:硬件寄存器、操作系统或其他线程),就应该使用volatile关键字。
四、总结
通过本次实验与这两个问题的探讨与解决,我由此了解并学习到了关于register与volatile这两个关键字的知识点以及其在c程序和嵌入式发挥的作用。

标签:面试题,变量,岗位,嵌入式,STM32,关键字,volatile,内存,寄存器
From: https://www.cnblogs.com/jppp123/p/17731358.html

相关文章

  • 掌握嵌入式Linux编程3引导程序
    3引导程序引导程序是嵌入式Linux的第二个要素。它是启动系统和加载操作系统内核的部分。在这一章中,我们将研究引导程序的作用,特别是它如何使用一种叫做设备树的数据结构将控制权从自身传递给内核,设备树也被称为扁平化设备树或FDT(flatteneddevicetree)。我将介绍设备树的基本知......
  • Vue前端面试题
    1.Vue路由传递params参数使用对象写法的时候能不能和path一起使用?不能路由传参对象的写法:指定路由需要使用name指定。使用path会导致路由失效无法跳转。this.$router.push({name:"search",params:{keyword:this.keyword},query:{k:this.keyword.toUpperCase()}})2.如何指定params参......
  • 【面试题】Js数组去重都有哪些方法?
    1.indexOf定义:indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。如果没有找到匹配的字符串则返回-1。注意:iindexOf()方法区分大小写。语法:string.indexOf(searchvalue,start)//;searchvalue必需。searchvalue可选参数。返回值:Number//查找指定字符串第一次......
  • PSAM嵌入式驱动——概念
    0.前序刚好最近忙了几项目的部分驱动都与PSAM相关,且不同项目硬件设计原因,涉及软件纯模拟PSAM驱动和硬件USART支持ISO7816的硬件PSAM驱动,顺便边做边总结,纯个人理解,方便交流,其中许多内容也是从别人摘录而来便于理解。1.背景PSAM卡是一种安全模块,用于验证用户卡的合法性,同时保护终......
  • PSAM嵌入式驱动——原理
    前言本部分内容是前一篇《PSAM嵌入式驱动——概念》的后续篇,本节主要是PSAM做驱动开发要了解的一些基本原理,在此一一阐述,部分内容也是借鉴前辈基础上,加上实践中整理及理解,与项目实际密切相关。一、PSAM基本交易过程 一般含PSAM的交易终端交互过程如上图,对于嵌入式驱动而言,前......
  • 还不知道数据类岗位的相关技能和职责吗?涤生大数据告诉你(一)
    很多同学在求职中对数据类岗位傻傻分不清楚,投递简历的时候胡乱投递,本篇文章给大家讲讲数仓开发,etl开发,数据开发,数据治理工程师,BI工程师以及数据运维工程师这些数据类岗位的工作职责以及和数仓开发的区别。同时为了大家更加深入地了解各岗位的区别,也给大家讲解了一下这些岗位在日常......
  • 【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
    原文:https://blog.51cto.com/u_14202100/5087350​作者​:​万境绝尘 转载请著名出处 终于拿到板子了,嵌入式开发正式开启. 板子型号:三星S3C6410基于ARM11,指令集基于arm6指令集;为毛不是CortextA9的板子; ​烧写内容​:​BootLoader​,​LinuxKernel​......
  • HashMap常见面试题
    简介HashMap最早出现在JDK1.2中,底层基于散列算法实现。HashMap允许null键和null值,是非线程安全类,在多线程环境下可能会存在问题。1.8版本的HashMap数据结构:为什么有的是链表有的是红黑树?默认链表长度大于8时转为树结构Node是HhaspMap中的一个静态内部类://Node是单向链表,实现......
  • 嵌入式软件调试与验证2仿真
    2仿真环境中的嵌入式软件调试2.1固件调试方法概述目前的EDA环境提供了各种固件调试方法。通常可以使用以下方法之一:使用硬件的SystemC模型进行仿真这可以在不接触硬件的情况下尽早开始固件开发,并在假设模型准确的情况下测试代码的功能。主要局限是缺乏系统视图和(取决于模......
  • HashMap常见面试题
    简介HashMap最早出现在JDK1.2中,底层基于散列算法实现。HashMap允许null键和null值,是非线程安全类,在多线程环境下可能会存在问题。1.8版本的HashMap数据结构:为什么有的是链表有的是红黑树?默认链表长度大于8时转为树结构Node是HhaspMap中的一个静态内部类://Node......