物联网面试准备

volatile的作用

volatile关键字用于告诉编译器,该变量可能会在程序的执行过程中被意外更改,因此编译器不应该对该变量进行优化或者缓存。

这样可以确保每次访问该变量时都会从内存中读取最新的值,而不是使用缓存中的旧值。

在多线程编程中,volatile关键字还可以用于确保不同线程之间对变量的可见性,即一个线程对变量的修改会立即对其他线程可见。

但需要注意的是,volatile并不能保证线程安全,因此在多线程环境下还需要使用其它机制来保证线程安全性。

const与define的区别

const是C++中引入的关键字,用于定义常量变量。const声明的常量在编译时确定,一旦赋值后就不能更改。

#define是C和C++中的预处理指令,用于定义宏常量。在编译前会对#define定义的宏进行简单的文本替换。

const是类型安全的,可以指定常量的数据类型,而define是简单的文本替换,没有类型检查。

const是在编译时处理,有作用域,可以避免一些错误,而define是在预处理阶段处理,只是简单的文本替换。

const可以定义常量变量,而#define定义的是宏常量。

const在C++中推荐使用,define在C中比较常见。

static的作用

局部静态变量:在函数内部定义的static变量在整个程序执行期间都存在,仅限制作用域,值在多次函数调用之间是同步的。

全局静态变量:全局范围内定义的static变量仅在其定义的文件中可见,有助于隐藏实现细节和避免命名冲突。

静态函数:使用static修饰的函数也仅在其定义的文件中可见,有助于封装函数逻辑。

空指针和野指针的区别

空指针是指被明确赋值为NULL的指针,它不指向任何有意义的内存地址。

当试图访问空指针所指向的内容时,程序会抛出异常,这有助于及早发现并处理潜在的错误,确保内存管理的安全性。

野指针是指向不可用内存地址的指针,通常由于未初始化指针或释放指针空间后指针未置为NULL产生。

使用野指针访问内存可能导致不可预测的连续后果,如程序崩溃、数据损坏,甚至被黑客利用来植入病毒。

访问野指针会发生什么情况

  1. 程序崩溃:由于野指针指向的内存地址可能被其它程序或系统回收,或者根本不存在,因此访问这些地址可能会导致程序崩溃。
  2. 数据损坏:如果野指针指向的内存区域恰好被其它变量或数组结构所使用,那么对该区域的访问可能会导致这些变量或数组结构的数据被意外修改,进而引发数据损坏或不一致。
  3. 安全漏洞:某些情况下,黑客可能利用野指针将恶意代码或病毒放入随机内存地址中。当程序通过野指针访问这些地址时,恶意代码可能会被激活,导致系统安全受到威胁。

访问空指针会发生什么情况

  1. 空指针异常:在多数编程语言中,尝试访问空指针所指向的内容会引发一个空指针异常。这是一种运行时错误,程序会因此中断执行,并可能输出错误信息。
  2. 程序崩溃:某些情况下,当空指针异常发生时,程序可能会直接崩溃,而不是给出任何错误信息。这通常发生在未对空指针异常进行适当处理的代码中。

单工/半双工/全双工

  • 单工通信:数据只能一个方向传输(广播)
  • 半双工通信:数据可以沿两个方向传输,但需要分时进行
  • 全双工通信:数据可同时进行双向传输

同步/异步

  • 同步:共用同一时钟信号
  • 异步:没有时钟信号,通过在数据信号中加入起始位和停止位等一些同步信号

SPI、IIC、UART的接口协议

什么是串口

串行通信接口:按位发送和接收的接口。

如:RS-232/422/485等。

RS-232接口(DB9)

RS-232电平与COMS/TTL电平

CMOS/TTL电平不能与RS-232电平直接交换信息

STM32串口与电脑USB通信

SPI、IIC、UART的接口协议

  • IIC是双向同步串行总线,只需两根线就能实现数据发送和接收。支持多个设备连接在同一条总线上,通过设备地址来区分不同的设备。
  • SPI是一种同步串行数据接口,主要用于微控制器与外围设备之间的通信。通常由一个主设备控制一个或多个从设备,通过片选信号来选择与主设备通信的从设备。
  • UART是一种异步串行通信协议,用于实现简单的数据交换。主要由发送和接收两条线组成,通信速度相对较慢,但实现简单。

IIC:理论上可以连接多个设备,具体数量取决于地址分配和总线驱动能力。但实际应用中,由于地址冲突和总线电容等问题,通常建议连接的设备数量不要过多。

SPI:设备数量取决于可用的片选数量。每增加一个从设备,就需要增加一条片选线,因此SPI设备数量相对有限。

C语言里未初始化的全局变量放在哪里

未初始化的全局变量,会被放在程序的数据段的BSS段中,在BSS段中,这些变量会被初始化为0或者空值(取决于变量的类型)。

已初始化的全局变量会存储在数据段的.data段中,在data段中,已初始化的全局变量会被赋予特定的初始值。

需要传一个大文件,要采用哪种协议?

传输大文件时,一种常用的协议是TFP文件传输协议。

FTP是我们日常中经常用来在网络上传输文件的协议,它特别支持大文件的传输,同时也有一定的可靠性和安全性。

如果对传输过程中的安全性有更高的要求,比如不希望文件在传输过程中被窃取或篡改,那么可以考虑使用SFTP或FTPS等加密协议。这些协议在FTP的基础上增加了数据加密的功能,确保文件在传输过程中得到更好的保护。

在选择传输协议时,可以根据实际需要来权衡,看是否需要加密功能,以及传输速度和稳定性等其他因素。每种协议都有其特点和适应场景,所以最好根据实际情况进行选择。

多线程情况下,第一个线程使用资源

另一个线程能不能继续使用,为什么?

这个取决于资源的共享方式和线程之间的同步机制。通过互斥锁可以确保在同一时刻只有一个线程可以访问共享资源,其它线程需要等待当前线程释放锁才能访问资源。

二分查找

二分法使用的前提是数组已经是有序序列,原理是折半查找,每次把表分成两半,因为已经排序,所以只需要和中间数比较就能确定在哪一半,然后不断分成两半,直到匹配,或者没有数字,表示查找失败。

相关推荐
P.H. Infinity3 分钟前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天7 分钟前
java的threadlocal为何内存泄漏
java
caridle18 分钟前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^24 分钟前
数据库连接池的创建
java·开发语言·数据库
vfbox339826 分钟前
C-DTL698电表 转 IEC61850 协议项目案例
物联网·iec61850·vfbox·协议转换工业网关·c-dtl698
苹果醋327 分钟前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花32 分钟前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端35 分钟前
第六章 7.0 LinkList
java·开发语言·网络
Wx-bishekaifayuan42 分钟前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源