AUTOSAR进阶图解==>AUTOSAR_SWS_PDURouter

AUTOSAR PDU Router详解文档

AUTOSAR通信架构中的核心路由模块

目录

  • 1. 概述
  • 2. PDU Router模块架构
  • 3. PDU Router配置模型
  • 4. PDU Router路由流程
  • 5. PDU Router状态机
  • 6. 总结

1. 概述

PDU Router模块是AUTOSAR通信架构中的核心组件,负责在AUTOSAR软件组件之间路由I-PDU(Interaction Layer Protocol Data Units)。该模块提供了灵活的I-PDU转发机制,支持多种路由模式,包括单播、多播和网关功能。

1.1 PDU Router的作用

根据源文档描述,PDU Router模块主要提供以下功能:

  • I-PDU路由转发:基于静态配置的路由表,将I-PDU从源模块转发到目标模块
  • 网关功能:支持不同通信接口之间的I-PDU转发,实现网络间通信
  • 多播支持:支持1:n路由,将单个I-PDU转发到多个目标模块
  • 缓冲区管理:提供FIFO和Last-is-best两种缓冲策略
  • 传输协议支持:支持CAN、FlexRay、LIN等传输协议模块的网关功能

1.2 核心特性

  • 静态配置:路由路径基于静态配置表,不支持动态路由
  • 通用接口:采用通用接口设计,支持任意上层和下层模块组合
  • 后构建支持:支持后构建可加载和可选择配置
  • 错误处理:提供完整的错误检测和报告机制

2. PDU Router模块架构

PDU Router模块在AUTOSAR通信架构中位于中间层,连接上层应用模块和下层通信接口模块。

在这里插入图片描述

图2-1:PDU Router模块在AUTOSAR通信架构中的位置和关系

2.1 架构层次

应用层

  • COM模块:通信管理模块,负责信号和I-PDU的转换
  • DCM模块:诊断通信管理模块,处理诊断请求和响应
  • IPduM模块:I-PDU复用器,支持I-PDU的动态复用
  • DLT模块:数据链路测试模块,提供通信测试功能

PDU Router模块

  • PDU Router引擎:核心路由引擎,执行I-PDU的路由决策和转发
  • 路由路径表:静态配置的路由规则表,定义I-PDU的路由路径
  • 缓冲区管理:管理I-PDU的缓冲存储,支持FIFO和Last-is-best策略

通信接口层

  • CAN接口(CanIf):CAN总线接口模块
  • FlexRay接口(FrIf):FlexRay总线接口模块
  • LIN接口(LinIf):LIN总线接口模块
  • 以太网接口(EthIf):以太网接口模块

传输协议层

  • CAN传输协议(CanTp):CAN总线传输协议模块
  • FlexRay传输协议(FrTp):FlexRay传输协议模块
  • LIN传输协议(LinTp):LIN传输协议模块
  • J1939传输协议(J1939Tp):J1939协议模块

2.2 接口关系

PDU Router模块通过以下接口与上下层模块交互:

  • 上层接口:提供PduR_<User:Up>TransmitPduR_<User:Up>CancelTransmit等API
  • 下层接口:提供PduR_<User:Lo>RxIndicationPduR_<User:Lo>TxConfirmation等API
  • 传输协议接口:提供PduR_<User:LoTp>StartOfReceptionPduR_<User:LoTp>CopyRxData等API

2.3 代码示例

/* PDU Router模块初始化示例 */
Std_ReturnType PduR_Init(const PduR_PBConfigType* ConfigPtr)
{Std_ReturnType result = E_OK;/* 参数检查 */if (ConfigPtr == NULL) {DET_ReportError(PDUR_MODULE_ID, 0, PDUR_INIT_SID, PDUR_E_PARAM_POINTER);return E_NOT_OK;}/* 初始化路由路径表 */result = PduR_Internal_InitRoutingTable(ConfigPtr);if (result != E_OK) {return E_NOT_OK;}/* 初始化缓冲区管理器 */result = PduR_Internal_InitBufferManager(ConfigPtr);if (result != E_OK) {return E_NOT_OK;}/* 设置模块状态为在线 */PduR_Internal_SetModuleState(PDUR_ONLINE);return E_OK;
}/* 上层模块传输请求示例 */
Std_ReturnType PduR_ComTransmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr)
{Std_ReturnType result = E_OK;PduR_RoutingPathType* routingPath;/* 参数检查 */if (PduInfoPtr == NULL) {DET_ReportError(PDUR_MODULE_ID, 0, PDUR_COM_TRANSMIT_SID, PDUR_E_PARAM_POINTER);return E_NOT_OK;}/* 查找路由路径 */routingPath = PduR_Internal_GetRoutingPath(TxPduId);if (routingPath == NULL) {DET_ReportError(PDUR_MODULE_ID, 0, PDUR_COM_TRANSMIT_SID, PDUR_E_PDU_ID_INVALID);return E_NOT_OK;}/* 执行路由转发 */result = PduR_Internal_ForwardToDestinations(routingPath, PduInfoPtr);return result;
}

3. PDU Router配置模型

PDU Router模块的配置采用层次化的数据结构,支持灵活的模块配置和路由规则定义。

图3-1:PDU Router配置模型的数据结构关系

3.1 主要配置类

PduR_PBConfigType

  • 功能:PDU Router模块的主配置类,包含所有配置数据
  • 关键属性
    • PduRBswModules[]:BSW模块配置数组
    • PduRGeneral:通用配置参数
    • PduRRoutingPathGroups[]:路由路径组配置
    • PduRRoutingPaths[]:路由路径配置
    • PduRSrcPdus[]:源PDU配置
    • PduRDestPdus[]:目标PDU配置
    • PduRTxBuffers[]:传输缓冲区配置
    • PduRDefaultValues[]:默认值配置

PduRGeneralType

  • 功能:PDU Router模块的通用配置参数
  • 关键属性
    • PduRDevErrorDetect:开发错误检测开关
    • PduRVersionInfoApi:版本信息API开关
    • PduRMaxRoutingPathCnt:最大路由路径数量
    • PduRMaxTxBufferCnt:最大传输缓冲区数量
    • PduRMaxRoutingPathGroupCnt:最大路由路径组数量

3.2 路由配置类

PduRRoutingPathType

  • 功能:定义单个I-PDU的路由规则
  • 关键属性
    • PduRRoutingPathId:路由路径唯一标识符
    • PduRSrcPduRef:源PDU引用
    • PduRDestPduRefs[]:目标PDU引用数组
    • PduRDestTxBufferRef:目标传输缓冲区引用
    • PduRTpThreshold:传输协议阈值
    • PduRMaxPduLength:最大PDU长度
    • PduRBufferAllocation:缓冲区分配策略

PduRRoutingPathGroupType

  • 功能:路由路径组配置,用于批量管理路由路径
  • 关键属性
    • PduRRoutingPathGroupId:路由路径组标识符
    • PduRRoutingPathGroupRefs[]:路由路径引用数组
    • PduRGroupEnableAtInit:初始化时启用标志

3.3 缓冲区配置类

PduRTxBufferType

  • 功能:传输缓冲区配置,用于存储待传输的I-PDU
  • 关键属性
    • PduRTxBufferId:缓冲区唯一标识符
    • PduRTxBufferSize:缓冲区大小
    • PduRTxBufferRef:缓冲区内存引用
    • PduRTxBufferAllocation:缓冲区分配方式

3.4 代码示例

/* PDU Router配置结构定义 */
typedef struct {PduRBswModuleType* PduRBswModules;PduRGeneralType PduRGeneral;PduRRoutingPathGroupType* PduRRoutingPathGroups;PduRRoutingPathType* PduRRoutingPaths;PduRSrcPduType* PduRSrcPdus;PduRDestPduType* PduRDestPdus;PduRTxBufferType* PduRTxBuffers;PduRDefaultValueType* PduRDefaultValues;
} PduR_PBConfigType;/* 路由路径配置结构 */
typedef struct {uint16 PduRRoutingPathId;PduRSrcPduType* PduRSrcPduRef;PduRDestPduType** PduRDestPduRefs;PduRTxBufferType* PduRDestTxBufferRef;uint16 PduRTpThreshold;uint16 PduRMaxPduLength;PduR_BufferAllocationType PduRBufferAllocation;
} PduRRoutingPathType;/* 配置初始化示例 */
void PduR_InitializeConfiguration(PduR_PBConfigType* config)
{/* 初始化通用配置 */config->PduRGeneral.PduRDevErrorDetect = TRUE;config->PduRGeneral.PduRVersionInfoApi = TRUE;config->PduRGeneral.PduRMaxRoutingPathCnt = 100;config->PduRGeneral.PduRMaxTxBufferCnt = 50;config->PduRGeneral.PduRMaxRoutingPathGroupCnt = 10;/* 初始化路由路径 */for (int i = 0; i < config->PduRGeneral.PduRMaxRoutingPathCnt; i++) {config->PduRRoutingPaths[i].PduRRoutingPathId = i;config->PduRRoutingPaths[i].PduRTpThreshold = 0;config->PduRRoutingPaths[i].PduRMaxPduLength = 4095;config->PduRRoutingPaths[i].PduRBufferAllocation = PDUR_BUFFER_ALLOCATION_DEDICATED;}/* 初始化传输缓冲区 */for (int i = 0; i < config->PduRGeneral.PduRMaxTxBufferCnt; i++) {config->PduRTxBuffers[i].PduRTxBufferId = i;config->PduRTxBuffers[i].PduRTxBufferSize = 4095;config->PduRTxBuffers[i].PduRTxBufferAllocation = PDUR_BUFFER_ALLOCATION_STATIC;}
}

4. PDU Router路由流程

PDU Router模块支持多种路由场景,包括上层模块发送、通信接口网关和传输协议网关等。

在这里插入图片描述

图4-1:PDU Router模块的路由流程和交互序列

4.1 上层模块发送I-PDU流程

场景描述:COM模块向多个目标模块发送I-PDU,实现1:n路由

参与者

  • COM模块:上层应用模块,发起I-PDU传输请求
  • PDU Router引擎:核心路由引擎,处理路由决策和转发
  • 路由路径表:静态配置的路由规则表
  • 缓冲区管理:管理I-PDU的缓冲存储
  • CAN接口、FlexRay接口:下层通信接口模块

流程步骤

  1. 传输请求:COM模块调用PduR_ComTransmit发起传输请求
  2. 路由查询:PDU Router引擎查询路由路径表,获取目标模块列表
  3. 数据提供方式判断
    • 直接数据提供:立即调用目标模块的传输接口
    • 触发传输数据提供:先存储数据,等待目标模块请求

4.2 通信接口网关流程

场景描述:CAN接口接收I-PDU并转发到FlexRay接口,实现网关功能

参与者

  • CAN接口:源通信接口,接收I-PDU
  • PDU Router引擎:执行网关转发逻辑
  • FlexRay接口:目标通信接口,发送I-PDU

流程步骤

  1. 接收指示:CAN接口调用PduR_CanIfRxIndication通知PDU Router
  2. 目标查询:PDU Router引擎查询路由路径,确定目标模块
  3. 转发处理
    • 直接转发:立即调用目标接口的传输函数
    • FIFO缓冲:存储到FIFO队列,等待目标模块请求

4.3 传输协议网关流程

场景描述:CAN传输协议接收多帧数据并转发到FlexRay传输协议

参与者

  • CAN传输协议:源传输协议模块
  • PDU Router引擎:管理TP网关逻辑
  • FlexRay传输协议:目标传输协议模块

流程步骤

  1. 开始接收:CAN传输协议调用PduR_CanTpStartOfReception开始接收
  2. 路由查询:PDU Router引擎查询路由路径,确定目标TP模块
  3. 网关模式选择
    • 直接网关:等待完整接收后开始传输
    • 网关on-the-fly:达到阈值后开始传输

4.4 代码示例

/* 上层模块传输处理示例 */
Std_ReturnType PduR_Internal_ForwardToDestinations(PduR_RoutingPathType* routingPath, const PduInfoType* pduInfo)
{Std_ReturnType result = E_OK;uint8 destCount = 0;PduRDestPduType* destPdu;/* 遍历所有目标PDU */while ((destPdu = routingPath->PduRDestPduRefs[destCount]) != NULL) {/* 根据数据提供方式处理 */if (destPdu->PduRDestPduDataProvision == PDUR_DIRECT) {/* 直接数据提供 */result = PduR_Internal_TransmitDirect(destPdu, pduInfo);} else {/* 触发传输数据提供 */result = PduR_Internal_StoreForTriggerTransmit(destPdu, pduInfo);}if (result != E_OK) {/* 处理传输失败 */DET_ReportError(PDUR_MODULE_ID, 0, PDUR_FORWARD_SID, PDUR_E_TRANSMIT_FAILED);}destCount++;}return result;
}/* 通信接口接收处理示例 */
void PduR_CanIfRxIndication(PduIdType RxPduId, const PduInfoType* PduInfoPtr)
{PduR_RoutingPathType* routingPath;Std_ReturnType result = E_OK;/* 查找路由路径 */routingPath = PduR_Internal_GetRoutingPath(RxPduId);if (routingPath == NULL) {/* 无路由路径,丢弃I-PDU */return;}/* 执行网关转发 */result = PduR_Internal_GatewayForward(routingPath, PduInfoPtr);if (result != E_OK) {/* 处理网关失败 */DET_ReportError(PDUR_MODULE_ID, 0, PDUR_GATEWAY_SID, PDUR_E_GATEWAY_FAILED);}
}/* 传输协议网关处理示例 */
BufReq_ReturnType PduR_CanTpStartOfReception(PduIdType RxPduId, PduLengthType TpSduLength,PduLengthType* RxBufferSizePtr)
{PduR_RoutingPathType* routingPath;BufReq_ReturnType result = BUFREQ_OK;/* 查找路由路径 */routingPath = PduR_Internal_GetRoutingPath(RxPduId);if (routingPath == NULL) {return BUFREQ_E_NOT_OK;}/* 分配缓冲区 */result = PduR_Internal_AllocateBuffer(routingPath, TpSduLength, RxBufferSizePtr);if (result == BUFREQ_OK) {/* 开始目标TP传输 */PduR_Internal_StartDestinationTpTransmit(routingPath, TpSduLength);}return result;
}

5. PDU Router状态机

PDU Router模块采用状态机设计,管理模块的生命周期和运行状态。

在这里插入图片描述

图5-1:PDU Router模块的状态转换和生命周期管理

5.1 主要状态

未初始化状态(Uninitialized)

  • 含义:模块尚未初始化,无法提供任何服务
  • 特征
    • 所有内部数据结构未初始化
    • 路由路径表为空
    • 缓冲区管理器未就绪
  • 进入条件:系统启动时
  • 退出条件:调用PduR_Init函数成功初始化

在线运行状态(Online)

  • 含义:模块正常运行,提供完整的路由服务
  • 特征
    • 支持所有PDU Router功能
    • 处理I-PDU路由和网关
    • 支持管理操作
    • 错误检测和处理

5.2 子状态

空闲状态(Idle)

  • 含义:等待处理请求的状态
  • 特征
    • 等待I-PDU传输请求
    • 等待接收指示
    • 等待管理API调用

路由处理状态(Routing)

  • 含义:处理I-PDU路由转发
  • 特征
    • 支持1:1, 1:n, n:1路由
    • 直接数据提供和触发传输
    • 多播支持
    • 传输确认处理

网关处理状态(Gateway)

  • 含义:处理通信接口间网关
  • 特征
    • 通信接口间网关
    • FIFO缓冲支持
    • 直接转发和缓冲转发
    • 错误处理

TP网关处理状态(TPGateway)

  • 含义:处理传输协议间网关
  • 特征
    • 传输协议间网关
    • 支持直接网关和on-the-fly
    • 缓冲区动态分配
    • 阈值控制传输

5.3 状态转换

初始化转换

  • UninitializedOnline:初始化完成
  • OnlineOffline:系统关闭或错误
  • OfflineUninitialized:重新初始化

运行状态转换

  • IdleRouting:收到传输请求
  • IdleGateway:收到接收指示
  • IdleTPGateway:收到TP接收指示
  • IdleManagement:收到管理API调用

5.4 代码示例

/* PDU Router状态机实现 */
typedef enum {PDUR_STATE_UNINITIALIZED,PDUR_STATE_ONLINE,PDUR_STATE_OFFLINE
} PduR_ModuleStateType;typedef enum {PDUR_SUBSTATE_IDLE,PDUR_SUBSTATE_ROUTING,PDUR_SUBSTATE_GATEWAY,PDUR_SUBSTATE_TP_GATEWAY,PDUR_SUBSTATE_MANAGEMENT
} PduR_SubStateType;/* 状态机处理函数 */
void PduR_MainFunction(void)
{PduR_ModuleStateType currentState;PduR_SubStateType currentSubState;/* 获取当前状态 */currentState = PduR_Internal_GetModuleState();currentSubState = PduR_Internal_GetSubState();switch (currentState) {case PDUR_STATE_UNINITIALIZED:/* 未初始化状态,等待初始化 */break;case PDUR_STATE_ONLINE:/* 在线状态,处理子状态 */PduR_Internal_ProcessSubState(currentSubState);break;case PDUR_STATE_OFFLINE:/* 离线状态,等待重新初始化 */break;default:/* 错误状态处理 */DET_ReportError(PDUR_MODULE_ID, 0, PDUR_MAINFUNCTION_SID, PDUR_E_INVALID_STATE);break;}
}/* 子状态处理函数 */
void PduR_Internal_ProcessSubState(PduR_SubStateType subState)
{switch (subState) {case PDUR_SUBSTATE_IDLE:/* 空闲状态,检查是否有待处理请求 */if (PduR_Internal_HasTransmitRequest()) {PduR_Internal_SetSubState(PDUR_SUBSTATE_ROUTING);} else if (PduR_Internal_HasRxIndication()) {PduR_Internal_SetSubState(PDUR_SUBSTATE_GATEWAY);} else if (PduR_Internal_HasTpRxIndication()) {PduR_Internal_SetSubState(PDUR_SUBSTATE_TP_GATEWAY);}break;case PDUR_SUBSTATE_ROUTING:/* 路由处理状态 */PduR_Internal_ProcessRouting();PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);break;case PDUR_SUBSTATE_GATEWAY:/* 网关处理状态 */PduR_Internal_ProcessGateway();PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);break;case PDUR_SUBSTATE_TP_GATEWAY:/* TP网关处理状态 */PduR_Internal_ProcessTpGateway();PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);break;case PDUR_SUBSTATE_MANAGEMENT:/* 管理操作状态 */PduR_Internal_ProcessManagement();PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);break;default:/* 错误子状态处理 */DET_ReportError(PDUR_MODULE_ID, 0, PDUR_PROCESS_SUBSTATE_SID, PDUR_E_INVALID_SUBSTATE);PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);break;}
}/* 状态转换函数 */
void PduR_Internal_SetModuleState(PduR_ModuleStateType newState)
{PduR_ModuleStateType oldState = PduR_Internal_GetModuleState();/* 状态转换验证 */if (PduR_Internal_IsValidStateTransition(oldState, newState)) {PduR_Internal_ModuleState = newState;/* 状态转换后的处理 */switch (newState) {case PDUR_STATE_ONLINE:/* 进入在线状态,初始化子状态 */PduR_Internal_SetSubState(PDUR_SUBSTATE_IDLE);break;case PDUR_STATE_OFFLINE:/* 进入离线状态,清理资源 */PduR_Internal_CleanupResources();break;default:break;}} else {/* 无效状态转换 */DET_ReportError(PDUR_MODULE_ID, 0, PDUR_SET_STATE_SID, PDUR_E_INVALID_STATE_TRANSITION);}
}

6. 总结

PDU Router模块作为AUTOSAR通信架构的核心组件,提供了灵活、高效的I-PDU路由服务。通过静态配置的路由表和状态机设计,该模块能够满足各种复杂的通信需求。

6.1 主要优势

  • 通用性:支持任意上层和下层模块组合,适应不同的系统架构
  • 灵活性:支持多种路由模式,包括单播、多播和网关功能
  • 可靠性:提供完整的错误检测和处理机制
  • 可配置性:支持后构建可加载和可选择配置,便于系统优化

6.2 应用场景

  • 车载网络网关:实现不同总线系统间的数据转发
  • 诊断通信:支持诊断数据的路由和转发
  • 信号路由:实现应用层信号到通信接口的路由
  • 多播通信:支持一对多的数据广播

6.3 技术特点

  • 静态路由:基于配置表的路由决策,确保实时性能
  • 缓冲区管理:支持FIFO和Last-is-best两种缓冲策略
  • 传输协议支持:完整的TP模块网关功能
  • 错误处理:符合AUTOSAR标准的错误检测和报告

PDU Router模块的设计充分体现了AUTOSAR架构的模块化和标准化特点,为汽车电子系统的通信提供了可靠的基础设施。

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

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

相关文章

RHEL7.9、RHEL9.3——源码安装MySQL

目录 一、环境部署 1. 克隆rhel7.9虚拟机 二、源码安装MySQL 1. 准备工作 2. 源码部署mysql8.0.40 1&#xff09;安装编译mysql所需软件包 2&#xff09;编译安装mysql8.0.40 3&#xff09;生成启动脚本 一、环境部署 1. 克隆rhel7.9虚拟机 改名为 “RHEL79_mysql_master” 并…

解决Win11 安全中心删掉存在隐患的工具

打开设置&#xff0c; 找到Windows安全中心&#xff0c;找到病毒和威胁防护&#xff0c;选择排除项&#xff0c;点 添加或删除排除项添加文件&#xff0c;文件夹&#xff0c;工具按照自己需求选择。或&#xff0c;删除文件注意&#xff1a;隐患的工具或者文件安装或者用完&…

通过URI Scheme实现从Web网页上打开本地C++应用程序(以腾讯会议为例,附完整实现源码)

目录 1、需求描述 2、选择URI Scheme实现 3、何为URI Scheme&#xff1f; 4、将自定义的URL Scheme信息写入注册表的C源码实现 5、如何实现最开始的3种需求 6、后续需要考虑的细节问题 之前陆续收到一些从Web页面上启动我们C客户端软件的需求&#xff0c;希望我们能提供一…

机器学习02——模型评估与选择(过拟合与欠拟合、K折交叉验证、均方误差、混淆矩阵)

上一章&#xff1a;机器学习01——机器学习概述 下一章&#xff1a;机器学习03——线性模型 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、经验误差与过拟合&#xff08;一&a…

基于 Django 与 Bootstrap 构建的现代化设备管理平台

整体步骤概览 创建项目和应用设计模型&#xff08;Model&#xff09; - 定义设备的数据结构配置用户认证&#xff08;Auth&#xff09; - 使用 Django 自带的强大用户系统创建视图&#xff08;View&#xff09; - 处理业务逻辑&#xff1a;登录、列表、增删改查编写模板&#x…

微软依旧稳定发挥,Windows 最新更新性能「开倒车」

微软在前不久为Release Preview测试用户推送了最新Windows11 25H2版本。按照惯例&#xff0c;正式版将于9月或者10月与咱们见面。虽然看起来是个跨版本的大更新&#xff0c;但是更新方式将服务堆栈更新&#xff08;SSU&#xff09;与最新累积更新&#xff08;LCU&#xff09;。…

一手实测,文心x1.1的升级很惊喜啊

一手实测&#xff0c;文心x1.1的升级很惊喜啊 前言 月9日&#xff0c;在 WAVE SUMMIT深度学习开发者大会上 百度发布了一个新的思考模型文心x1.1&#xff1a; X1 Turbo 升级为 X1.1 了。 文心4.5 Turbo 和 X1 Turbo 是2025年4月25日发布的&#xff0c;距今已经半年过去了&…

Flask 核心基础:从 路由装饰器 到 __name__ 变量 的底层逻辑解析

Flask 核心基础&#xff1a;从路由装饰器到 name 变量的底层逻辑解析 在使用 Flask 开发 Web 应用时&#xff0c;我们总会从 app Flask(__name__) 和 app.route("/") 这两行代码开始。看似简单的语法背后&#xff0c;藏着 Python 装饰器机制与 Flask 框架设计的核心…

中国AI云市场报告:阿里云份额达35.8%,高于2至4名总和

9月9日&#xff0c;国际权威市场调研机构英富曼&#xff08;Omdia&#xff09;发布《中国AI云市场&#xff0c;1H25》报告&#xff0c;报告显示&#xff0c;2025年上半年&#xff0c;中国AI云市场规模达223亿元&#xff0c;阿里云占比35.8%位列第一&#xff0c;市场份额高于2到…

鸿蒙Next开发指南:UIContext接口解析与全屏拉起元服务实战

前言在鸿蒙应用开发过程中&#xff0c;我们经常会遇到需要获取UI上下文实例或者在非UI上下文中调用UI相关方法的场景。随着HarmonyOS NEXT的不断发展&#xff0c;UIContext API为我们提供了更加优雅的解决方案。本文将详细介绍如何使用UIContext中对应的接口获取与实例绑定的对…

leaflet读取mvt格式

如图所示&#xff0c;是全国的数据&#xff0c;截图是部分数据先安装&#xff1a;npm install leaflet npm install leaflet.vectorgrid如果是其余的框架直接用就行&#xff1a;import * as L from leaflet; import leaflet.vectorgrid;我用的是angular,所以是ts中声明&#xf…

OSG中交互(鼠标、键盘)处理

OpenSceneGraph (OSG) 中的交互处理,包括鼠标和键盘事件。 一、OSG 事件处理体系 OSG 使用一个基于访问者模式的事件处理体系,核心类包括: osgGA::GUIEventHandler: 所有事件处理器的基类 osgViewer::Viewer: 查看器,管理事件队列和分发 osgGA::EventQueue: 事件队列…

微硕双N-MOS管WST3392在汽车智能氛围灯系统中的应用

汽车智能氛围灯系统是现代车辆提升驾乘体验的重要配置&#xff0c;其多通道LED的精密调光与控制需选用高性能、小体积的功率开关器件。微硕WINSOK的WST3392是一款双N沟道MOS管&#xff0c;具有30V耐压、3.7A连续电流和46mΩ的低导通电阻&#xff0c;特别适用于氛围灯系统中的多…

深入 Kubernetes:从零到生产的工程实践与原理洞察

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

为何三折叠手机只有华为可以?看华为Mate XTs非凡大师就知道

9月4日&#xff0c;华为在深圳举行华为Mate XTs非凡大师及全场景新品发布会&#xff0c;不同于过往手机发布会对芯片配置只字不提&#xff0c;此次发布会公开展示了华为Mate XTs非凡大师内部芯片配置——麒麟9020芯片&#xff0c;时隔四年&#xff0c;终于在发布会上看到芯片公…

TensorFlow 2.x 核心 API 与模型构建

TensorFlow 2.x 核心 API 与模型构建TensorFlow 是一个强大的开源机器学习库&#xff0c;尤其在深度学习领域应用广泛。TensorFlow 2.x 在易用性和效率方面做了大量改进&#xff0c;引入了Keras作为其高级API&#xff0c;使得模型构建和训练更加直观和便捷。本文将介绍 TensorF…

TENGJUN防水TYPE-C连接器:工业级防护,认证级可靠,赋能严苛场景连接

在工业控制、户外电子、水下设备等对连接稳定性与防护性要求极致的场景中&#xff0c;TENGJUN防水TYPE-C连接器以“硬核性能全面认证”的双重优势&#xff0c;成为关键连接环节的信赖之选。从结构设计到认证标准&#xff0c;每一处细节都为应对复杂环境而生&#xff0c;重新定义…

【小呆的随机振动力学笔记】概率论基础

文章目录0. 概率论基础0.1 概率的初步认知0.2 随机变量的分布0.3 随机变量的数字特征0.3.1 随机变量的期望算子0.3.2 随机变量的矩0.4 随机变量的特征函数0.5 高数基础附录A 典型分布0. 概率论基础 \quad\quad在生活中或自然中&#xff0c;处处都存在随机现象&#xff0c;比如每…

使用海康机器人相机SDK实现基本参数配置(C语言示例)

在机器视觉项目开发中&#xff0c;相机的初始化、参数读取与设置是最基础也是最关键的环节。本文基于海康机器人&#xff08;Hikrobot&#xff09;提供的MVS SDK&#xff0c;使用C语言实现了一个简洁的控制程序&#xff0c;完成设备枚举、连接以及常用参数的获取与设置。 &…

【IoTDB】时序数据库选型指南:为何IoTDB成为工业大数据场景的首选?

【作者主页】Francek Chen 【专栏介绍】⌈⌈⌈大数据与数据库应用⌋⌋⌋ 大数据是规模庞大、类型多样且增长迅速的数据集合&#xff0c;需特殊技术处理分析以挖掘价值。数据库作为数据管理的关键工具&#xff0c;具备高效存储、精准查询与安全维护能力。二者紧密结合&#xff0…