当前位置: 首页 > news >正文

【嵌入式系统设计师(软考中级)】第三章:嵌入式系统软件基础知识——①软件及操作系统基础

文章目录

    • 1. 嵌入式系统软件基础知识
      • 1.1 嵌入式软件分类
      • 1.2 嵌入式系统初始化
      • 1.3 无操作系统支持的嵌入式软件体系结构
      • 1.4 有操作系统支持的嵌入式软件体系结构
      • 1.5 嵌入式支撑软件
    • 2. 嵌入式操作系统基础知识
      • 2.1 嵌入式操作系统基本概念
      • 2.2 处理器管理
        • 2.2.1 多道程序
        • 2.2.2 分区、进程、线程、任务的概念
        • 2.2.3 任务管理
        • 2.2.4 任务调度
        • 2.2.5 优先级反转问题
        • 2.2.6 任务间通信
        • 2.2.7 同步与互斥
        • 2.2.8 高可靠性系统的分区调度与通信
      • 2.3 存储管理
        • 2.3.1 存储管理方式
        • 2.3.2 分区存储管理
        • 2.3.3 地址重定位
        • 2.3.4 页式存储管理
        • 2.3.5 虚拟存储技术
      • 2.4 设备管理
        • 2.4.1 物理设备、逻辑设备、虚拟设备
        • 2.4.2 设备分类
        • 2.4.3 设备管理方式
        • 2.4.4 设备驱动程序
      • 2.5 文件系统
        • 2.5.1 文件与目录
        • 2.5.2 文件结构与组织
        • 2.5.3 存取方法与存取控制
        • 2.5.4 常见嵌入式文件系统
        • 2.5.5 网络文件系统
      • 2.6 操作系统移植


1. 嵌入式系统软件基础知识

1.1 嵌入式软件分类

嵌入式软件按照功能和作用可以分为以下几个类别:

  • 系统软件:如引导程序(Bootloader)、板级支持包(BSP)等,负责系统的初始化和底层驱动。
  • 支撑软件:包括文件系统、数据库、图形界面(GUI)等,为应用提供运行环境。
  • 中间件:在操作系统和应用之间提供服务,如通信协议栈、分布式对象系统等。
  • 可配置组件:可以根据需求进行动态配置的模块,提升系统的灵活性。
  • 应用软件:直接面向用户或实现具体功能的程序,如控制逻辑、数据处理等。

1.2 嵌入式系统初始化

嵌入式系统的启动过程是整个系统运行的基础,主要包括以下两个关键部分:

  • 系统引导(Bootloader)
    Bootloader(系统引导程序)是嵌入式系统启动的第一段代码,主要完成三项核心工作:1)硬件初始化(时钟、内存、外设等);2)加载操作系统镜像到内存;3)跳转到OS入口。典型代表如U-Boot支持多种架构,提供网络、存储等扩展功能。其执行流程为:ROM代码→Bootloader阶段1(低级初始化)→阶段2(高级功能)→启动内核。

  • 板级支持包(BSP)
    BSP(板级支持包)是硬件与操作系统间的适配层,包含:1)处理器特定代码(中断控制器、定时器驱动);2)板级硬件抽象(GPIO映射、存储器配置);3)设备驱动框架。开发时需根据具体硬件修改BSP,如调整内存映射表、实现定制外设驱动等。

Bootloader与BSP的关系是:Bootloader依赖BSP完成基础硬件初始化,而OS通过BSP管理硬件资源。两者共同确保系统从启动到运行的平滑过渡。

系统启动流程如下图所示:

上电复位
Bootloader
硬件初始化
加载BSP
启动RTOS/OS
运行应用

1.3 无操作系统支持的嵌入式软件体系结构

在一些资源受限或对实时性要求极高的系统中,可能不使用操作系统。这类系统通常采用轮询机制或中断服务程序来实现任务调度,具有结构简单、响应迅速的特点,但缺乏多任务管理和资源调度能力。

1.4 有操作系统支持的嵌入式软件体系结构

引入嵌入式操作系统后,系统具备了多任务管理、内存管理、设备驱动抽象、文件系统支持等功能,提高了系统的稳定性、可移植性和可扩展性。典型的嵌入式操作系统包括 FreeRTOS、VxWorks、μC/OS、Linux 等。

在这里插入图片描述

1.5 嵌入式支撑软件

嵌入式支撑软件为应用开发提供基础服务,主要包括:

  • 嵌入式文件系统:如 FAT、JFFS、YAFFS、EXT 等,适用于不同存储介质和应用场景。
  • 嵌入式数据库:轻量级数据库如 SQLite、TinyDB,用于本地数据存储与查询。
  • 分布式对象系统:如 CORBA、DDS,支持跨平台通信与数据共享。
  • 图形用户界面(GUI):如 Qt、MiniGUI、LVGL,用于构建可视化交互界面。

2. 嵌入式操作系统基础知识

2.1 嵌入式操作系统基本概念

嵌入式操作系统(Embedded OS)是专为嵌入式系统设计的操作系统,具有体积小、功耗低、实时性强、可裁剪等特点。它通常运行在资源有限的处理器上,如 ARM、MIPS、RISC-V 等架构。

2.2 处理器管理

2.2.1 多道程序

多道程序是指允许多个程序同时驻留在内存中,通过分时共享 CPU 资源来提高系统利用率。核心特点为:

  • 并发执行:多个程序交替占用 CPU,宏观上"同时"运行。
  • 资源复用:CPU、内存、I/O 设备等资源被多个程序共享。
  • 调度机制:采用时间片轮转(Round-Robin)或优先级调度决定哪个程序先执行。
2.2.2 分区、进程、线程、任务的概念
  • 分区:将系统资源(内存、CPU、外设等)划分为多个独立区域,用于隔离不同功能模块或应用程序。防止一个模块崩溃影响整个系统(如微内核架构)。关键任务独占分区,避免资源竞争。
  • 进程:程序的执行实例,拥有独立的地址空间、文件描述符等资源。进程间通常不直接共享内存(需 IPC 机制,如管道、消息队列)。
  • 线程:进程内的执行单元,共享同一进程的资源(如内存、文件句柄)。线程间可直接读写共享数据(需同步机制,如互斥锁)。
  • 任务(Task):通常指实时调度的基本单位,内存占用极简(可能无MMU支持)。
2.2.3 任务管理

由操作系统内核提供完整的管理机制,包括:

  • 创建:分配任务控制块(TCB),设置优先级和栈空间
  • 调度:基于优先级或时间片的就绪队列管理
  • 同步:通过信号量、事件标志等机制实现任务协调
  • 状态控制:支持挂起、恢复、删除等操作
  • 资源回收:任务终止时自动释放占用的系统资源
2.2.4 任务调度

抢占式调度

  • 高优先级任务可以随时中断低优先级任务的执行,例如任务A在运行过程中,突然来了任务B,如果任务B优先级更高,则CPU会挂起任务A先直接抢占执行任务B。

非抢占式调度

  • 任务一旦获得CPU就会一直运行,直到完成或主动放弃CPU,例如任务A在运行过程中,突然来了任务B,即使任务B优先级更高,CPU也会先执行完任务A,等到任务A主动放弃CPU后才会执行优先级更高的任务B。
2.2.5 优先级反转问题

优先级反转是指高优先级任务被迫等待低优先级任务的情况,通常发生在资源共享时。

在这里插入图片描述
这张图展示了在没有优先级继承和有优先级继承两种情况下,优先级抢占对系统行为的影响。我们可以通过对比这两种情况来理解优先级继承的作用。

没有优先级继承的情况

  1. 初始状态

    • 低优先级线程(绿色)获得锁并开始执行。
  2. 高优先级线程介入

    • 高优先级线程(红色)尝试获取锁,但因为锁被低优先级线程持有,所以它进入等待状态。
    • 此时,中等优先级线程(橙色)可以抢占低优先级线程的CPU资源,并开始执行。
    • 低优先级线程被挂起,直到中等优先级线程释放CPU资源。
  3. 锁释放与重新获取

    • 当低优先级线程再次获得CPU资源并释放锁后,高优先级线程才能继续执行。
    • 在此过程中,高优先级线程经历了不必要的延迟,这种现象被称为“优先级反转”。

有优先级继承的情况

  1. 初始状态

    • 低优先级线程(绿色)获得锁并开始执行。
  2. 高优先级线程介入

    • 高优先级线程(红色)尝试获取锁,但因为锁被低优先级线程持有,所以它进入等待状态。
    • 此时,低优先级线程的优先级被临时提升到高优先级线程的级别,以防止中等优先级线程(橙色)抢占其CPU资源。
    • 因此,低优先级线程能够尽快完成其任务并释放锁。
  3. 锁释放与恢复优先级

    • 当低优先级线程释放锁后,其优先级恢复到原来的低优先级。
    • 高优先级线程立即获得锁并继续执行,避免了不必要的延迟。

总结:通过优先级继承机制,当一个低优先级线程持有某个资源(如锁),而高优先级线程需要访问该资源时,低优先级线程的优先级会被临时提升,以确保它能尽快完成任务并释放资源。这样可以避免优先级反转问题,保证高优先级线程能够及时得到所需的资源,从而提高系统的实时性和响应性。

2.2.6 任务间通信
  • 共享内存:多个任务直接访问同一块内存区域进行数据交换,需配合同步机制避免冲突。
  • 消息队列:内核维护的FIFO缓冲区,任务通过发送/接收结构化消息实现异步通信。
  • 邮箱:简化版消息队列,通常只允许存储单条消息,提供消息通知机制。
  • 管道:基于文件描述符的字节流通信方式,支持单向数据流动,常用于父子进程通信。
  • 信号量:用于控制资源访问的计数器,实现任务间的同步/互斥,分二进制和计数型两种。
2.2.7 同步与互斥
  • 互斥:在多线程或多进程环境中,为了防止同时访问共享资源而引起的数据不一致问题,可以使用信号量实现互斥访问。这通常通过一个初始值为1的二进制信号量来完成,也称为互斥锁。任何需要访问共享资源的线程必须首先执行P操作以获得锁,访问结束后执行V操作释放锁。

  • 同步:信号量也可以用来控制进程或线程之间的执行顺序,确保某些事件按照预定的顺序发生。例如,在生产者-消费者问题中,可以通过两个信号量分别控制缓冲区的空位数量和满位数量,从而协调生产者和消费者的行为。

在同步与互斥机制中,"PV操作"是一种经典的信号量(Semaphore)操作,用于解决进程或线程间的同步和互斥问题。

“P操作"和"V操作"这两个术语来源于荷兰语:“Proberen”(尝试)和"Verhogen”(增加),它们是由计算机科学家艾兹赫尔·戴克斯特拉(Edsger Dijkstra)提出。

  • P操作(Proberen, 减少):通常被理解为“等待”或“减量”操作。当一个进程执行P操作时,如果当前信号量的值大于0,该值将减1,并且进程可以继续执行;如果信号量的值0,表示没有可用资源或者需要等待的条件尚未满足,这时进程会被阻塞,直到有其他进程执行了V操作使得信号量的值变为正数。

  • V操作(Verhogen, 增加):通常被理解为“释放”或“增量”操作。当一个进程执行V操作时,它会增加信号量的值。如果此时有其他进程正在等待这个信号量(即之前执行P操作后被阻塞的进程),那么其中一个(或者多个,取决于信号量的类型是二进制还是计数)将会被唤醒并允许继续执行。

在这里插入图片描述

2.2.8 高可靠性系统的分区调度与通信

采用分区机制(如 ARINC 653 标准),将系统划分为多个隔离的时间与空间分区,保证关键任务的实时性和安全性。

2.3 存储管理

2.3.1 存储管理方式
  • 连续分配:程序装入内存时分配连续的物理地址空间,包括单一连续分配和固定/可变分区分配。
    • 优势:实现简单,访问速度快(无地址转换开销),适合静态程序。
    • 劣势:内存碎片化严重(外部碎片),内存利用率低,程序大小受分区限制
  • 离散分配:将程序分散存储在非连续的物理内存中,通过分页/分段/段页式机制实现地址映射。
    • 优势:提高内存利用率(减少碎片),支持动态加载,程序大小不受物理内存限制
    • 劣势:实现复杂,需要硬件支持(MMU),存在地址转换开销(页表/段表查询)
2.3.2 分区存储管理
  • 固定分区:静态划分内存区域。
  • 可变分区:根据任务大小动态划分。
  • 内存保护:防止非法访问其他任务的内存空间。
2.3.3 地址重定位

地址重定位是指将程序中的逻辑地址(相对地址)转换为内存中实际物理地址的过程,这是实现多道程序运行的关键技术。

在程序编译时生成的逻辑地址需要通过静态重定位(程序装入时一次性转换)或动态重定位(运行时通过内存管理单元MMU实时转换)映射为物理地址,其中动态重定位是现代操作系统的主流方式,它通过页表、段表等映射机制实现地址转换,既支持虚拟内存管理,又能实现内存访问保护和共享。

这种机制的优势在于提高了内存利用率,使程序可以分散存储在非连续的物理内存中,同时支持内存保护和进程隔离;但需要硬件MMU的支持,且地址转换会带来一定的性能开销。

2.3.4 页式存储管理

将内存划分为固定大小的“页”,便于管理与调度。

在这里插入图片描述

2.3.5 虚拟存储技术
  • 程序局部性原理

    • 时间局部性:最近被访问的数据很可能短期内再次被访问
    • 空间局部性:程序倾向于访问邻近当前地址的内存区域
  • 虚拟页式存储管理
    将进程地址空间划分为固定大小的页(Page),通过页表实现虚拟地址到物理地址的映射,支持按需调页和页面置换

  • 页面置换算法

    • FIFO:替换最先进入内存的页面,实现简单但效率较低
    • LRU(最近最少使用):替换最长时间未被访问的页面,效果较好但实现复杂
    • OPT(最优置换):理论最优算法,替换未来最长时间不被访问的页面(实际无法实现)

2.4 设备管理

2.4.1 物理设备、逻辑设备、虚拟设备
  • 物理设备:实际存在的硬件。
  • 逻辑设备:操作系统提供的抽象接口。
  • 虚拟设备:通过软件模拟的设备。
2.4.2 设备分类
  • 字符设备:按字节顺序访问(如串口)。
  • 块设备:按固定大小的数据块读写(如硬盘)。
  • 网络设备:处理网络通信。
2.4.3 设备管理方式
  • 设备文件:Linux系统将硬件设备抽象为/dev目录下的特殊文件,通过标准文件操作接口(open/read/write)访问设备。
  • 设备无关性:操作系统提供统一的设备访问接口,使应用程序无需关心具体设备的硬件特性差异。
  • 中断处理:当外设完成I/O操作时通过中断信号通知CPU,由中断服务程序进行即时响应和处理。
  • 缓冲技术:在内存中建立数据缓冲区,用于平滑CPU与I/O设备间的速度差异,减少中断次数。
  • 假脱机技术(SPOOLing):将独占设备虚拟为多个共享设备,典型应用如打印任务队列管理。
2.4.4 设备驱动程序

驱动程序是操作系统与硬件之间的桥梁,负责控制和管理设备的行为。

2.5 文件系统

2.5.1 文件与目录
  • 文件是信息的基本单位。
  • 目录用于组织文件结构。
2.5.2 文件结构与组织
  • 连续结构、链式结构、索引结构等。
2.5.3 存取方法与存取控制
  • 随机访问、顺序访问。
  • 权限控制、加密等。
2.5.4 常见嵌入式文件系统
  • FAT:兼容性好,适合小型存储。
  • RAMFS:基于内存的文件系统,速度快。
  • ROMFS:只读文件系统,适合固件。
  • JFFS/JFFS2:适用于 NOR Flash。
  • YAFFS/YAFFS2:针对 NAND Flash 的优化。
  • EXT4:Linux 常用,功能丰富。
2.5.5 网络文件系统
  • NFS(Network File System):远程挂载文件系统。

2.6 操作系统移植

操作系统移植是指将操作系统适配到新的硬件平台,主要包括以下步骤:

  • 硬件配置分析
  • BSP 移植:修改底层硬件初始化代码。
  • 驱动移植:编写或适配外设驱动。
  • 系统配置:选择内核模块、配置参数。
  • 交叉编译:在宿主机上编译目标平台的代码。
  • 部署与测试:烧录镜像、验证功能。

嵌入式系统的开发是一个软硬件协同的过程,理解嵌入式软件体系结构与操作系统的工作机制是构建高效、稳定、可靠系统的关键。

相关文章:

【嵌入式系统设计师(软考中级)】第三章:嵌入式系统软件基础知识——①软件及操作系统基础

文章目录 1. 嵌入式系统软件基础知识1.1 嵌入式软件分类1.2 嵌入式系统初始化1.3 无操作系统支持的嵌入式软件体系结构1.4 有操作系统支持的嵌入式软件体系结构1.5 嵌入式支撑软件 2. 嵌入式操作系统基础知识2.1 嵌入式操作系统基本概念2.2 处理器管理2.2.1 多道程序2.2.2 分区…...

cs224w课程学习笔记-第11课

cs224w课程学习笔记-第11课 知识图谱嵌入 前言一、知识图谱1、知识图谱特点2、关系类型 二、知识图谱嵌入1、嵌入核心思想2、嵌入模型2.1 嵌入模型transE1)、核心思想2)、训练步骤3)、模型表征能力 2.2 嵌入模型TransR2.3 DistMult嵌入模型1)、核心思想2)、表征能力 2.4 complE…...

5.10-套接字通信 - C++

套接字通信 1.1 通信效率问题 服务器端 单线程 / 单进程 无法使用,不支持多客户端 多线程 / 多进程 写程序优先考虑多线程:什么时候考虑多进程? 启动了一个可执行程序 A ,要在 A 中启动一个可执行程序 B 支持多客户端连接 IO 多…...

【Linux】Linux内核的网络协议之socket理解

1. Socket(套接字) 的本质 它是应用程序与网络协议栈之间的编程接口(API),用于实现网络通信。 Socket 并不是一个物理设备,而是一个抽象层为应用程序提供统一的网络操作接口(如 send()、recv()…...

仿函数和函数对象

1. 概念解读:什么是“函数”和“函数对象”? 核心概念一句话总结 仿函数(Functor) 函数对象(Function Object) 它们本质是一个对象(Object),但可以像函数(Fu…...

Kubernetes控制平面组件:Kubelet 之 Static 静态 Pod

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...

Django 项目的 models 目录中,__init__.py 文件的作用

在 Django 项目的models/init.py文件中,这些导入语句的主要作用是将各个模型类从不同的模块中导入到models包的命名空间中。这样做有以下几个目的: 简化导入路径 当你需要在项目的其他地方使用这些模型时,可以直接从models包导入&#xff0c…...

学习日志04 java

PTA上的练习复盘 java01 编程题作业感悟: 可以用ai指导自己怎么调试,但是不要把调代码这过程里面的精华交给ai,就是自己去修正错误不能让ai代劳!~~~ 1 scanner.close() Scanner *** new Scanner(System.in); ***.close(); …...

vue-pdf-embed预览PDF

一、vue-pdf-embed 链接&#xff1a;Yarn 1、安装插件 npm install vue-pdf-embed 2、文件中引入&#xff08;分页效果已实现&#xff0c;样式请自行修改&#xff09; <template><div class"download-pdf-preview" style"height: 450px; border:1…...

C++GO语言微服务之Dockerfile docker-compose

目录 01 01-知识点概述 02 02-dockerfile复习 03 03-环境变量ENV的使用 04 04-WORKDIR的使用 05 05-USER和ARG的使用 06 06-ONBUILD的使用 07 07-dockerfile的缓存相关的参数 08 08-dockerfile的编写 09 09-测试-没成功-好像是网不行 01 10-docker-compose介绍 02 11…...

【漫话机器学习系列】255.独立同分布(Independent and Identically Distributed,简称 IID)

深入理解独立同分布&#xff08;IID&#xff09;&#xff1a;机器学习与统计学的基石 在机器学习、深度学习、统计建模等领域&#xff0c;我们经常会遇到一个重要假设&#xff1a;独立同分布&#xff08;Independent and Identically Distributed&#xff0c;简称 IID&#xf…...

树莓派4 yolo 11l.pt性能优化后的版本

树莓派4 使用 Picamera2 拍摄图像&#xff0c;然后通过 YOLO11l.pt 进行目标检测&#xff0c;并在实时视频流中显示结果。但当前的代码在运行时可能会比较卡顿&#xff0c;主要原因包括&#xff1a; picam2.capture_array() 是一个较慢的操作&#xff1b;YOLO 推理可能耗时较长…...

AD22 快速定义PCB板框与DXF导入定义

自行定义板框 1. 初步评估&#xff1a;选中所有的器件&#xff0c;选中‘在矩形区域排列’ 将元件放好后&#xff0c;可以再将元件紧凑一下 2. 设置原点&#xff0c;并在下方选中机械一层 从原点出发&#xff0c;点击快捷键PL 画框线 3. 对线条长度取整&#xff0c;且最好是5…...

LInux系统文件与目录管理(二)

提示&#xff1a;第二部分对第一部分收尾 文章目录 常见的命令如下一、文件查看命令1. more命令2.less命令3.head命令4.tail命令5.nl命令&#xff08;了解&#xff09;6.创建目录命令7.创建文件命令>: 覆盖重定向>>: 追加重定向 8.touch命令9.echo命令10.文件或目录复…...

Redisson在业务处理中失败后的应对策略:保障分布式系统的可靠性

分布式系统中的数据一致性与高可用性一直是开发者面临的难题。作为Redis官方推荐的Java客户端&#xff0c;Redisson凭借其强大的分布式能力成为解决这些问题的利器。但在实际业务场景中&#xff0c;网络抖动、资源竞争、节点故障等问题可能导致操作失败&#xff0c;本文将深入探…...

windows下docker 运行 ros2humble arm64

目前要想运行arm版ros humble 目前最好的解决方案是使用qemu模拟。 1.拉取 ubuntu22.04 docker pull ubuntu:22.04 --platformarm642.安装小鱼ros2 humble wget http://fishros.com/install -O fishros && . fishros3.安装eqmu docker run --rm --privileged multia…...

表的增删改查 -- 2

目录 3、查询&#xff08;R&#xff09; 3.7、条件查询&#xff1a;where 3.8、分页查询&#xff1a;limit 3.9、查询总结 4、修改&#xff08;U&#xff09; 5、删除&#xff08;D&#xff09; 3、查询&#xff08;R&#xff09; 3.7、条件查询&#xff1a;where selec…...

Linux系统管理与编程20:Apache

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 做好网络和yum配置&#xff0c;用前面dns规划的www的IP进行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …...

dfs 第一次加训 详解 下

目录 P1706 全排列问题 思路 B3618 寻找团伙 思路 B3621 枚举元组 思路 B3622 枚举子集&#xff08;递归实现指数型枚举&#xff09; 思路 B3623 枚举排列&#xff08;递归实现排列型枚举&#xff09; B3625 迷宫寻路 思路 P6183 [USACO10MAR] The Rock Game S 总结…...

vue2/3 中使用 @vue-office/docx 在网页中预览(docx、excel、pdf)文件

1. 安装依赖&#xff1a; #docx文档预览组件npm install vue-office/docx vue-demi0.14.6#excel文档预览组件npm install vue-office/excel vue-demi0.14.6#pdf文档预览组件npm install vue-office/pdf vue-demi0.14.6 vue2.6版本或以下还需要额外安装 vue/composition-api …...

Excel表的导入与导出

Excel表的导入与导出 根据excel表来建立所需的数据库表格 <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version></dependency><dependency><groupId>cn.hutool&…...

Redis 中常见的数据类型有哪些?

Redis 常见的数据类型包括 5 种基础类型&#xff08;String、Hash、List、Set、Zset&#xff09;和 3 种特殊类型&#xff08;HyperLogLog、Bitmap、Geospatial&#xff09;。以下是详细说明&#xff1a; 一、5 种基础数据类型 1. 字符串&#xff08;String&#xff09; 特点…...

消息队列如何保证消息可靠性(kafka以及RabbitMQ)

目录 RabbitMQ保证消息可靠性 生产者丢失消息 MQ丢失消息 消费端丢失了数据 Kakfa的消息可靠性 生产者的消息可靠性 Kakfa的消息可靠性 消费者的消息可靠性 RabbitMQ保证消息可靠性 生产者丢失消息 1.事务消息保证 生产者在发送消息之前&#xff0c;开启事务消息随后生…...

基于STM32、HAL库的BMP390L气压传感器 驱动程序设计

一、简介: BMP390L 是 Bosch Sensortec 生产的一款高精度气压传感器,专为需要精确测量气压和海拔高度的应用场景设计。BMP390L 具有更低的功耗、更高的精度和更快的响应速度。 二、硬件接口: BMP390L 引脚STM32L4XX 引脚说明VDD3.3V电源GNDGND地SCLPB6 (I2C1 SCL)I2C 时钟线…...

QMK键盘固件中LED锁定指示灯的配置与使用详解(实操部分+拓展)

QMK键盘固件中LED锁定指示灯的配置与使用详解 大家好!今天就跟大家一起探索QMK固件中LED锁定指示灯的配置与使用。无论你是键盘DIY新手还是老司机,相信这篇教程都能帮你解锁新技能! 一、基础配置:定义LED引脚 在QMK固件中配置LED锁定指示灯非常简单,只需在config.h文件…...

【日撸 Java 三百行】Day 12(顺序表(二))

目录 Day 12&#xff1a;顺序表&#xff08;二&#xff09; 一、顺序表的方法 1. 顺序查找 拓展&#xff1a;顺序查找中的哨兵思想 2. 插入 3. 删除 二、代码及测试 拓展&#xff1a; 小结 Day 12&#xff1a;顺序表&#xff08;二&#xff09; Task&#xff1a; 今天…...

Python爬虫实战:研究ajax异步渲染加密

一、引言 在当今数字化时代,数据已成为推动各行业发展的核心驱动力。网络爬虫作为一种高效的数据采集工具,能够从互联网上自动获取大量有价值的信息。然而,随着 Web 技术的不断发展,越来越多的网站采用了 AJAX(Asynchronous JavaScript and XML)异步渲染技术来提升用户体…...

Golang企业级商城高并发微服务实战

Golang企业级商城高并发微服务实战包含内容介绍&#xff1a; 从零开始讲了百万级单体高并发架构、千万级微服务架构&#xff0c;其中包含Rpc实现微服务、微服务的跨语言调用jsonrpc和protobuf、protobuf的安装、protobuf高级语法、protobuf结合Grpc实现微服务实战、微服务服务…...

从经典力扣题发掘DFS与记忆化搜索的本质 -从矩阵最长递增路径入手 一步步探究dfs思维优化与编程深度思考

1引子&#xff1a; DFS和递归法的一道经典例题矩阵最长递增子序列这个题写完之后脑袋产生了许多突发奇想&#xff1a; 1 第一个堆栈代码段这些底层C语言内部管理的工具它是怎么进行内存分配的&#xff1f;能不能深究&#xff1f; 2 第二个这个DFS和计划数组存储的思路到底抽象…...

我开源了一个免费在线工具!UIED Tools

UIED Tools - 免费在线工具集合 最近更新&#xff1a;修改了文档说明&#xff0c;优化了项目结构介绍 这是设计师转开发的第一个开源项目&#xff0c;bug和代码规范可能有些欠缺。 这是一个功能丰富的免费在线工具集合网站&#xff0c;集成了多种实用工具&#xff0c;包括 AI …...

geoserver发布arcgis瓦片地图服务(最新版本)

第一步&#xff1a;下载geoserver服务&#xff0c;进入bin目录启动 需要提前安装好JDK环境&#xff0c;1.8及以上版本 安装完成&#xff0c;页面访问端口&#xff0c;进入控制台界面,默认用户名密码admin/geoserver 第二步&#xff1a;下载地图 破解版全能电子地图下载器&…...

RN 鸿蒙混合开发实践(踩坑)

#三方框架# #React Native # 1 。环境配置&#xff1b; 安装 DevEco 开发工具&#xff1b; Node 版本16&#xff1b; hdc环境配置 hdc 是 OpenHarmony 为开发人员提供的用于调试的命令行工具&#xff0c;鸿蒙 React Native 工程使用 hdc 进行真机调试。hdc 工具通过 OpenHa…...

2025年阿里云ACP大数据分析师认证模拟试题(附答案解析)

这篇文章的内容是阿里云ACP大数据分析师认证考试的模拟试题。 所有模拟试题由AI自动生成&#xff0c;主要为了练习和巩固知识&#xff0c;并非所谓的 “题库”&#xff0c;考试中如果出现同样试题那真是纯属巧合。 1、ABC公司现有大量的图片和视频信息&#xff0c;以下哪种产…...

go语言实现IP归属地查询

效果: 实现代码main.go package mainimport ("encoding/json""fmt""io/ioutil""net/http""os" )type AreaData struct {Continent string json:"continent"Country string json:"country"ZipCode …...

Qt中解决UI线程阻塞导致弹窗无法显示的两种方法

在Qt应用程序开发中,我们经常会遇到这样的问题:当执行一个耗时操作时,整个界面会卡住,无法响应任何用户操作,甚至连一个简单的提示弹窗都无法正常显示。本文将介绍两种解决这个问题的方法,并通过完整的代码示例进行说明。 问题描述 先来看一个常见的错误示例: #inclu…...

位运算题目:黑板异或游戏

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;黑板异或游戏 出处&#xff1a;810. 黑板异或游戏 难度 8 级 题目描述 要求 给定一个整数数组 nums \texttt{nums} nums&#xff0c;表示写在黑板…...

LegoGPT,卡内基梅隆大学推出的乐高积木设计模型

LegoGPT 是由卡内基梅隆大学开发的一款创新性乐高积木设计模型&#xff0c;能够根据用户的文本提示生成结构稳固、可组装的乐高模型。该模型基于自回归语言模型和大规模乐高设计数据集进行训练&#xff0c;用户只需输入简单的文字描述&#xff0c;LegoGPT 就能逐步构建出物理稳…...

深度 |国产操作系统“破茧而出”:鸿蒙电脑填补自主生态空白

真心为国内能有像华为这样的技术型公司而自豪&#xff0c;一步步突围技术封锁。从这篇信息&#xff0c;可以给软件从业者一个启示&#xff1a;鸿蒙生态将是一个新的机会&#xff0c;值得好好把握。 鸿蒙电脑正成为中国电子信息技术新坐标。 超10亿鸿蒙生态设备、2800家鸿蒙智…...

【Python】Python常用数据类型判断方法详解

在Python编程中,准确判断数据类型是处理逻辑分支、类型转换和异常处理的基础。本文结合核心方法与实践场景,系统介绍type()、isinstance()等常用判断方式,并分析其适用性与最佳实践。 一、直接类型判断方法 type()函数 • 功能:返回对象的精确类型,适用于简单类型判断。 •…...

【美国将取消对能源之星支持 严重影响AI服务器】

1992年美国政府在共和党执政期间推出了影响深远的“能源之星”计划&#xff08;Energy Star&#xff09;&#xff0c;很多人可能并不知道能源执行计划&#xff0c;但这个蓝色星星标签估计大多数人都不会陌生。能源之星计划从推出以来不止得到各类消费电子制造商认可&#xff0c…...

《 C++ 点滴漫谈: 三十七 》左值?右值?完美转发?C++ 引用的真相超乎你想象!

摘要 本文全面系统地讲解了 C 中的引用机制&#xff0c;涵盖左值引用、右值引用、引用折叠、完美转发等核心概念&#xff0c;并深入探讨其底层实现原理及工程实践应用。通过详细的示例与对比&#xff0c;读者不仅能掌握引用的语法规则和使用技巧&#xff0c;还能理解引用在性能…...

【生产实践】Linux中/usr/bin、/usr/sbin与/usr/local的关系解析(2025年技术规范)

一、核心定位与功能划分 /usr/bin&#xff1a;用户级通用命令库 • 定位&#xff1a;存储系统预装的用户级可执行文件&#xff0c;这些命令通常由Linux发行版官方软件包管理器&#xff08;如APT、YUM&#xff09;安装&#xff0c;属于系统默认功能的一部分。 • 示例命令&#…...

数据可视化:用一张图讲好一个故事

在这个信息爆炸的时代&#xff0c;数据无处不在&#xff0c;但如何让复杂的数据变得通俗易懂&#xff1f;数据可视化就是一把神奇的钥匙。它不仅能将枯燥的数字转化为生动的图像&#xff0c;还能挖掘出数据背后隐藏的故事。然而&#xff0c;很多人对数据可视化的理解还停留在表…...

C++获取目录中所有图片路径的函数get_image_paths解析

本文将全面解析一个用于获取目录中图片路径的C函数get_image_paths&#xff0c;从基础语法到高级概念&#xff0c;涵盖C标准库、文件系统操作、异常处理等多个方面。 原始代码 std::vector<std::string> get_image_paths(const std::string& directory_path) {log_…...

物联网无线传感方向专业词汇解释

涡旋电磁波(VEMW)&#xff1a;一种具有轨道角动量的电磁波&#xff0c;其特性在于能够在传播过程中携带额外的相位信息&#xff0c;从而增加通信系统的容量和灵活性。波前&#xff1a;波动传播过程中&#xff0c;同一时刻振动相位相同的所有点构成的几何曲面&#xff0c;代表波…...

【C语言指针超详解(五)】--回调函数,qsort函数的理解和使用,qsort函数的模拟实现

目录 一.回调函数 1.1--回调函数的概念 1.2--回调函数改造计算器程序 二.qsort函数的理解和使用 2.1--qsort函数的理解 2.2--使用qsort函数排序整型数据 2.3--使用qsort函数排序结构数据 三.qsort函数的模拟实现 &#x1f525;个人主页&#xff1a;草莓熊Lotso的个人主…...

【Linux网络】————HTTP协议详解

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2025年5月11日 1. HTTP 协议介绍 基本介绍&#xff1a; http协议全称&#xff1a;超文本传输协议&#xff0c;适用于从万维网服务器传输超文本到本地的传送协议。HTTP是一种应用层协议…...

使用WinSW工具将exe注册为window服务

下载工具WinSW(工具在GitHub上 打不开就需要魔法VPN) 文件准备 将以下文件放在同一个目录&#xff08;例如&#xff1a;WebSocketService 文件夹&#xff09;中&#xff1a; WebScoket.exe WinSW-x64.exe WebScoketService.xml ← 服务配置文件 install_service.bat ←…...

远程命令执行RCE概述

远程命令执行RCE诞生于1997年&#xff0c;比SQL注入早1年&#xff0c;据说当时的程序员发现在网站里可以随意的删除网页&#xff0c;就像删除本地文件一样简单&#xff0c;但是这种场景相对不多&#xff0c;因此没有SQL注入广泛&#xff0c;早期的web攻击像现在的护网一样&…...

在 .NET 8 开发的WinForms 程序中展示程序版本号的几种方式

前言 欢迎关注dotnet研习社&#xff0c;今天我们讨论一个Winform开发中的一个常见的需求内容“关于程序的版本号显示”。 在 WinForms 桌面应用程序开发中&#xff0c;向用户显示当前程序的版本号是一个常见的需求&#xff0c;尤其是在产品发布、更新提示或技术支持场景中尤为…...