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

【AUTOSAR 基础软件】软件组件的建立与使用(“代理”SWC)

基础软件往往需要建立一些“代理”SWC来完成一些驱动的抽象工作(Complex_Device_Driver_Sw或者Ecu_Abstraction_Sw等),或建立Application Sw Component来补齐基础软件需要提供的功能实现。当面对具体的项目时,基础软件开发人员还可能需要建立一些Application Sw Component来实现一些板级功能要求,诸如系统(软/硬件)状态管理,存储管理,特殊的通信协议适配等功能。

本文从创建软件组件讲起,并针对软件组件中的常用功能以实例为基础进行了详尽的说明,帮助读者能够使用ISOLAR这个工具建立并使用SWC。在为应用层补齐必要的SWC之后,还能在符合AUTOSAR架构的工程中在RTE之上添加一部分“手写代码”,实现逻辑。

目录

创建软件组件

软件组件说明 

组件内部行为

组件端口

组件运行实体 

组件事件 

组件代码生成

基础软件常用“代理”SWC

CDD 

IOAbstraction

Diagnosis

State_Management

Memory_Management

XXX_Protocol

XXX_Supplemented


创建软件组件

首先我们通过ISOLAR-AB新建SWC。打开ISOLAR-AB之后,在AR Explorer页签下的Software中的Components右键,新建SWC,如下图所示(下图建立的是应用SWC)。

软件组件取名为Test3,并为其新建一个arxml。

完成之后,即可以在Components下看到这个新建的SWC。

如果后期需要将arxml移动位置,以方便管理工程文件,可以利用虚拟文件功能,我这里在工程目录外先新建一个ASW文件夹,然后把Test3.arxml剪切进去,然后再ISOLAR中的Filesystem Navigator中的工程名中右键选择Import。

然后选择File System。

然后将ASW加入到工程目录中,如下图。

最后可以看到,ASW被添加到了Filesystem中,且Compoments中也有了这个软件组件(在之前的剪切工作之后,Refresh之后组件就会在Compoments消失,添加完这个路径之后又会再有)。

当然,最直接的方式是直接在工程目录下粘贴一个空的SWC模板,如下。

<?xml version="1.0" encoding="UTF-8"?>
<AUTOSAR xmlns="http://autosar.org/schema/r4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://autosar.org/schema/r4.0 AUTOSAR_00044.xsd"><AR-PACKAGES><AR-PACKAGE><SHORT-NAME>Test3</SHORT-NAME><ELEMENTS><APPLICATION-SW-COMPONENT-TYPE><SHORT-NAME>Test3</SHORT-NAME><ADMIN-DATA><SDGS><SDG GID="Master"><SD>true</SD></SDG></SDGS></ADMIN-DATA></APPLICATION-SW-COMPONENT-TYPE></ELEMENTS></AR-PACKAGE></AR-PACKAGES>
</AUTOSAR>

软件组件说明 

组件内部行为

这个容器包含了软件组件除了Ports之外的Runnables、OperationlnvokedEvent和TimingEvent等软件组件的组成部分。右键当前的SWC进行创建,创建方法如下图。

组件端口

软件组件的端口按方向分为PPorts,RPorts等,在建立Ports的时候需要选择对应的接口,这样在系统连接的时候就能根据同一接口下的两个P/Rport进行连接,并且在Runnables中就可以根据接口中VDP或者CSO的添加Access Points以及Server Call Points。下图建立一个S/R类型的RPorts,他会包含VDP,用于在两个组件间传递数据关系。

下图在建立一个C/S类型的Rports,接口包含CSO,用于提供服务(函数)的调用关系。

最后,建立一个C/S类型的Pports,后边我们需要实现这个服务,供别人调用。

Port的名称可以根据表意需要进行修改。 


组件运行实体 

组件运行实体可以完成一对多的访问多个接口的VDP或者CSO的访问。

下面首先建立第一个运行实体,完成对之前建立Rport的VDP读取。

要完成对之前建立Rport的VDP读取,还需要添加Access Points。添加时,每一个接口下边的VDP都有一下三种不同的添加方法:DataReadAccess、DataReceivePointByArguments和DataReceivePointByValues。

要理解这三种访问的不同,我们先回顾一下AUTOSAR对显性和隐性访问的区别。隐性方式不直接操作数据,在进入runnable之前RTE为数据建立副本(Rte_Rx_xxx),在runnable运行结束之后RTE把副本数据拷贝到实际数据(Rte_ImplicitBufs.isa_CoreX_XX.Rte_CoreX_OsTask_ASW_XXms.sbufXXX.value)中。而显性方式直接访问数据(Rte_ImplicitBufs.isa_CoreX_XX.Rte_CoreX_OsTask_ASW_XXms.sbufXXX.value)。隐性方式适用于有一致性要求的数据组,显性方式适用于实时性要求高的数据。

DataReadAccess这种数据访问方式会直接访问实际数据,RTE生成的宏定义直接对应实际数据。DataReceivePointByArguments与DataReceivePointByValues则同属于隐形方式,不同的是DataReceivePointByArguments访问方式需要传递一个变量地址,RTE将数据回填到这个地址下的变量,DataReceivePointByValues访问方式为宏定义直接对应副本数据(Rte_Rx_xxx)。

我们再建立一个运行实体,用于调用之前建立的Rport中的CSO。建立的方式一般分为同步调用和异步调用,我们一般选择同步调用。这里简单回顾一下他们的区别:在同步通信中,输入和输出可以同时存在。而在异步通信中,调用Rte_Call时,输出参数应该被省略,需要使用Rte_Result来获取输出结果。

最后,我们再建立一个运行实体,用于再Events中跟C/S类型的Pports进行绑定。


组件事件 

所有的Runnables都需要对应一种事件,我们首先新建两个TimingEvent,把刚才访问数据与调用接口的两个Runnable与一个1秒周期事件绑定。

然后我们新建一个OperationinvokedEvent事件,并将刚才建立的C/S类型的Pports中的名称为Start的CSO进行绑定。


组件代码生成

右键组件,选择生成代码如下图。

选择一个.C文件对应一个组件所有Runnables,也可以一个Runnables对应一个.C文件。

 选择生成目录以及填写文件名称。

最终生成的代码如下。用户可以在这个模板基础上,根据获取的数据进行逻辑判断运算,并输出数据,也可以通过不同的参数调用别的SWC提供的函数,或者提供根据不同入参执行不同逻辑的函数原型供别人调用。

/* ****************************************************************************** BEGIN: Banner*-----------------------------------------------------------------------------*                                 ETAS GmbH*                      D-70469 Stuttgart, Borsigstr. 14*-----------------------------------------------------------------------------*    Administrative Information (automatically filled in by ISOLAR)         *-----------------------------------------------------------------------------* Name: * Description:* Version: 1.0*-----------------------------------------------------------------------------* END: Banner******************************************************************************* Project : TestCsdn* Component: /Test3/Test3* Runnable : All Runnables in SwComponent****************************************************************************** Tool Version: ISOLAR-AB 4.0.2* Author: geekl* Date : 星期六 一月 11 18:20:13 2025****************************************************************************/#include "Rte_Test3.h"/*PROTECTED REGION ID(FileHeaderUserDefinedIncludes :RunnableEntity_77_func) ENABLED START */
/* Start of user defined includes  - Do not remove this comment */
/* End of user defined includes - Do not remove this comment */
/*PROTECTED REGION END *//*PROTECTED REGION ID(FileHeaderUserDefinedConstants :RunnableEntity_77_func) ENABLED START */
/* Start of user defined constant definitions - Do not remove this comment */
/* End of user defined constant definitions - Do not remove this comment */
/*PROTECTED REGION END *//*PROTECTED REGION ID(FileHeaderUserDefinedVariables :RunnableEntity_77_func) ENABLED START */
/* Start of user variable defintions - Do not remove this comment  */
/* End of user variable defintions - Do not remove this comment  */
/*PROTECTED REGION END */
#define Test3_START_SEC_CODE                   
#include "Test3_MemMap.h"
FUNC (void, Test3_CODE) RunnableEntity_77_func/* return value & FctID */
(void
)
{EcuM_ShutdownTargetType shutdownTarget1;EcuM_ShutdownModeType shutdownMode2;Std_ReturnType syncCall1;/* Local Data Declaration *//*PROTECTED REGION ID(UserVariables :RunnableEntity_77_func) ENABLED START *//* Start of user variable defintions - Do not remove this comment  *//* End of user variable defintions - Do not remove this comment  *//*PROTECTED REGION END */Std_ReturnType retValue = RTE_E_OK;/*  -------------------------------------- Data Read -----------------------------------------  *//*  -------------------------------------- Server Call Point  --------------------------------  */syncCall1 = Rte_Call_RPortPrototype_1_GetLastShutdownTarget(&shutdownTarget1,&shutdownMode2);/*  -------------------------------------- CDATA ---------------------------------------------  *//*  -------------------------------------- Data Write ----------------------------------------  *//*  -------------------------------------- Trigger Interface ---------------------------------  *//*  -------------------------------------- Mode Management -----------------------------------  *//*  -------------------------------------- Port Handling -------------------------------------  *//*  -------------------------------------- Exclusive Area ------------------------------------  *//*  -------------------------------------- Multiple Instantiation ----------------------------  *//*PROTECTED REGION ID(User Logic :RunnableEntity_77_func) ENABLED START *//* Start of user code - Do not remove this comment *//* End of user code - Do not remove this comment *//*PROTECTED REGION END */}#define Test3_STOP_SEC_CODE                       
#include "Test3_MemMap.h"
#define Test3_START_SEC_CODE                   
#include "Test3_MemMap.h"
FUNC (Std_ReturnType, AUTOMATIC) RunnableEntity_F001_func/* return value & FctID */
(VAR(Dcm_OpStatusType, AUTOMATIC) OpStatus,CONSTP2VAR(Dcm_StartDataOut_DcmDspRoutine_F001_DcmDspStartRoutineOutSignalType, AUTOMATIC, RTE_APPL_DATA) DataOut_DcmDspStartRoutineOutSignal,CONSTP2VAR(Dcm_NegativeResponseCodeType, AUTOMATIC, RTE_APPL_DATA) ErrorCode
)
{/* Local Data Declaration *//*PROTECTED REGION ID(UserVariables :RunnableEntity_F001_func) ENABLED START *//* Start of user variable defintions - Do not remove this comment  *//* End of user variable defintions - Do not remove this comment  *//*PROTECTED REGION END */Std_ReturnType retValue = RTE_E_OK;/*  -------------------------------------- Data Read -----------------------------------------  *//*  -------------------------------------- Server Call Point  --------------------------------  *//*  -------------------------------------- CDATA ---------------------------------------------  *//*  -------------------------------------- Data Write ----------------------------------------  *//*  -------------------------------------- Trigger Interface ---------------------------------  *//*  -------------------------------------- Mode Management -----------------------------------  *//*  -------------------------------------- Port Handling -------------------------------------  *//*  -------------------------------------- Exclusive Area ------------------------------------  *//*  -------------------------------------- Multiple Instantiation ----------------------------  *//*PROTECTED REGION ID(User Logic :RunnableEntity_F001_func) ENABLED START *//* Start of user code - Do not remove this comment *//* End of user code - Do not remove this comment *//*PROTECTED REGION END */}#define Test3_STOP_SEC_CODE                       
#include "Test3_MemMap.h"
#define Test3_START_SEC_CODE                   
#include "Test3_MemMap.h"
FUNC (void, Test3_CODE) RunnableEntity_88_func/* return value & FctID */
(void
)
{boolean iRead1;/* Local Data Declaration *//*PROTECTED REGION ID(UserVariables :RunnableEntity_88_func) ENABLED START *//* Start of user variable defintions - Do not remove this comment  *//* End of user variable defintions - Do not remove this comment  *//*PROTECTED REGION END */Std_ReturnType retValue = RTE_E_OK;/*  -------------------------------------- Data Read -----------------------------------------  */iRead1 = Rte_IRead_RunnableEntity_88_RPortPrototype_0_VDP_boolean();/*  -------------------------------------- Server Call Point  --------------------------------  *//*  -------------------------------------- CDATA ---------------------------------------------  *//*  -------------------------------------- Data Write ----------------------------------------  *//*  -------------------------------------- Trigger Interface ---------------------------------  *//*  -------------------------------------- Mode Management -----------------------------------  *//*  -------------------------------------- Port Handling -------------------------------------  *//*  -------------------------------------- Exclusive Area ------------------------------------  *//*  -------------------------------------- Multiple Instantiation ----------------------------  *//*PROTECTED REGION ID(User Logic :RunnableEntity_88_func) ENABLED START *//* Start of user code - Do not remove this comment *//* End of user code - Do not remove this comment *//*PROTECTED REGION END */}

基础软件常用“代理”SWC

 基础软件建立SWC的需要,主要来自于以下三个方面:

  1. 首先就是loAbstraction和CDD的需要,前者需要建立的是Ecu Abstraction的SWC,它为ECU内部的IO资源提供抽象,供其他应用SWC使用;而后者需要建立的是Complex Device Driver 的SWC,它为片外的芯片驱动功能提供抽象,提供Port口以让其他SWC使用片外芯片功能 。这两种“代理”SWC都是符合AUTOSAR架构的,往往都是必须的,涉及的“手写代码”仅要求能够正确使用CDD和ECU驱动对外API即可。
  2. 其次就是为某些基础软件做一些必要的扩展,比如常见的针对诊断,我们需要实现软/硬复位以及跳转到Bootloader的实现,还包括例Routines的实现等等,这些也往往都是必须的,涉及的“手写代码”往往相对简单。
  3. 最后是那些因为项目上进度或者人员配置的特殊性,实现的诸如Tbox协议等特殊协议适配,或是针对某些基础软件组件做一些功能扩展或者“补丁”,诸如通信或硬件状态管理等。这部分往往会跟着不同的项目,有所差异,且需要“手写”逻辑代码。

下图是一个项目涉及中基础软件涉及的常用“代理”SWC脑图。

因为这些SWC往往会根据不同的项目有很大的不同,下面我们针对这些常见的SWC进行一些概括性的分析。


CDD 

CDD对应的SWC在ISOLAR中以Complex_Device_Driver_Sw_Component_Type建立。它主要包含C/S与S/R类型的Pports。前者用于应用层组件使用复杂驱动的APIs控制片外板载芯片完成动作,例如驱动高驱开关打开/关闭,抑或是驱动射频完成无线信号发射;后者则向应用层传递当前片外板载芯片采集的信息,诸如六轴加速度(若应用层需要实时获取采集信息,则还是使用C/S类型的Pports,需要使用ADP为OUT,这样采集的信息可以回填到调用函数传入的不同数据类型的指针中)。这里组件涉及的API仅仅是用于与应用层在实现ECU功能相关的API,有很多CDD甚至都不需要与应用层有交集,诸如电源芯片或者收发器的复杂驱动。(PS. 这里针对获取传感器的组件也可以专门建立类型为Sensor_Actuator_Sw_Component_Type来区分)。


IOAbstraction

IOAbstraction对应的SWC在ISOLAR中以Ecu_Abstraction_Sw_Component_Type建立。它同样主要包含C/S Pports。主要用于对板子内部的GPIO、PWM、ADC、ICU等芯片的IO口进行控制和信息读取,控制时接口内包含的ADP为IN,采集时ADP为OUT(对实时采集要求不高的也可以使用S/R类型的Pports周期往应用层传)。这块各个项目都比较常见,就不赘述了。


Diagnosis

Diagnosis对应的SWC在ISOLAR中以应用软件组件创建即可,其内容主要包括:

  • DCM的软/硬重启,JumpToBootloader等状态API实现。
  • 各个DcmDspRoutine的API实现。
  • DcmDspDataReadFnc与DcmDspDataWriteFnc等Did相关函数实现。
  • DEM故障事件SetEventStatus调用。
  • DcmDspSecurityCompareKeyFnc与DcmDspSecurityGetSeedFnc等安全等级相关函数实现。

State_Management

State_Management对应的SWC在ISOLAR中以应用软件组件创建即可,其内容主要包括:

  • 休眠唤醒相关状态管理:休眠部分根据应用层传入的标志位与唤醒源进行综合判断,确定进入唤醒之后进行通知BswM走休眠流程。唤醒部分若硬件实现则不需要软件接入,若软件实现(Polling模式)则休眠流程会最终走到循环判断唤醒源代码处,若唤醒源有效则通知BswM走唤醒流程。
  • 指示灯管理:根据当前软硬件状态,控制板载指示灯进行不同频率的闪烁,方便做目测故障排查。
  • 通信管理
    • CAN节点丢失:根据报节点中对应报文中信号的ComTimeoutNotification来判断节点是否丢失,需要根据丢失的次数与丢失与恢复时间阈值判断CAN节点状态。
    • CAN通道状态通知:从CanSM中获取通道BussOff状态,并向上位机通知。
  • 硬件状态管理:管理片内IP核与片外芯片状态机,完成故障上报与故障尝试恢复功能,并回读接插件部分引脚状态做故障管理。
  • 软件状态管理:管理当前MCU使用率以及任务执行耗时情况,管理当前软件状态,并在出现死机等异常时保护现场至预留的存储区。

Memory_Management

Memory_Management对应的SWC在ISOLAR中以应用软件组件创建即可,第一需要完成NvM_Block的读写操作,避免应用层在运行期间对Flash的频繁操作。第二需要完成基于FlashLoader等Dflash驱动对Dflash按照需要进行读写操作,完成参数的安全存储与读取。


XXX_Protocol

基于COM传上来的信号内容,完成对手件私有协议的适配,包括鉴权等工作,然后将有效信息传递给应用层,然后根据应用层下发的信息,进行私有协议的适配,然后再通过COM发送出去。


XXX_Supplemented

这里就涉及到一些组件的“补丁”工作。例如有的时候导入的DBC计算方法失效,就不直接把COM上的系统信号与应用层进行连接,而是做个SWC先把系统信号接过来,做了特殊的计算方法之后再上传到应用层。又诸如诊断不是在这个CAN通道做的,但是想实现读取VIN码的功能,可以在这个CAN通道上将诊断报文接过来进行相应的处理和响应(涉及到接到请求,然后发送首帧,接到流控帧,然后发送连续帧的过程实现)


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

相关文章:

【AUTOSAR 基础软件】软件组件的建立与使用(“代理”SWC)

基础软件往往需要建立一些“代理”SWC来完成一些驱动的抽象工作&#xff08;Complex_Device_Driver_Sw或者Ecu_Abstraction_Sw等&#xff09;&#xff0c;或建立Application Sw Component来补齐基础软件需要提供的功能实现。当面对具体的项目时&#xff0c;基础软件开发人员还可…...

java通过ocr实现识别pdf中的文字

需求&#xff1a;识别pdf文件中的中文 根据github项目mymonstercat 改造,先将pdf文件转为png文件存于临时文件夹&#xff0c;然后通过RapidOcr转为文字,最后删除临时文件夹 1、引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId&g…...

Git 命令代码管理详解

一、Git 初相识&#xff1a;版本控制的神器 在当今的软件开发领域&#xff0c;版本控制如同基石般重要&#xff0c;而 Git 无疑是其中最耀眼的明珠。它由 Linus Torvalds 在 2005 年创造&#xff0c;最初是为了更好地管理 Linux 内核源代码。随着时间的推移&#xff0c;Git 凭借…...

Docker的安装和使用

容器技术 容器与虚拟机的区别 虚拟机 (VM) VM包含完整的操作系统&#xff0c;并在虚拟化层之上运行多个操作系统实例。 VM需要更多的系统资源&#xff08;CPU、内存、存储&#xff09;来管理这些操作系统实例。 容器 (Container) 容器共享主机操作系统的内核&#xff0c;具…...

Flink系统知识讲解之:Flink内存管理详解

Flink系统知识讲解之&#xff1a;Flink内存管理详解 在现阶段&#xff0c;大部分开源的大数据计算引擎都是用Java或者是基于JVM的编程语言实现的&#xff0c;如Apache Hadoop、Apache Spark、Apache Drill、Apache Flink等。Java语言的好处是不用考虑底层&#xff0c;降低了程…...

使用JMeter模拟多IP发送请求!

你是否曾遇到过这样的场景&#xff1a;使用 JMeter 进行压力测试时&#xff0c;单一 IP 被服务器限流或者屏蔽&#xff1f;这时&#xff0c;如何让 JMeter 模拟多个 IP 发送请求&#xff0c;成功突破测试限制&#xff0c;成为测试工程师必须攻克的难题。今天&#xff0c;我们就…...

【Ubuntu与Linux操作系统:六、软件包管理】

第6章 软件包管理 6.1 Linux软件安装基础 Linux的软件包是以二进制或源码形式发布的程序集合&#xff0c;包含程序文件和元数据。软件包管理器是Linux系统的重要工具&#xff0c;用于安装、更新和卸载软件。 1. 常见的软件包管理器&#xff1a; DEB 系统&#xff08;如Ubunt…...

【数据结构-堆】力扣1834. 单线程 CPU

给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列&#xff0c;需要 processingTimei 的时长完成执行。 现…...

【前端动效】原生js实现拖拽排课效果

目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示&#xff0c;页面左侧有一个包含不同课程&#xff08;如语文、数学等&#xff09;的列表&#xff0c;页面右侧…...

C#使用OpenTK绘制3D可拖动旋转图形三棱锥

接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…...

排序的本质、数据类型及算法选择

排序的本质、数据类型及算法选择 一、排序的本质二、排序的数据类型三、排序算法的选择依据 前两天老金写了篇 “十大排序简介”&#xff0c;有点意犹未尽&#xff0c;这一回老金想把排序连根拔起&#xff0c;从排序的本质说道说道。 一、排序的本质 从字面上理解&#xff0c…...

Python的列表基础知识点(超详细流程)

目录 一、环境搭建 二、列表 2.1 详情 2.2 列表定义 2.3 列表长度 2.4 列表索引 2.5 切片索引 2.6 添加 2.7 插入 2.8 剔除 2.8.1 pop方法 2.8.2 del方法 2.9 任何数据类型 2.10 拼接 2.10.1 “” 2.10.2 “*” 2.11 逆序 ​编辑 2.12 计算出现次数 2.13 排序…...

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现 最近在学习鸿蒙开发过程中&#xff0c;阅读了官方文档&#xff0c;在之前做flutter时候&#xff0c;经常使用overlay&#xff0c;使用OverlayEntry加入到overlayState来做添加悬浮按钮、提示弹窗、加载中指示器、加载失败的t…...

【Ubuntu与Linux操作系统:一、Ubuntu安装与基本使用】

第1章 Ubuntu安装与基本使用 1.1 Linux与Ubuntu Linux是一种开源、类Unix操作系统内核&#xff0c;拥有高稳定性和强大的网络功能。由于其开源性和灵活性&#xff0c;Linux被广泛应用于服务器、嵌入式设备以及桌面环境中。 Ubuntu是基于Debian的一个流行Linux发行版&#xf…...

React 元素渲染

React 元素渲染 React 是一个用于构建用户界面的 JavaScript 库&#xff0c;它允许开发人员创建大型应用程序&#xff0c;这些应用程序可以随着时间的推移而高效地更新和渲染。React 的核心概念之一是元素渲染&#xff0c;它描述了如何将 JavaScript 对象转换为 DOM&#xff0…...

【2024年华为OD机试】 (C卷,100分)- 括号匹配(Java JS PythonC/C++)

一、问题描述 题目描述 给定一个字符串&#xff0c;里边可能包含“()”、“[]”、“{}”三种括号&#xff0c;请编写程序检查该字符串中的括号是否成对出现&#xff0c;且嵌套关系正确。 若括号成对出现且嵌套关系正确&#xff0c;或该字符串中无括号字符&#xff0c;输出&am…...

解锁企业数字化转型新力量:OpenCoze(开源扣子)

在当今数字化浪潮席卷之下&#xff0c;企业对于高效管理和协同运作的需求愈发迫切&#xff0c;而开源技术正逐渐成为众多企业破局的关键利器。今天&#xff0c;想给大家介绍一款极具潜力的开源项目 ——OpenCoze&#xff0c;中文名称 “开源扣子”。 一、OpenCoze 是什么&…...

【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论和实操考试题解析

文章目录 选择题答案及解析理论题答案及解析实操题答案及解析下一步进阶 选择题答案及解析 RIP路由协议是基于哪种算法的动态路由协议&#xff1f; 答案&#xff1a;B. 距离矢量算法解析&#xff1a;链路状态算法用于OSPF等协议&#xff1b;最小生成树算法主要用于生成树协议&…...

【微服务】8、分布式事务 ( XA 和 AT )

文章目录 利用Seata解决分布式事务问题&#xff08;XA模式&#xff09;AT模式1. AT模式原理引入2. AT模式执行流程与XA模式对比3. AT模式性能优势及潜在问题4. AT模式数据一致性解决方案5. AT模式一阶段操作总结6. AT模式二阶段操作分析7. AT模式整体特点8. AT模式与XA模式对比…...

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞&#xff0c;该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777&#xff0c;CVSS 评分为 9.8&#xff0c;表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装&#xff0c;为全球无数捐赠平…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...