嵌入式笔试面试刷题(day15)

news2024/12/27 18:33:17

文章目录

  • 前言
  • 一、Linux中的主设备号和次设备号
    • 1.查看方法
    • 2.主设备号和次设备号的作用
  • 二、软件IIC和硬件IIC的区别
  • 三、变量的声明和定义区别
  • 四、static在C和C++中的区别
  • 五、串口总线空闲时候的电平状态
  • 总结


前言

本篇文章继续讲解嵌入式笔试面试刷题,希望大家坚持跟着我的脚步一起加油冲击大厂offer。

一、Linux中的主设备号和次设备号

1.查看方法

查看主设备号和次设备号方法:
首先先进入/dev目录:

cd /dev

使用下面命令查看:

ls -l

在这里插入图片描述

2.主设备号和次设备号的作用

每个设备驱动程序都会被分配一个唯一的主设备号,并根据需要使用不同的次设备号。

主设备号用于标识设备驱动程序所属的设备类型或设备类别。它是一个整数值,通常由系统管理员或开发者分配和维护。一些常见的主设备号分配给不同类型的设备,例如磁盘设备、网络设备、串口设备等。通过主设备号,系统可以识别特定类型的设备,并将设备的请求路由到适当的驱动程序。

次设备号用于标识同一类型的多个设备中的具体实例或设备编号。它也是一个整数值,由设备驱动程序或操作系统内核进行分配和管理。通过次设备号,系统可以区分不同的设备实例,每个设备实例都可以有不同的属性和状态。

主设备号和次设备号的组合可以唯一地标识系统中的每个设备。设备文件(例如 /dev/sda)和设备节点(例如 /dev/ttyUSB0)通常使用主设备号和次设备号来命名和表示设备。

在设备驱动程序中,主设备号和次设备号通常用于设备注册、设备文件的创建和管理、设备访问权限的控制等方面。通过这些标识符,操作系统和应用程序可以与设备驱动程序进行交互,发送请求和接收数据。

总之,主设备号和次设备号是用于唯一标识设备驱动程序和设备实例的参数,有助于操作系统管理设备和进行设备驱动程序的通信和操作。

设备类别相同的驱动程序主设备号相同,次设备号不同:
在这里插入图片描述

二、软件IIC和硬件IIC的区别

软件I2C(也称为软件模拟I2C)和硬件I2C是两种不同的协议实现方式,用于在微控制器或嵌入式系统中实现I2C通信。它们在实现和性能方面有一些区别。

软件I2C是通过GPIO(通用输入输出)引脚模拟I2C总线的时序和信号传输。由于软件I2C需要使用GPIO引脚来模拟I2C总线的时钟和数据线,因此它需要一定的软件延迟和CPU计算来生成和检测相应的电平变化。软件I2C使用通用的GPIO接口进行数据传输,因此可以在任何具备GPIO和定时器功能的微控制器上实现。

硬件I2C则是使用专门的I2C外设来处理I2C通信。硬件I2C通常由硬件内部的特定电路实现,包括时钟生成器、收发器和状态机等。这些硬件模块通过硬件电路来处理I2C通信的细节,实现了更高的速度和更低的处理器负载。硬件I2C的实现通常需要特定的硬件引脚和专用的I2C外设。

下面是软件I2C和硬件I2C的一些区别:

1.实现复杂性:软件I2C的实现相对较为简单,只需通过GPIO和软件逻辑实现相应的时钟和数据线变化即可。硬件I2C则需要使用专用的I2C外设和相关硬件电路,需要更多的硬件支持和配置。

2.速度和性能:硬件I2C通常能够实现更高的通信速度,因为它利用硬件内部的电路和专门的I2C外设来处理信号传输。软件I2C由于需要软件延迟和处理器计算,因此通常速度较慢,并且在高速通信时容易受到处理器负载和中断延迟等因素的影响。

3.资源需求:软件I2C通常只需要使用一些GPIO引脚和软件计算资源,因此对硬件资源需求较低。硬件I2C需要特定的硬件引脚和外设,通常在芯片级别集成,因此会占用更多的硬件资源。

4.可移植性:由于软件I2C只依赖通用的GPIO接口和定时器功能,因此可以在各种不同的微控制器平台上实现。硬件I2C则需要特定的硬件支持,因此在不同的芯片和平台上的实现可能有所不同。

综上所述,软件I2C适用于一些简单的应用场景和对资源要求较低的情况,而硬件I2C则适用于需要高速通信和更可靠性的应用场景。选择哪种方式取决于具体的应用需求和设备平台的支持情况。

三、变量的声明和定义区别

在C语言中,变量的声明和定义是两个不同的概念,尽管它们经常在代码中一起使用。下面是它们的区别:

1.声明(Declaration):在程序中,声明是指向编译器提供有关变量的信息,包括变量的名称和类型。它向编译器说明了变量的存在,使得编译器在后续代码中能够正确地使用这个变量。声明通常出现在代码的顶部或函数的参数列表中,用来告诉编译器有关变量的信息。

示例:

extern int number; // 变量声明
void foo(int x);  // 函数参数声明

在变量声明中,使用关键字"extern"可以告诉编译器该变量是在其他地方定义的,并且在当前文件中仅作为引用使用。

2.定义(Definition):定义是指向编译器提供有关变量的完整信息,包括变量的名称、类型和存储空间分配。它除了告诉编译器有关变量的信息外,还为变量分配实际的内存空间。变量的定义只能在程序中出现一次。

示例:

int number; // 变量定义
void foo(int x) {
    int y; // 变量定义
    // ...
}

在变量定义中,为变量指定了类型和名称,并且为其分配了存储空间。

总结来说,声明是为了让编译器知道变量的存在,定义是在声明的基础上为变量分配存储空间。在实际编程中,通常会将变量的声明与定义结合在一起,这样可以在声明的同时为变量分配内存空间。例如:

int number; // 变量声明和定义,分配存储空间

需要注意的是,在函数参数列表中声明变量时,同时也进行了定义。因为在函数调用时,参数被复制给形式参数,形式参数在函数内部作为局部变量使用。所以,函数参数的声明就是定义。

void foo(int x); // 函数参数声明和定义

四、static在C和C++中的区别

在C和C++中,关键字static具有不同的用法和语义。

在C中:

1.全局静态变量:在函数外部定义的全局变量可以加上static修饰符来使其成为静态变量。静态全局变量的作用域仅限于定义它的源文件,其他文件无法直接访问该变量,即具有文件作用域。静态全局变量在程序的整个运行期间都存在,不会随着函数的调用而被创建和销毁。

2.局部静态变量:在函数内部定义的变量加上static修饰符即为局部静态变量。局部静态变量在函数的生命周期内保持其值不变,且仅在首次进入函数时进行初始化,之后不再初始化。

在C++中:

1.静态成员变量:在类中声明的静态变量成员属于整个类的,而不是类的每个对象的。静态成员变量在内存中只有一份拷贝,被所有类对象共享。它们需要在类外部进行定义和初始化。

2.静态成员函数:静态成员函数属于类本身,而不属于类的任何对象。它可以直接通过类名调用,无需创建对象实例。静态成员函数无法访问非静态成员变量,只能访问静态成员变量和其他静态成员函数。

3.需要注意的是,在C和C++中,静态变量或静态成员变量的初始化规则略有不同。在C中,可以使用等号赋值来初始化静态变量,如果没有显式初始化,则会被初始化为0或空值。而在C++中,对于静态成员变量,需要在类外部进行定义和初始化,例如int MyClass::staticVar = 0;。

综上所述,static在C和C++中具有不同的用法和语义,分别用于定义静态全局变量、局部静态变量、静态成员变量和静态成员函数。这些用法的具体含义和行为在不同的语言中可能有所不同。

五、串口总线空闲时候的电平状态

当串口总线处于空闲状态时,其电平状态取决于特定的串口协议和信号约定。通常情况下,常见的串口总线协议(如RS-232、RS-485、TTL UART)在空闲状态下都有特定的电平表示。以下是它们的一般描述:

1.RS-232:在RS-232协议中,空闲状态下的电平为负电平(逻辑高电平)。这意味着发送和接收线都保持在负电平,通常是在-3到-15伏之间。

2.RS-485:在RS-485协议中,空闲状态下的电平为逻辑高电平,也被称为"空闲线状态"(Idle Line State)。发送和接收线都维持在一个稳定的高电平(通常是+3到+15伏),表示总线空闲。

3.TTL UART(像Arduino等微控制器上的UART):TTL UART是一种常见的串口通信标准,其中电平通常由系统的供电电压决定。在空闲状态下,TTL UART的电平通常是逻辑高电平(供电电压)。

需要注意的是,虽然上述描述是常见的情况,但串口总线的电平状态可能因特定硬件设计和使用的协议而不同。因此,在具体的应用中应查阅硬件规格表、参考相关文档或协议标准以确定特定串口总线在空闲状态下的电平状态。

总结

本篇文章就讲解到这里。

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

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

相关文章

PyTorch深度学习实战(17)——多任务学习

PyTorch深度学习实战(17)——多任务学习 0. 前言1. 多任务学习1.1 多任务学习基本概念1.2 多任务学习优势 2. 模型与数据集分析2.1 模型分析2.2 数据集介绍 3. 实现年龄估计和性别分类小结系列链接 0. 前言 多任务学习( Multi-Task Learning, MTL )是一…

SpringCloud Alibaba 整合Sentinel的基本使用

文章目录 一、什么是Sentinel二、Sentinel 的主要特性1. 流量控制:2. 熔断降级:3. 实时监控:4. 规则配置:5. 集成方便: 三、Sentinel 分为哪几部分:1. 核心库(Java 客户端)2. 控制台&#xff08…

Matlab图像处理-区域描述

一旦一幅图像的目标区域被确定,我们往往用一套描述子来表示其特性。选择区域描述子的动机不单纯为了减少在区域中原始数据的数量,而且也应有利于区别带有不同特性的区域。因此,当目标区域有大小、旋转、平移等方面的变化时,针对这…

ThreeJS-3D教学一基础场景创建

Three.js 是一个开源的 JS 3D 图形库,用于创建和展示高性能、交互式的 3D 图形场景。它建立在 WebGL 技术之上,并提供了丰富的功能和工具,使开发者可以轻松地构建令人惊叹的 3D 可视化效果。 Three.js 提供了一套完整的工具和 API&#xff0…

【深度学习】实验13 使用Dropout抑制过拟合

文章目录 使用Dropout抑制过拟合1. 环境准备2. 导入数据集3. 对所有数据的预测3.1 数据集3.2 构建神经网络 3.3 训练模型3.4 分析模型 4. 对未见过数据的预测4.1 划分数据集4.2 构建神经网络4.3 训练模型4.4 分析模型 5. 使用Dropout抑制过拟合5.1 构建神经网络5.2 训练模型5.3…

基于Qt4的拉格朗日插值实现及使用

目录 1 拉格朗日插值算法 2 实现思路 3 子程序编写 1 框架搭建 2 加载节点值 3 加载插值点 4 位置查找 5 二点线性插值 3 子程序使用 1 拉格朗日插值算法 拉格朗日插值是一种常用的散点插值算法,是是以法国十八世纪数学家约瑟夫拉格朗日命名的一种多项式插值方法。是…

python爬虫——爬取豆瓣top250电影数据(适合初学者)

前言: 爬取豆瓣top250其实是初学者用于练习和熟悉爬虫技能知识的简单实战项目,通过这个项目,可以让小白对爬虫有一个初步认识,因此,如果你已经接触过爬虫有些时间了,可以跳过该项目,选择更有挑…

Linux Shell 实现一键部署podman

podman 介绍 使用 Podman 管理容器、Pod 和映像。从本地环境中无缝使用容器和 Kubernetes,Podman 提供与 Docker 非常相似的功能,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。 Podman 可以管理和运行…

JavaWeb后端开发登录操作 登录功能 通用模板/SpringBoot整合

登录功能的思路 前端会传入两个参数:用户名和密码 在用户表中查询用户名,并校对相应的密码(涉及查询操作) SQL语句 select * from emp where username jingyong and password 123456; 如果有则成功,没有则登录失败.不可能为多个,因为添加了unique唯一约束,最终只会有一条 …

如何将转换器应用于时序模型

一、说明 在机器学习的广阔环境中,变压器作为建筑奇迹屹立不倒,以其复杂的设计和捕获复杂关系的能力重塑了我们处理和理解大量数据的方式。 自 2017 年创建第一台变压器以来,变压器类型呈爆炸式增长,包括强大的生成 AI 模型&#…

Kubernetes部署dolphindcheduler-3.1.8问题记录

温故知新 ⁉️问题记录❓问题一:Unschedulable 0/3 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are available: 3 No preemption victims found for incoming pod..❗解决方式:创建PV供应&#x1f…

ARM Soc内部总线

由于soc架构,把常用外设(控制器)集成到芯片内部,所以需要一种总线协调ARMcore与这些内部外设的通信,于是有了APB and AHB以及AXi这种片上总线。 同时要注意与常说的PC时代总线区分开: CPU总线(…

刷题笔记24——完全二叉树的节点个数

有些事情是不能告诉别人的,有些事情是不必告诉别人的,有些事情是根本没有办法告诉别人的,而且有些事情是,即使告诉了别人,你也会马上后悔的。——罗曼罗兰 222. 完全二叉树的节点个数 java的幂运算要 (int) Math.pow(2,l1)-1计算满二叉树的节点数量公式:2 ^ height…

【面试题】—— Java多线程篇(17题)

文章目录 1.什么是多线程?2.线程和进程的区别?3.我们为什么要使用线程?线程的优缺点?4.创建线程的方法有哪些?5.线程的状态有哪些?6.线程的优先级?7.线程常用的方法以及其作用?8.使用…

穿越撒哈拉:中国跨境电商的非洲冒险之旅

非洲,这片古老而神秘的大陆,一直以来都是探险者和冒险家的梦想之地。然而,近年来,中国的跨境电商企业也开始将目光投向了这片充满机遇的土地,但他们的目标不再是黄金和珍宝,而是一个更为宝贵的财富&#xf…

创建线程的方式打开记事本

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 今天操作系统课老师讲到进程,提出了一个有趣的小实验:能否以系统调用的方式利用 Windows 创建进程的系统调用函数来打开一个软件。闲着蛋疼的我立马来了兴趣,姑且写一个玩…

跨平台编程开发工具Xojo 2023 Release mac中文版功能介绍

Xojo mac是一款跨平台的软件开发工具,它允许开发人员使用一种编程语言来创建应用程序,然后可以在多个操作系统上运行。Xojo 2023是Xojo开发工具的最新版本,它提供了许多功能和改进,以帮助开发人员更轻松地构建高质量的应用程序。 …

【洛谷】P2004 领地选择

原题链接:https://www.luogu.com.cn/problem/P2004 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 整体思路:二维前缀和 (模板在这https://blog.csdn.net/m0_62531913/article/details/132712831?spm1001.2014.30…

[安洵杯 2019]easy_web md5强碰撞 preg_match绕过

比较简单 url一看就存在一个cmd 和 base64 我们尝试给cmd传递参数 但是没有效果 所以我们就去看看 img里面是什么 直接放到瑞士军刀看看 知道了加密方法 我们去看看能不能返回 index.php代码 TmprMlpUWTBOalUzT0RKbE56QTJPRGN3 返回了 接下俩就是代码审计了 <?php erro…

Python ---使用Fake库向clickhouse造数据小案例

每次insert太麻烦了 先在clickhosue中建表 test_user表 CREATE TABLE dwh.test_user (name String,age Int32,address String,phone String,email String ) ENGINE MergeTree() ORDER BY name; 此时表中暂无数据 用Python脚本来造一些数据 from faker import Faker from c…