嵌入式中常见的面试题分享

news2025/5/13 5:01:13

1.关键字static的作用是什么?为什么static变量只初始化一次?

1)修饰局部变量:使得变量变成静态变量,存储在静态区,存储在静态区的数据周期和程序相同,

在main函数开始前初始化,在退出程序时销毁(无论是局部静态还是全局静态)。

2)修饰全局变量:全局变量本身就是存储在静态区,因此static并不能改变其存储位置。但是,static

限制了其链接属性,被static修饰的全局变量只能被该包含该定义的文件访问(即改变了作用域)

3)修饰函数:是的该函数只能在包含该函数定义的的文件中被调用,对于静态函数,申明和定义需要放到同一个文件夹中。

4)修饰成员变量:使用static修饰类的数据成员使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象,所有的对象都只维持同一个实例。

因此,static成员必须在类外进行初始化(初始化格式:int base::var=10;),而不能在构造函数内进行初始化,不过也可以使用const修饰的static数据成员在类内初始化。

5)修饰成员函数:使用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针,因而只能访问类的static成员变量。

静态成员是可以独立访问的,也就是说,无需创建任何对象实例就可以访问。例如可以分装某些算法,比如数学函数,如sin,cos等,这些函数本就没必要属于某一个对象,所以从类上调用更好。

注意:不可以用const static修饰成员函数。

对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。

存放在静态区的变量的生命周期一般比较长,一般与整个源程序“同生死、共存亡”,所以它只需初始化一次。

2.关键字voliate作用和含义/使用场景?

1)volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。

2)如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

3)一般用处:

1)并行设备的硬件寄存器(如:状态寄存器)

存储器映射的硬件寄存器通常也要加 voliate,因为每次对它的读写都可能有不同意义。

2)中断服务程序中修改的供其它程序检测的变量,需要加volatile

当变量在触发某中断程序中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到某寄存器的读操作,而后每次只会从该寄存器中读取变量副本,使得中断程序的操作被短路。

3)多任务环境下各任务间共享的标志,应该加volatile

在本次线程内, 当读取一个变量时,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;

当内存变量或寄存器变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致 。

4)一个参数既可以是const还可以是volatile吗?

可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

5)volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化,但有可能会读脏数据。

当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

3.sizeof和strlen的区别,使用场景?

sizeof() 和 strlen() 的主要区别在于:

1)sizeof() 是一个运算符,而 strlen() 是一个函数。

2)sizeof() 计算的是变量或类型所占用的内存字节数,而 strlen() 计算的是字符串中字符的个数。

3)sizeof() 可以用于任何类型的数据,而 strlen() 只能用于以空字符 '\0' 结尾的字符串。

4)sizeof() 计算字符串的长度,包含末尾的 '\0',strlen() 计算字符串的长度,不包含字符串末尾的 '\0'。

4.两个float怎样比较相同,为什么这样比较?什么原因导致的?

1)float小数点前后加起来有效数字只有6位。当给定的float有效数在6位以内转换为字符不会丢失精度,当有效位数大于6位就会存在精度丢失。

2)double小数前后加起来的有效数字只有16位,当给定的double有效数在16位以内转换为字符串不会丢失精度,当有效位数大于16位就会存在精度丢失。

3)我们在判断浮点数相等时,推荐用范围来确定,若x在某一范围内,我们就认为相等,至于范围怎么定义,要看实际情况而已了,float,和double 各有不同。

比如要判断浮点数floatA和B是否相等,我们先令float x = A –B ;

并设constfloat EPSINON = 0.00001;

if ((x >= - EPSINON)&& (x <= EPSINON); //或者if(abs(x) <= EPSINON)

cout<<”A 与B相等<<endl;

else

cout<<”不相等”<<endl;

根据上面分析建议在系统开发过程中设计到字符转换建议采用double 类型,精度设置为%.8lf即可,在比较浮点数十建议EPSINON=0.00000001

5.stm32使用浮点会对中断效率产生什么影响?

1)答:在中断或某个线程中进行浮点数操作,会导致另一个 TCP 通讯线程数据出错。

TCP 协议栈中大量使用了 memcpy,而 memcpy 又使用了 FPU 的寄存器,极有可能在 TCP 处理数据的过程中,另一个中断来了,进行了浮点运算并修改了 FPU 的寄存器,以致 TCP 数据出错。

2)对于32单片机在中断中使用浮点运算会使内存开销太大,如果有FPU硬件加速运算可以缓解CPU软件运算的压力。

3)代码中关于浮点的计算数值,一定要在浮点数后面加个f。 比如10.1f,这是单精度浮点;而不要直接用10.1,这是双精度浮点。 因为双精度浮点计算耗时很长,差10倍左右

6.讲讲IIC协议?stm32上的IIC速度?

1)两线——串行数据(SDA) 和串行时钟(SCL)。

2)每个器件都有一个唯一的地址识别,而且都可以作为一个发送器或接收器

3)多主机会产生总线裁决问题。当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线

4)数据位的有效性规定:SDA 线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。

5)起始和停止条件:其中一种情况是在SCL 线是高电平时,SDA 线从高电平向低电平切换表示起始条件。当SCL 是高电平时,SDA 线由低电平向高电平切换表示停止条件。

6)起始信号和终止信号都是由主机发送的。在起始信号产生之后,总线就处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。

7)每当发送器传输完一个字节的数据之后,发送端会等待一定的时间,等接收方的应答信号。接收端通过拉低SDA数据线,给发送端发送一个应答信号,

以提醒发送端我这边已经接受完成,数据可以继续传输,接下来,发送端就可以继续发送数据了。

8)数据传送格式:主机发送给从机,每一个字节必须保证是8位,先传送最高位,每一个字节后面需要一个应答位,即一帧数据有9位。

9)软件模拟IIC时,从机不对主机寻址信号应答时,它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。

10)每次数据传送总是由主机产生的终止信号来结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

11)硬件和软件IIC的区别是:

硬件的IIC时序由IIC外设自己控制,不需要CPU去干预,CPU只需要把对应的数据写到寄存器即可。

软件IIC,的时序需要CPU自己控制,占用CPU的资源。

如果需要高速通信,建议选择硬件IIC;如果需要多路通信或者灵活的时序控制,建议选择软件IIC。

硬件IIC移植起来比较麻烦,软件IIC移植起来就很简单。

7.IIC从机地址是如何配置的?主机地址是如何配置的?

图片

1)从机地址的确定:第0位是读写位。(如对于24C02这块存储器,它若作为从机,那么它的地址中7~4位是固定的,更改不了,

第3~1位是可以更改的,每一位根据硬件的管教连接来确定,连接高电平那就是1,低电平就是0)

2)在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1566426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java:6 数组(3)

文章目录 14. 二维数组14.1 定义14.2 二维数组的使用14.3 练习 【老韩视频p175-】 14. 二维数组 14.1 定义 多维数组我们只介绍二维数组&#xff1a; 二维数组的应用场景&#xff1a;比如我们开发一个五子棋游戏&#xff0c;棋盘就是需要二维数组来表示。请用二维数组输出如下…

【漏洞复现】某科技X2Modbus网关多个漏洞

漏洞描述 最近某科技X2Modbus网关出了一个GetUser的信息泄露的漏洞,但是经过审计发现该系统80%以上的接口均是未授权的,没有添加相应的鉴权机制,以下列举多个未授权接口以及获取相关敏感信息的接口。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律…

[C++初阶]初识C++(一)—————命名空间和缺省函数

声明: 本篇文献内容选自百度文库、比特就业课 代码内容部分选自比特就业课 一、命名空间 1.什么是命名空间 在编程语言中&#xff0c;命名空间是一种特殊的作用域&#xff0c;它包含了处于该作用域中的所有标示符&#xff0c;而且其本身也是由标示符表示的。命名空间的使用目…

C++ //练习 11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。

C Primer&#xff08;第5版&#xff09; 练习 11.12 练习 11.12 编写程序&#xff0c;读入string和int的序列&#xff0c;将每个string和int存入一个pair中&#xff0c;pair保存在一个vector中。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#x…

【网站项目】课堂教学效果实时评价系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

C++的并发世界(五)——线程状态切换

0.线程状态 初始化&#xff1a;该线程正在被创建&#xff1b; 就绪&#xff1a;该线程在列表中就绪&#xff0c;等待CPU调度&#xff1b; 运行&#xff1a;该线程正在运行&#xff1b; 阻塞&#xff1a;该线程被阻塞挂机&#xff0c;Blocked状态包括&#xff1a;pend&#xff…

【复现】飞鱼星上网行为管理系统RCE漏洞_67

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 飞鱼星企业级智能上网行为管理系统是成都飞鱼星科技开发有限公司开发的一款上网行为管理路由器&#xff0c;专为中小企业、政府机…

C++重载和模板

重载与模板 函数模板可以被另一个模板或一个普通非模板函数重载。 与往常一样&#xff0c;名字相同的函数必须具有不同数量或类型的参数。 如果涉及函数模板&#xff0c;则函数匹配规则会在以下几方面受到影响&#xff1a; 对于一个调用&#xff0c;其候选函数包括所有模板…

数据恢复工具可以恢复所有丢失的文件吗

随着数字时代的快速发展&#xff0c;数据已经成为我们生活与工作中不可或缺的一部分。然而&#xff0c;数据丢失的风险也随之增大。无论是由于误删除、误格式化、病毒感染还是其他意外情况&#xff0c;数据丢失都可能带来不小的损失。在这种情况下&#xff0c;数据恢复工具应运…

揭开AI编程语言Mojo比Pyhon快6.8万倍的5个秘密!

最近&#xff08;2024年3月29日&#xff09;&#xff0c;号称比Python快6.8万倍的Mojo编程语言开源啦&#xff01;6.8万倍&#xff1f;你敢相信这个数字是真的吗&#xff1f;不过&#xff0c;就连Mojo官网都把这个结果贴了出来&#xff08;见下图&#xff09;&#xff0c;这就很…

Java快速入门系列-1(Java概述)

第一章&#xff1a;Java概述 1.1 Java的发展历程1.2 Java的特点与优势1.2.1 特点1.2.2 优势 1.3 Java生态系统介绍1.4 Java在当前技术领域的应用案例 1.1 Java的发展历程 Java语言由Sun Microsystems公司于1995年推出&#xff0c;由James Gosling领导的Green Team小组研发而成…

孙崧-回归祖国的数学天才谈国外学习研究感受

孙崧&#xff0c;这位37岁的美国加州大学伯克利分校数学系教授&#xff0c;今年正式回归祖国&#xff0c;担任浙江大学数学高等研究院杜建英讲席教授、博士生导师。在此&#xff0c;知识人网小编就经历过国外就读、从事博士后研究及任教的这位数学天才是怎么说的&#xff0c;或…

文心一言指令词宝典之旅行篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

02-JDK新特性-Stream流

Stream流 什么是Stream流 Stream流是Java 8中的一个新特性&#xff0c;它提供了一种处理集合和数组的方式。Stream流可以让我们以一种更加简洁、高效、可读性更强的方式来处理数据。 Stream流可以用于过滤、映射、排序、聚合等操作&#xff0c;它可以让我们避免使用循环和条件…

商务电子邮件: 在WorkPlace中高效且安全

高效和安全的沟通是任何组织成功的核心。在我们关于电子邮件类型的系列文章的第二期中&#xff0c;我们将重点关注商业电子邮件在促进无缝交互中的关键作用。当你身处重要的工作场环境时&#xff0c;本系列的每篇文章都提供了电子邮件的不同维度的视角。 “2024年&#xff0c;全…

互联网轻量级框架整合之Spring框架II

持久层框架 Hibernate 假设有个数据表&#xff0c;它有3个字段分别是id、rolename、note, 首先用IDEA构建一个maven项目Archetype选择org.apache.maven.archetypes:maven-archetype-quickstart即可&#xff0c;配置如下pom <project xmlns"http://maven.apache.org/…

解决Centos7无法连接网络和访问网页连接不上问题

一、网络无法连接问题 网络无法连接的问题我查到了一个很良心的操作&#xff0c;不用重装&#xff0c;因为可能是你虚拟机设置上的问题。我先写我的解决方案&#xff0c;再附上其他几种解决方案。 问题一&#xff1a; 虚拟机的问题****加粗样式 解决&#xff1a; &#xff08;…

自动驾驶传感器:带你搞懂卫星导航GPS-RTK原理

自动驾驶传感器&#xff1a;带你搞懂卫星导航GPS-RTK原理 附赠自动驾驶学习资料和量产经验&#xff1a;链接 0. 前言 自动驾驶的感知层里面&#xff0c;前面Lidar&#xff0c;Radar&#xff0c;Camera的介绍之前已写完。还差GNSS-RTK和IMU模块就补齐了主要的自动驾驶感知层的…

Kubernetes Pod的网络暴露

这里先介绍下Pod的网络暴露&#xff0c;后面复习到service暴露再作更新 一、hostNetwork使用宿主机的网络 1、编写pod-hostnetwork.yaml 配置文件中pod的spec.hostNetwork: true 的配置可实现 apiVersion: v1 kind: Pod metadata:name: pod-hostnetwork spec:hostNetwork: …