UART,IIC,SPI总线(通信协议)

嵌 入 式 软 件 笔 试 题

要求:闭卷考不能翻书、不能开电脑);作答时间50分钟共10道题目。

  1. volatile的作用有哪些

volatile: 防止编译器对代码进行优化,直接从内存中取最新的值 应用场景: 1、多线程使用同一资源时 2、单片机开发中

volatile 的作用:

1. 核心功能:告知编译器变量的值可能被当前代码块外的因素(如中断服务程序、硬件寄存器、其他线程)异步修改,禁止编译器对该变量进行 “将内存值缓存到寄存器” 的优化,确保每次访问都直接读取内存最新值。

应用场景:

1. 多线程 / 多任务环境中,共享变量(如线程间标志位);

2. 嵌入式硬件寄存器访问(如单片机的 GPIO 数据寄存器、定时器计数寄存器);

3. 中断服务程序(ISR)与主程序共享的全局变量。

  1. 关键字const 和static有什么含意

Const :“只读属性”,限制变量 / 指针 / 参数的值不可被修改,编译时会检查写操作并报错,

Static:静态函数,可以延长生命周期和限定作用域

1. const 关键字含义
用于定义 “只读属性”,限制变量 / 指针 / 参数的值不可被修改,编译时会检查写操作并报错,常见场景:
- 修饰变量:const int a = 10;(a 的值不可修改);
- 修饰指针:
const int* p(指针指向的不可改);
int* const p(指针本身地址不可改);
- 修饰函数参数:void func(const int x)(函数内不可修改 x);
- 修饰函数返回值:const int func()(返回值不可被赋值修改)。

2. static 关键字含义
用于 “延长生命周期” 和 “限定作用域”,分三类场景:
- 局部静态变量:void func(){ static int a = 0; a++; }(生命周期延长至程序结束,作用域仅在函数内,初始化仅 1 次);
- 全局静态变量:static int g_a = 10;(作用域限定在当前.c 文件,避免外部文件通过extern调用);
- 静态函数:static void func(){}(作用域限定在当前.c 文件,防止与外部文件函数重名冲突)。

  1. 用变量a给出下面的定义
    1) 一个整型数         int a
    2)一个指向整型数的指针  int *a
    3)一个指向指针的的指针,它指向的指针是指向一个整型数 int **a;
  2. 下面的代码输出是什么,为什么?(printf为打印函数)

void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? printf("> 6") : printf("<= 6");
}

输出是>6,因为不同无符号 / 有符号整型运算时,会触发 “隐式类型转换”—— 将int(有符号)转换为unsigned int(无符号):

C 语言中,不同无符号 / 有符号整型运算时,会触发 “隐式类型转换”—— 将int(有符号)转换为unsigned int(无符号):
1. 变量值:a = 6(unsigned int,二进制为000...000110),b = -20(int,32 位补码为111...1101100);
2. 转换后:b作为 unsigned int 时,值为2^32 - 20 = 4294967276
3. 计算:a + b = 6 + 4294967276 = 4294967282(远大于 6),故执行printf("> 6")

  1. 中断是嵌入式系统中重要的组成部分,这导致了许多编译开发商提供一种扩展:让标准C支持中断,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序,请指出以下这段代码错误的地方。
    __interrupt double compute_area(double radius)
    {
    double area = PI * radius *radius;
    printf("nArea = %f", area);
    return area;
    }    该中断服务子程序(ISR)存在 5 处核心错误
    1. 返回值错误:ISR 是异步触发的 “被动执行函数”,没有调用者接收返回值,必须定义为void,不能返回double
    2. 参数错误:中断触发时无法传递参数(无调用上下文),ISR 不能带参数(如double radius);
    3. 调用非可重入函数printf是标准库函数,内部包含浮点运算、全局缓冲区操作,且可能依赖中断使能,属于 “非可重入函数”;ISR 要求 “快进快出”,禁止调用非可重入、耗时函数;
    4. 浮点运算风险:嵌入式系统中,double浮点运算需硬件 FPU 支持,且运算耗时较长,不符合 ISR “短延迟” 要求;
    5. PI 未定义:若未通过#define PI 3.14159宏定义 PI,编译会报 “未声明标识符” 错误(非核心,但需修正)。
  2. 嵌入式系统中经常要用到无限循环,用C语言编写死循环的代码

     While(1)1. while(1){}(最常用,明确循环体为空);
2. for(;;){}for循环的初始化、条件、增量均可省略,条件省略视为 “永真”);
3. do{}while(1);(先执行一次循环体,再判断永真条件)。

  1. 给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

     设置: aI=(0x3<<偏移量)  设置 a&= ~(0x3<<偏移量)

  1. 已知 int 数组a[1000],需要将数组的后 100 个数据移动到前面,前面的数据依次后退。例如,若数组初始存入的数据是 1、2、3……1000,移动后的数据结果是 901、902……1000、1、2……900。用代码实现。

使用memcoy

#include <string.h>

void move_array(int a[], int n, int m) {

    int t[100];

    memcpy(t, a + n - m, m * sizeof(int));

    for(int i = n - 1; i >= m; i--)

        a[i] = a[i - m];

    memcpy(a, t, m * sizeof(int));

}

int main() {

    int a[1000];

    for(int i = 0; i < 1000; i++)

        a[i] = i + 1;

    move_array(a, 1000, 100);

    return 0;

}

  1.  简述SPI的传输特点、方式并画出工作时序

传输特点:

1.通信属性:串行(数据逐位传),同步(依赖sclk(spi)时钟同步),全双工(同一时钟周期内,主机经mosi发、从机经miso发,双向同时传);

  1. 速率与数据::“高速 3.4Mbps” 是 HS-mode,需区分 “标准模式(100Kbps)、快速模式(400Kbps)、高速模式(3.4Mbps)速率达mbps级;最小单位为字节(8/16位),1时钟周期传1位,1字节需8时钟周期;
  2. 主从模式:支持主从机,常用“单主机多从机”,主机控制sck时钟和nss片选,从机被动响应
  3. 从机选择:通过专属的nss/ncs片选线,主机拉低目标从机nss电平建立通信,其他从机nss保持高电平不响应

传输方式:

  1. 主从逻辑:主机输出sck和nss,经mosi发数据;从机按sck节奏收mosi数据,经miso回传数据
  2. 全双工实现:如主机发 0xFF、从机发 0x00,SCK 上升沿时二者分别经 MOSI/MISO 发 1 位,下降沿时分别读对方数据;8 时钟周期后,双方均完成 “发 + 收”;
  3. 多从机传输:四线制连接(sck、mosi、miso共线,各从机独立接主机nss),主机拉低对应从机nss实现“一对一”通信,避免冲突。

工作时序图:

  1. 简述I2C的传输特点、方式并画出工作时序(从机地址、寄存器地址、数据自定义)

一、I2C 传输特点

  1. 传输类型:串行(逐位传)、同步(依赖 SCL 时钟同步)、半双工(同一时间单向传);
  2. 硬件结构:仅 2 根双向线(SCL 时钟、SDA 数据),均需外接上拉电阻(空闲时保高电平、稳电路);
  3. 速率分级:低速 100Kbps、中速 400Kbps、高速 3.4Mbps;
  4. 主从架构:支持单 / 多主机多从机,主机主动发起 / 结束通信,从机被动响应;
  5. 唯一寻址:从机均有唯一 7 位地址(如 SHT20 为 0x40),主机通过地址定位从机;
  6. 应答机制:每传 1 字节(8 位),接收器第 9 时钟周期回 ACK(0,成功)或 NACK(1,失败 / 停止)。

二、I2C 传输方式

1. 主机→从机(写传输)

  1. 主机发起始信号(S),占总线;
  2. 发 “7 位从机地址 + W(0)”(如 SHT20 写地址 0x80);
  3. 从机回 ACK;
  4. 发目标寄存器地址(如 SHT20 温度寄存器 0xE3);
  5. 从机回 ACK;
  6. 发自定义数据(如配置值 0x55);
  7. 从机回 ACK;
  8. 主机发终止信号(P),释总线。

2. 主机←从机(读传输,先写后读)

  1. 主机发起始信号(S);
  2. 发 “7 位从机地址 + W”(如 0x80),从机回 ACK;
  3. 发目标寄存器地址(如 SHT20 湿度寄存器 0xE5),从机回 ACK;
  4. 主机发重复起始信号(S);
  5. 发 “7 位从机地址 + R(1)”(如 SHT20 读地址 0x81),从机回 ACK;
  6. 从机发自定义数据(如 2 字节湿度值 0x1234),每字节主机回 ACK;
  7. 主机收完回 NACK(停传);
  8. 主机发终止信号(P)。

三、I2C 工作时序(以 SHT20 读温度为例)

1. 时序参数

  • 从机地址:7 位 0x40;
  • 寄存器地址:0xE3(温度寄存器);
  • 自定义数据:2 字节温度值(0x1A、0x5B);
  • 时钟周期:1 个高 + 低电平,传 1 位需 1 周期。

2. 时序文字示意

信号

时序(高电平 “┌───┐”,低电平 “───”)

阶段说明

SCL

──┐ ┌───┐×8 ┌───┐ ┌───┐×8 ┌───┐×2 ┌───┐

时钟同步

SDA

──┼───┼───┼×8───┼───┼───┼×8───┼───┼───┼×2───┼───┘

数据 / 控制信号

阶段

S → 写寻址(0x80)→ ACK → 寄存器(0xE3)→ ACK → 重复 S → 读寻址(0x81)→ ACK → 数据(0x1A→ACK→0x5B→NACK)→ P

传输流程

3. 时序步骤

  1. S(起始):SCL 高时,SDA 高→低(下降沿);
  2. 写寻址:SCL 高时,SDA 传 0x80(8 位),从机回 ACK;
  3. 寄存器地址:SCL 高时传 0xE3,从机回 ACK;
  4. 重复 S:SCL 高时,SDA 高→低;
  5. 读寻址:SCL 高时传 0x81,从机回 ACK;
  6. 传数据:SCL 高时从机传 0x1A(高 8 位),主机回 ACK;再传 0x5B(低 8 位),主机回 NACK;
  7. P(终止):SCL 高时,SDA 低→高(上升沿)。

答题区:

答题要求:闭卷考试(不能翻书、不能开电脑);作答时间50分钟;共10道题目。

(请保留第原题目,答题区请备注好做题序号;只能写在答题纸上拍照粘贴到文档里-答题区,请保证照片清晰)

发送时请将文档命名更改为:本人姓名_软件笔试题

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

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

相关文章

通信模组性能调优

通信模组性能调优 1 背景 2 高通平台软硬加速 2.1 NSS 2.2 SFE 2.3 PPE 3 CPU 负载均衡设置 3.1 启用内核 RPS&RFS 功能 3.2 网卡队列修改建议 3.3 调整负载前后的 CPU 使用对比 3.4 网卡中断均衡 3.4.1 netdev_max_backlog 3.4.2 中断绑核 3.5 CPU性能模式 3.6 热管理 3.7…

消息队列kafka的事务特性

kafka的java客户端producer也支持事务消息吗&#xff1f;具体是啥事务呢&#xff1f; 是的&#xff0c;Kafka的Java客户端Producer确实支持事务消息。让我详细解释Kafka事务的概念和使用方法。 Kafka事务的主要特点&#xff1a; Producer Transactions&#xff1a;确保多个消息…

用Python实现自动化的Web测试(Selenium)

Python作为数据科学和自动化领域的主流语言&#xff0c;在网络爬虫开发中占据着重要地位。本文将全面介绍Python爬虫的技术栈、实现方法和最佳实践。爬虫技术概述网络爬虫&#xff08;Web Crawler&#xff09;是一种按照特定规则自动抓取互联网信息的程序。它可以自动化地浏览网…

「Memene 摸鱼日报 2025.9.17」上海张江人工智能创新小镇正式启动,华为 DCP 技术获网络顶会奖项

theme: condensed-night-purple 以下内容包括「人工智能生成内容」 上海张江人工智能创新小镇正式启动&#xff0c;华为 DCP 技术获网络顶会奖项 &#x1f44f;在昨天&#xff08;2025.9.16&#xff09;&#xff0c;AI领域有这些内容可能值得你关注&#xff1a; 上海张江人工智…

Vehiclehal的VehicleService.cpp

VehicleService.cpp 是 Android Automotive OS 中负责车辆相关功能的核心服务组件&#xff0c;主要处理车身信息获取及状态设置接口&#xff0c;通过 HIDL&#xff08;Hardware Interface Definition Language&#xff09;接口与系统框架层交互。 ‌12核心功能VehicleService.c…

《LINUX系统编程》笔记p11

公共资源也称为共享资源&#xff0c;是指可以被多个并发进程或线程共同访问&#xff08;读取或写入&#xff09;的系统资源。临界资源是公共资源的一个子集。特指那些一次仅允许一个进程或线程访问的公共资源。如果一个进程正在使用它&#xff0c;其他试图访问该资源的进程必须…

spring-kafka消费异常处理

默认的消费异常处理 默认情况下&#xff0c;如果程序没有显式做任何的异常处理&#xff0c;spring-kafka会提供一个默认的DefaultErrorHandler, 它会使用FixedBackOff做重试&#xff0c;会不间断的连续重试最多9次&#xff0c;也就是说一个消息最多会被消费10次。如果重试次数耗…

leecode73 矩阵置零

我的思路 这个题目不难&#xff0c;就是一句话&#xff0c;遍历这个矩阵的时候&#xff0c;当遇到0的时候就把该行该列改为0&#xff0c;同时为了不影响后续的遍历&#xff0c;我们可以将这个遍历和修改分为两个数组。使用mn的辅助空间 class Solution {public void setZeroe…

Spring Boot 与前端文件上传跨域问题:Multipart、CORS 与网关配置

前言在前后端分离架构下&#xff0c;文件上传是一个常见功能。但在 Spring Boot 项目中&#xff0c;我们经常会遇到前端调用接口上传文件时出现 跨域问题&#xff0c;表现为&#xff1a;浏览器控制台报错&#xff1a;Access-Control-Allow-Origin 缺失或不匹配。使用 FormData …

快速解决云服务器的数据库PhpMyAdmin登录问题

打开PhpMyAdmin数据库管理器登录页面账号密码就是你的用户名&#xff08;如YiXun&#xff09;和密码注意&#xff1a;root账户的密码&#xff0c;点击下面的“root密码”即能看到或修改PhpMyAdmin无法打开如果打不开&#xff1a;在数据库&#xff0c;点击PHPMyAdmin&#xff0c…

vite+vue3中使用FFmpeg@0.12.15实现视频编辑功能,不依赖SharedArrayBuffer!!!

FFmpeg0.12.15完全不依赖SharedArrayBuffer!!!强烈推荐使用 本文章主要是在vitevue3项目中使用FFmpeg&#xff0c;只展示了如何在项目中引入和基础的使用 更多详细参数可参照 ffmpeg官网https://ffmpeg.org/ 一、安装FFmpeg 可通过npm直接安装 npm install ffmpeg/core0.12.10…

构网型5MW中压储能变流升压一体机技术方案

1 构网型储能背景概述1.1 新型电力系统亟需构网支撑众所周知&#xff0c;新型电力系统具有两高特征&#xff1a;高比例新能源大规模并网、高比例电力电子大范围接入。近年来风光装机占比越来越高&#xff0c;而传统火电装机占比越来越低&#xff0c;并在2023年首次降至50%以下…

SRE 系列(七)| 从技术架构到团队组织

目录SRE落地与组织架构实践技术架构与组织架构的匹配技术架构示例运维职责分工技术保障体系SRE 多角色团队总结SRE落地与组织架构实践 在落地 SRE 时&#xff0c;很多团队最关心的问题之一就是组织架构&#xff1a;我们究竟需要怎样的团队形态&#xff0c;才能支撑微服务和分…

香港期权市场的主要参与者有哪些?

本文主要介绍香港期权市场的主要参与者有哪些&#xff1f;香港期权市场作为全球重要的金融衍生品市场&#xff0c;其参与者结构呈现多元化、专业化的特征&#xff0c;主要涵盖以下核心群体。香港期权市场的主要参与者有哪些&#xff1f;1. 机构投资者&#xff08;主导力量&…

搜维尔科技:全身可穿戴Teslasuit动捕服的功能,自立式FES装置

功能性电刺激 (FES) 设备广泛应用于康复和医疗实践。其底层技术利用低能量电脉冲&#xff0c;在中风、脊髓损伤、多发性硬化症、脑瘫等各种疾病患者中人工产生身体运动。一般来说&#xff0c;FES系统可以分为三类&#xff1a;开环、有限状态控制和闭环方法。这三种方法描述了 F…

【深度学习新浪潮】MoE是什么技术?

混合专家模型(Mixture of Experts,MoE)是大模型时代提升计算效率与模型能力的核心技术之一。其核心思想是将复杂任务分解为多个子任务,通过动态路由机制激活特定专家网络处理输入数据,从而在保持模型容量的同时大幅降低计算成本。以下是技术细节与实际应用的深度解析: 一…

Java进阶教程,全面剖析Java多线程编程,实现Callable接口实现多线程,笔记05

Java进阶教程&#xff0c;全面剖析Java多线程编程&#xff0c;实现Callable接口实现多线程&#xff0c;笔记05 参考资料 多线程&JUC-05-多线程的第三种实现方式一、实现Callable接口实现多线程 二、三种方式对比 优点缺点继承Thread类编程比较简单&#xff0c;可以直接使…

轨道交通绝缘监测—轨道交通安全的隐形防线

轨道交通绝缘监测作为保障行车安全的核心环节&#xff0c;正面临多重技术与环境挑战。复杂运营环境是首要痛点&#xff0c;隧道内高湿度&#xff08;月均湿度达95%&#xff09;会增大钢轨表面电导率&#xff0c;雾气中的盐分更会加速扣件绝缘性能下降&#xff0c;导致过渡电阻骤…

tar-符号连接(软连接)

1.符号连接是什么符号链接&#xff08;symbolic link&#xff0c;也叫软链接&#xff09;本质上是一个 指向路径的特殊文件。例如&#xff1a;ln -s /etc/passwd passwd_link这会创建一个叫 passwd_link 的文件&#xff0c;但它本身不存放 /etc/passwd 的内容&#xff0c;而是存…

ffmpeg切割音频

ffmpeg切割音频 我希望对指定音频切割&#xff0c;按照开始时间&#xff0c;结束时间&#xff0c;切割成新文件&#xff0c;自动保存&#xff0c;非常好用 step1: from pydub import AudioSegment import os# 配置FFmpeg路径&#xff08;确保路径正确&#xff09; ffmpeg_path …