AUTOSAR进阶图解==>AUTOSAR_SWS_TTCANDriver

TTCAN驱动器详细规范

AUTOSAR TTCAN Driver Specification with Enhanced Visual Documentation

目录

  • 1. 概述
  • 2. TTCAN控制器状态机
  • 3. TTCAN模块架构
  • 4. TTCAN时间触发操作序列
  • 5. TTCAN错误处理流程
  • 6. 总结

1. 概述

TTCAN(Time-Triggered CAN)驱动器是AUTOSAR基础软件模块,基于ISO 11898-4标准实现时间触发通信。本文档基于AUTOSAR_SWS_TTCANDriver规范,通过PlantUML图表详细展示TTCAN驱动器的架构、状态机、操作序列和错误处理机制。

TTCAN驱动器作为CAN驱动器的扩展,提供以下核心功能:

  • 时间触发通信:支持基于时间窗口的消息传输调度
  • 全局时间同步:实现网络节点间的精确时间同步
  • 错误检测与处理:提供多级错误检测和恢复机制
  • 主从模式支持:支持时间主节点和从节点的角色管理

2. TTCAN控制器状态机

2.1 状态机概述

TTCAN控制器状态机定义了控制器在运行过程中的各种状态及其转换条件。状态机包含四个主要状态:STOPPED、SYNCHRONIZING、IN_GAP和IN_SCHEDULE。

在这里插入图片描述

TTCAN控制器状态机图展示了控制器的四种主要状态及其转换关系

2.2 状态详细说明

2.2.1 STOPPED状态
  • 含义:控制器停止状态,不参与总线通信
  • 特征
    • 控制器完全停止,不发送或接收任何消息
    • 等待启动命令
    • 硬件资源处于低功耗状态
  • 进入条件:系统初始化或严重错误后
  • 退出条件:收到Can_SetControllerMode(CAN_CS_STARTED)调用
2.2.2 SYNCHRONIZING状态
  • 含义:控制器正在尝试与总线同步
  • 特征
    • 尝试与全局总线时间同步
    • 不发送错误帧和确认
    • 监听参考消息以获取时间基准
  • 进入条件:从STOPPED状态启动后
  • 退出条件:同步完成或发生严重错误
2.2.3 IN_GAP状态
  • 含义:控制器在基本周期结束间隙中
  • 特征
    • 等待下一个参考消息
    • 准备进入调度状态
    • 处理时间间隙相关操作
  • 进入条件:同步完成或基本周期结束
  • 退出条件:参考消息结束,进入调度状态
2.2.4 IN_SCHEDULE状态
  • 含义:控制器正常时间触发操作
  • 特征
    • 按矩阵周期传输消息
    • 执行预定义的时间窗口调度
    • 处理独占和仲裁时间窗口
  • 进入条件:参考消息结束
  • 退出条件:基本周期结束或发生错误

2.3 状态转换说明

2.3.1 正常转换流程
  1. STOPPED → SYNCHRONIZING:通过Can_SetControllerMode(CAN_CS_STARTED)启动
  2. SYNCHRONIZING → IN_GAP:同步完成后自动转换
  3. IN_GAP → IN_SCHEDULE:参考消息结束后转换
  4. IN_SCHEDULE → IN_GAP:基本周期结束后转换
2.3.2 错误转换流程
  • 任何状态 → STOPPED:发生严重错误(S3)时强制转换
  • 错误转换会取消待处理消息并禁用自动错误恢复

2.4 代码示例

/* TTCAN控制器状态机实现 */
typedef enum {TTCAN_STATE_STOPPED,        /* 停止状态 */TTCAN_STATE_SYNCHRONIZING,  /* 同步状态 */TTCAN_STATE_IN_GAP,         /* 间隙状态 */TTCAN_STATE_IN_SCHEDULE     /* 调度状态 */
} TTCAN_ControllerStateType;/* 状态机处理函数 */
void TTCAN_ControllerStateMachine(void)
{TTCAN_ControllerStateType currentState;TTCAN_ErrorLevelType errorLevel;/* 获取当前状态 */currentState = TTCAN_Internal_GetControllerState();/* 检查错误级别 */TTCAN_GetErrorLevel(&errorLevel);switch (currentState) {case TTCAN_STATE_STOPPED:/* 处理停止状态 */if (TTCAN_Internal_IsStartRequested()) {TTCAN_Internal_SetState(TTCAN_STATE_SYNCHRONIZING);TTCAN_Internal_StartSynchronization();}break;case TTCAN_STATE_SYNCHRONIZING:/* 处理同步状态 */if (TTCAN_Internal_IsSynchronized()) {TTCAN_Internal_SetState(TTCAN_STATE_IN_GAP);TTCAN_Internal_EnterGapMode();} else if (errorLevel.errorLevel == TTCAN_ERROR_S3) {TTCAN_Internal_SetState(TTCAN_STATE_STOPPED);TTCAN_Internal_HandleSevereError();}break;case TTCAN_STATE_IN_GAP:/* 处理间隙状态 */if (TTCAN_Internal_IsReferenceMessageReceived()) {TTCAN_Internal_SetState(TTCAN_STATE_IN_SCHEDULE);TTCAN_Internal_StartSchedule();} else if (errorLevel.errorLevel == TTCAN_ERROR_S3) {TTCAN_Internal_SetState(TTCAN_STATE_STOPPED);TTCAN_Internal_HandleSevereError();}break;case TTCAN_STATE_IN_SCHEDULE:/* 处理调度状态 */if (TTCAN_Internal_IsBasicCycleEnd()) {TTCAN_Internal_SetState(TTCAN_STATE_IN_GAP);TTCAN_Internal_EnterGapMode();} else if (errorLevel.errorLevel == TTCAN_ERROR_S3) {TTCAN_Internal_SetState(TTCAN_STATE_STOPPED);TTCAN_Internal_HandleSevereError();} else {TTCAN_Internal_ProcessTimeWindows();}break;default:/* 错误处理 */TTCAN_Internal_SetState(TTCAN_STATE_STOPPED);break;}
}

3. TTCAN模块架构

3.1 架构概述

TTCAN模块采用分层架构设计,包含应用层、中间层和硬件抽象层。该架构确保了模块间的清晰分离和良好的可维护性。

在这里插入图片描述

TTCAN模块架构图展示了从应用层到硬件层的完整组件结构

3.2 层次结构说明

3.2.1 应用层
  • TTCAN应用:使用TTCAN服务的上层应用程序
  • 职责:提供业务逻辑和用户接口
  • 功能点
    • 调用TTCAN接口API
    • 处理TTCAN事件通知
    • 管理应用级配置
3.2.2 中间层
  • TTCAN接口(TtcanIf):提供统一的应用接口

    • 职责:API抽象和事件管理
    • 功能点
      • 提供标准化的API接口
      • 管理事件通知和回调
      • 数据格式转换和验证
      • 错误处理和状态管理
  • TTCAN驱动器(TtcanDrv):核心驱动模块

    • 职责:硬件控制和业务逻辑实现
    • 功能点
      • 时间触发通信管理
      • 全局时间同步控制
      • 错误检测和处理
      • 调度管理
3.2.3 硬件抽象层
  • TTCAN控制器:硬件控制器抽象
  • CAN收发器:物理层通信组件
  • 看门狗驱动器:系统监控组件

3.3 接口说明

3.3.1 时间API
  • 提供的服务:时间查询和设置服务
  • 调用方式:同步调用,返回当前时间信息
3.3.2 同步API
  • 提供的服务:同步状态查询和控制服务
  • 调用方式:同步调用,管理同步参数
3.3.3 错误通知
  • 提供的服务:错误事件通知服务
  • 调用方式:异步回调,通知错误状态变化
3.3.4 硬件控制
  • 提供的服务:硬件资源控制服务
  • 调用方式:直接硬件访问,控制硬件状态

3.4 代码示例

/* TTCAN模块接口定义 */
#define TTCAN_E_OK                   0x00  /* 操作成功 */
#define TTCAN_E_NOT_INITIALIZED      0x01  /* 模块未初始化 */
#define TTCAN_E_INVALID_PARAM        0x02  /* 参数无效 */
#define TTCAN_E_TIMEOUT              0x03  /* 操作超时 *//* TTCAN接口函数声明 */
Std_ReturnType TtcanIf_Init(const TtcanIf_ConfigType* ConfigPtr);
Std_ReturnType TtcanIf_Transmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr);
Std_ReturnType TtcanIf_ReadRxPduData(PduIdType RxPduId, PduInfoType* PduInfoPtr);
Std_ReturnType TtcanIf_GetControllerTime(uint8 Controller, TTCAN_TimeType* GlobalTime,TTCAN_TimeType* LocalTime,TTCAN_TimeType* CycleTime,uint8* CycleCount);/* TTCAN驱动器函数声明 */
Std_ReturnType Ttcan_Init(const Ttcan_ConfigType* ConfigPtr);
Std_ReturnType Ttcan_SetControllerMode(uint8 Controller, Ttcan_ControllerStateType Transition);
Std_ReturnType Ttcan_Write(Ttcan_HwHandleType Hth, const Ttcan_PduType* PduInfoPtr);
void Ttcan_MainFunction_Write(void);
void Ttcan_MainFunction_Read(void);/* 错误通知回调函数 */
void TtcanIf_TTSevereError(uint8 Controller, TtcanIf_TTSevereErrorEnumType ErrorType);
void TtcanIf_TTTimingError(uint8 Controller, TtcanIf_TTTimingErrorIRQType ErrorType);/* 模块配置结构 */
typedef struct {uint8 moduleId;                    /* 模块标识符 */boolean moduleEnabled;             /* 模块启用状态 */uint8 maxControllers;              /* 最大控制器数量 */Ttcan_ControllerConfigType* controllerConfig; /* 控制器配置数组 */
} Ttcan_ConfigType;/* 控制器配置结构 */
typedef struct {uint8 controllerId;                /* 控制器标识符 */boolean controllerEnabled;         /* 控制器启用状态 */Ttcan_MasterSlaveModeType masterSlaveMode; /* 主从模式 */Ttcan_SyncModeType syncMode;       /* 同步模式 */uint16 cycleTime;                  /* 周期时间 */uint8 matrixCycleCount;            /* 矩阵周期计数 */
} Ttcan_ControllerConfigType;

4. TTCAN时间触发操作序列

4.1 操作序列概述

TTCAN时间触发操作序列展示了从系统初始化到正常通信的完整流程,包括初始化、启动、时间触发传输和错误处理等关键阶段。

在这里插入图片描述

TTCAN时间触发操作序列图展示了完整的系统交互流程

4.2 序列阶段说明

4.2.1 系统初始化阶段
  • 场景:系统启动时的初始化过程
  • 触发条件:系统上电或复位
  • 参与者
    • TTCAN应用:发起初始化请求
    • TTCAN接口:处理初始化请求
    • TTCAN驱动器:执行硬件初始化
    • TTCAN控制器:完成硬件配置
4.2.2 控制器启动阶段
  • 场景:控制器从停止状态启动并同步
  • 触发条件:初始化完成后
  • 参与者
    • TTCAN应用:发起启动请求
    • TTCAN接口:调用启动函数
    • TTCAN驱动器:控制启动过程
    • TTCAN控制器:执行状态转换
    • CAN总线:提供参考消息
4.2.3 时间触发传输阶段
  • 场景:正常的时间触发通信过程
  • 触发条件:控制器进入调度状态
  • 参与者
    • TTCAN应用:提供传输数据
    • TTCAN接口:管理传输请求
    • TTCAN驱动器:执行传输调度
    • TTCAN控制器:硬件传输执行
    • CAN总线:物理传输介质
4.2.4 错误处理阶段
  • 场景:错误检测和处理过程
  • 触发条件:检测到错误事件
  • 参与者
    • TTCAN控制器:错误检测
    • TTCAN驱动器:错误处理
    • TTCAN接口:错误通知
    • TTCAN应用:错误响应

4.3 关键函数说明

4.3.1 Can_Init()
  • 描述:初始化TTCAN驱动器,配置硬件参数和数据结构
  • 参数
    • ConfigPtr [输入]:配置参数指针,类型:const Ttcan_ConfigType*
  • 返回值
    • E_OK:初始化成功
    • E_NOT_OK:初始化失败
  • 相关函数
    • 上层:TtcanIf_Init()
    • 下层:硬件初始化函数
4.3.2 Can_SetControllerMode()
  • 描述:设置控制器运行模式,控制状态转换
  • 参数
    • Controller [输入]:控制器ID,类型:uint8
    • Transition [输入]:目标状态,类型:Ttcan_ControllerStateType
  • 返回值
    • E_OK:模式设置成功
    • E_NOT_OK:模式设置失败
  • 相关函数
    • 上层:TtcanIf_SetControllerMode()
    • 下层:硬件控制函数
4.3.3 Can_Write()
  • 描述:写入传输数据到硬件对象
  • 参数
    • Hth [输入]:硬件传输句柄,类型:Ttcan_HwHandleType
    • PduInfoPtr [输入]:PDU信息指针,类型:const Ttcan_PduType*
  • 返回值
    • E_OK:写入成功
    • E_NOT_OK:写入失败
  • 相关函数
    • 上层:TtcanIf_Transmit()
    • 下层:硬件写入函数

4.4 代码示例

/* TTCAN系统初始化示例 */
Std_ReturnType TTCAN_SystemInit(void)
{Std_ReturnType result;Ttcan_ConfigType config;/* 配置TTCAN模块 */config.moduleId = TTCAN_MODULE_ID;config.moduleEnabled = TRUE;config.maxControllers = 1;/* 配置控制器 */config.controllerConfig[0].controllerId = 0;config.controllerConfig[0].controllerEnabled = TRUE;config.controllerConfig[0].masterSlaveMode = TTCAN_SLAVE_MODE;config.controllerConfig[0].syncMode = TTCAN_SYNC_MODE;config.controllerConfig[0].cycleTime = 1000; /* 1ms */config.controllerConfig[0].matrixCycleCount = 64;/* 初始化TTCAN接口 */result = TtcanIf_Init(&config);if (result != E_OK) {return E_NOT_OK;}/* 初始化TTCAN驱动器 */result = Ttcan_Init(&config);if (result != E_OK) {return E_NOT_OK;}return E_OK;
}/* TTCAN控制器启动示例 */
Std_ReturnType TTCAN_StartController(uint8 controllerId)
{Std_ReturnType result;/* 设置控制器为启动状态 */result = Ttcan_SetControllerMode(controllerId, TTCAN_CS_STARTED);if (result != E_OK) {return E_NOT_OK;}/* 等待控制器进入同步状态 */TTCAN_ControllerStateType state;uint8 retryCount = 0;do {Ttcan_GetControllerState(controllerId, &state);if (state == TTCAN_STATE_SYNCHRONIZING) {break;}if (retryCount++ > TTCAN_MAX_RETRY_COUNT) {return E_NOT_OK; /* 超时 */}/* 延时等待 */Os_DelayMs(10);} while (TRUE);return E_OK;
}/* TTCAN时间触发传输示例 */
Std_ReturnType TTCAN_TransmitMessage(uint8 controllerId, uint32 messageId, uint8* data, uint8 dataLength)
{Std_ReturnType result;Ttcan_PduType pduInfo;Ttcan_HwHandleType hth;/* 配置PDU信息 */pduInfo.id = messageId;pduInfo.length = dataLength;pduInfo.sdu = data;pduInfo.swPduHandle = 0;/* 获取硬件传输句柄 */hth = Ttcan_GetHth(controllerId, messageId);if (hth == TTCAN_INVALID_HTH) {return E_NOT_OK;}/* 写入传输数据 */result = Ttcan_Write(hth, &pduInfo);if (result != E_OK) {return E_NOT_OK;}return E_OK;
}/* TTCAN主函数示例 */
void TTCAN_MainFunction(void)
{/* 处理传输 */Ttcan_MainFunction_Write();/* 处理接收 */Ttcan_MainFunction_Read();/* 处理状态机 */TTCAN_ControllerStateMachine();
}

5. TTCAN错误处理流程

5.1 错误处理概述

TTCAN错误处理流程定义了系统如何检测、分类、评估和处理各种类型的错误,确保系统的可靠性和安全性。

在这里插入图片描述

TTCAN错误处理流程图展示了完整的错误检测和处理机制

5.2 错误分类说明

5.2.1 开发错误
  • CAN_TT_E_NOT_MASTER (0x08):TTCAN控制器不是潜在时间主节点
  • CAN_TT_E_NOT_CURRENT_MASTER (0x09):TTCAN控制器不是当前时间主节点
  • CAN_TT_E_CONSEQUTIVE_DISC (0x0a):连续发送两个Disc_bit设置的参考消息
  • CAN_TT_E_SYNC_DISABLED (0x0b):外部同步在配置期间被禁用
5.2.2 运行时错误
  • 无运行时错误定义:TTCAN规范中未定义运行时错误
5.2.3 瞬态故障
  • 无瞬态故障定义:TTCAN规范中未定义瞬态故障
5.2.4 生产错误
  • 无生产错误定义:TTCAN规范中未定义生产错误
5.2.5 扩展生产错误
  • 无扩展生产错误定义:TTCAN规范中未定义扩展生产错误

5.3 错误级别评估

5.3.1 S0 - 无错误
  • 处理方式:继续正常操作
  • 恢复策略:无需特殊处理
5.3.2 S1 - 警告
  • 处理方式:调用CanIf_TTTimingError()通知应用层
  • 恢复策略:系统继续运行,但记录警告信息
5.3.3 S2 - 错误
  • 处理方式:调用CanIf_TTTimingError()通知应用层
  • 恢复策略:记录错误状态,可能需要干预
5.3.4 S3 - 严重错误
  • 处理方式:调用CanIf_TTSevereError()通知应用层
  • 恢复策略
    • 停止控制器
    • 进入STOPPED状态
    • 取消待处理消息
    • 禁用自动错误恢复

5.4 错误恢复机制

5.4.1 自动恢复
  • 适用条件:错误级别 < S3
  • 恢复过程
    1. 尝试错误恢复
    2. 检查系统状态
    3. 评估恢复结果
    4. 必要时升级错误级别
5.4.2 手动干预
  • 适用条件:错误级别 = S3
  • 干预方式
    • 系统重启
    • 手动复位操作
    • 硬件重置

5.5 代码示例

/* TTCAN错误处理函数 */
void TTCAN_ErrorHandler(uint8 controllerId, TTCAN_ErrorType errorType)
{TTCAN_ErrorLevelType errorLevel;Std_ReturnType result;/* 获取错误级别 */result = Ttcan_GetErrorLevel(controllerId, &errorLevel);if (result != E_OK) {return;}/* 根据错误级别处理 */switch (errorLevel.errorLevel) {case TTCAN_ERROR_S0:/* 无错误,继续正常操作 */break;case TTCAN_ERROR_S1:case TTCAN_ERROR_S2:/* 警告或错误级别 */TTCAN_HandleTimingError(controllerId, errorType);break;case TTCAN_ERROR_S3:/* 严重错误级别 */TTCAN_HandleSevereError(controllerId, errorType);break;default:/* 未知错误级别 */break;}
}/* 时间错误处理 */
void TTCAN_HandleTimingError(uint8 controllerId, TTCAN_ErrorType errorType)
{/* 调用接口层错误通知 */CanIf_TTTimingError(controllerId, (TtcanIf_TTTimingErrorIRQType)errorType);/* 记录错误信息 */TTCAN_LogError(controllerId, errorType, TTCAN_ERROR_TIMING);/* 尝试自动恢复 */if (TTCAN_CanAutoRecover(controllerId)) {TTCAN_AttemptRecovery(controllerId);}
}/* 严重错误处理 */
void TTCAN_HandleSevereError(uint8 controllerId, TTCAN_ErrorType errorType)
{/* 调用接口层严重错误通知 */CanIf_TTSevereError(controllerId, (TtcanIf_TTSevereErrorEnumType)errorType);/* 停止控制器 */Ttcan_SetControllerMode(controllerId, TTCAN_CS_STOPPED);/* 取消待处理消息 */TTCAN_CancelPendingMessages(controllerId);/* 禁用自动错误恢复 */TTCAN_DisableAutoRecovery(controllerId);/* 记录严重错误 */TTCAN_LogError(controllerId, errorType, TTCAN_ERROR_SEVERE);
}/* 错误恢复尝试 */
Std_ReturnType TTCAN_AttemptRecovery(uint8 controllerId)
{TTCAN_ControllerStateType currentState;Std_ReturnType result;/* 获取当前状态 */Ttcan_GetControllerState(controllerId, &currentState);switch (currentState) {case TTCAN_STATE_SYNCHRONIZING:/* 重新尝试同步 */result = TTCAN_RetrySynchronization(controllerId);break;case TTCAN_STATE_IN_SCHEDULE:/* 重新进入调度 */result = TTCAN_RetrySchedule(controllerId);break;default:/* 其他状态无需特殊恢复 */result = E_OK;break;}return result;
}/* 错误日志记录 */
void TTCAN_LogError(uint8 controllerId, TTCAN_ErrorType errorType, TTCAN_ErrorCategory category)
{TTCAN_ErrorLogEntry entry;/* 填充错误日志条目 */entry.timestamp = TTCAN_GetSystemTime();entry.controllerId = controllerId;entry.errorType = errorType;entry.category = category;entry.errorLevel = TTCAN_GetErrorLevel(controllerId);/* 写入错误日志 */TTCAN_WriteErrorLog(&entry);
}/* 开发错误检查 */
Std_ReturnType TTCAN_CheckDevelopmentError(uint8 controllerId, TTCAN_OperationType operation)
{TTCAN_MasterStateType masterState;Std_ReturnType result;switch (operation) {case TTCAN_OP_SET_TIME_COMMAND:/* 检查是否为时间主节点 */result = Ttcan_GetMasterState(controllerId, &masterState);if (result == E_OK) {if (masterState.masterSlaveMode != TTCAN_CURRENT_MASTER) {return TTCAN_E_NOT_CURRENT_MASTER;}}break;case TTCAN_OP_GLOBAL_TIME_PRESET:/* 检查是否为潜在时间主节点 */result = Ttcan_GetMasterState(controllerId, &masterState);if (result == E_OK) {if (masterState.masterSlaveMode == TTCAN_MASTER_OFF) {return TTCAN_E_NOT_MASTER;}}break;default:break;}return E_OK;
}

6. 总结

6.1 技术优势

TTCAN驱动器通过PlantUML图表清晰展示了其架构设计和操作流程,具有以下技术优势:

  • 时间触发通信:提供确定性的消息传输时间,满足实时性要求
  • 全局时间同步:实现网络节点间的精确时间同步,确保系统一致性
  • 分层架构设计:清晰的层次分离,便于维护和扩展
  • 完善的错误处理:多级错误检测和恢复机制,提高系统可靠性
  • 主从模式支持:灵活的主从角色管理,适应不同应用场景

6.2 应用场景

TTCAN驱动器适用于以下应用场景:

  • 汽车电子系统:发动机控制、制动系统、车身电子等
  • 工业自动化:实时控制、数据采集、设备监控等
  • 航空航天:飞行控制系统、导航系统等
  • 医疗设备:实时监控、精确控制等

6.3 关键特性

  • 确定性通信:基于时间窗口的确定性消息传输
  • 高可靠性:完善的错误检测和处理机制
  • 可配置性:灵活的配置参数,适应不同应用需求
  • 标准化接口:符合AUTOSAR标准的API接口
  • 向后兼容:与标准CAN协议兼容

通过本文档的PlantUML图表和详细解释,读者可以深入理解TTCAN驱动器的架构设计、状态管理、操作流程和错误处理机制,为实际应用开发提供重要参考。

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

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

相关文章

equals 定义不一致导致list contains错误

错误代码如下&#xff1a;for (int i0;i< rows.size();i) {Row r rows.get(i);if (r.equals(row)) {assertTrue(rows.contains(row));return;}}cassertTrue(rows.contains(row));返回了false&#xff0c;看起来很奇怪&#xff0c;此时equals 定义如下&#xff1a;public bo…

【Python基础】 20 Rust 与 Python 循环语句完整对比笔记

一、基本循环结构对比 Rust 循环类型 // 1. loop - 无限循环 let mut count 0; loop {count 1;if count > 5 {break;} }// 2. while - 条件循环 let mut number 3; while number ! 0 {println!("{}!", number);number - 1; }// 3. for - 迭代循环 for i in 0..…

Redis 在互联网高并发场景下的应用--个人总结

在现代互联网系统中&#xff0c;高并发已经成为常态。无论是电商的秒杀场景、社交平台的热点推荐&#xff0c;还是支付接口的风控&#xff0c;系统需要同时应对成千上万的请求。这时候&#xff0c;Redis 作为一个高性能的内存数据库&#xff0c;凭借其极快的读写速度和丰富的数…

C++笔记之软件设计原则总结

C++笔记之软件设计原则总结 code review 文章目录 C++笔记之软件设计原则总结 1.软件设计的六大原则 2.高内聚与低耦合 2.1.高内聚(High Cohesion) 2.2.低耦合(Low Coupling) 2.3.高内聚与低耦合的关系与重要性 3.DRY(Dont Repeat Yourself)原则 3.1.定义 3.2.好处 3.3.示…

ThreadLocal 深度解析:原理、应用场景与最佳实践

一、ThreadLocal 核心概念与设计哲学​1.1 ThreadLocal 的基本概念​ThreadLocal 是 Java 中提供线程局部变量的类&#xff0c;它允许每个线程创建自己的变量副本&#xff0c;从而实现线程封闭&#xff08;Thread Confinement&#xff09;。简单来说&#xff0c;ThreadLocal 为…

AMD显卡运行GPT-OSS全攻略

AMD显卡运行GPT-OSS全攻略 本文介绍如何在Windows系统上使用AMD显卡&#xff08;以RX 7900XTX为例&#xff09;运行开源GPT-OSS模型。 前置要求 硬件&#xff1a;AMD显卡&#xff08;如RX 7900XTX&#xff0c;具体支持型号参考ROCm文档&#xff09;。软件&#xff1a; Ollam…

【Sharding-JDBC】​Spring/Spring Boot 集成 Sharding-JDBC,分表策略与 API、YAML 配置实践​

文章目录环境准备Spring框架Sharding-JDBC 4.x版本api实现Sharding-JDBC 5.4.x版本yaml实现Springboot框架Sharding-JDBC 5.4.x版本yaml实现分库、加密、读写分离基于yaml的配置示例更多相关内容可查看需求&#xff1a;按月分区&#xff0c;按年分表&#xff0c;找不到对应年份…

单片机和PLC有哪些区别?揭秘单片机MCU的常见应用

单片机&#xff08;MCU&#xff09;和可编程逻辑控制器&#xff08;PLC&#xff09;作为电子控制系统中的两大核心组件&#xff0c;分别在不同的领域发挥着重要作用。然而&#xff0c;尽管它们都属于自动化控制领域的关键设备&#xff0c;但它们的设计理念、应用场景和性能特点…

ElementUI之Upload 上传的使用

文章目录说明SSM使用引入依赖在spring-mvc.xml中加入配置创建上传工具类AliOssUtil响应工具类ResultJSON编写controller自动上传代码编写结果如下演示手动上传前端代码编写后端代码编写结果演示如下说明 为了方便演示&#xff0c;前后端代码一起写了 关于对象存储请看我另一篇博…

Langchain4j 整合MongoDB 实现会话持久化存储详解

目录 一、前言 二、大模型会话记忆介绍 2.1 AI 大模型会话记忆是什么 2.2 大模型会话记忆常用实现方案 2.3 LangChain4j 会话记忆介绍 三、大模型常用会话存储数据库介绍 3.1 常用的会话存储数据库 3.2 MongoDB 简介 3.2.1 MongoDB 是什么 3.3 为什么选择MongoDB 作为…

SQL 常用 OVER() 窗口函数介绍

1. sum() over() 做组内数据累加在 SQL 中想实现不同分组内数据累加&#xff0c;可以通过 sum() over() PARTITION BY ORDER BY 结合实现。这种方式能同时满足多维度分组且组内累加的需求&#xff0c;示例如下&#xff1a;假设我们有一张 sales 表&#xff0c;表中存储着…

OpenRouter:一站式 AI 模型调用平台,免费畅享千问、DeepSeek 等顶级模型

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 OpenRouter&#xff1a;一站式 AI 模型调用平台&#xff0c;免费畅享千问、DeepSeek 等顶级模型前…

SpringBoot 整合 Kafka 的实战指南

引言&#xff1a; 本文总字数&#xff1a;约 9800 字预计阅读时间&#xff1a;40 分钟 为什么 Kafka 是高吞吐场景的首选&#xff1f; 在当今的分布式系统中&#xff0c;消息队列已成为不可或缺的基础设施。面对不同的业务场景&#xff0c;选择合适的消息队列至关重要。目前…

OpenCV 实战篇——如何测算出任一副图片中的物体的实际尺寸?传感器尺寸与像元尺寸的关系?

文章目录1 如何测算出任一副图片中的物体的实际尺寸2 传感器尺寸与像元尺寸的关系3 Max Frame Rate最大帧率4 为什么要进行相机标定?相机标定有何意义?5 基于相机模型的单目测距--普通相机1 如何测算出任一副图片中的物体的实际尺寸 物体尺寸测量的思路是找一个确定尺寸的物…

Java并发锁相关

锁相关 ​1. 什么是可重入锁&#xff1f;Java 中如何实现&#xff1f;​​ ​答​&#xff1a; 可重入锁允许一个线程多次获取同一把锁&#xff08;即递归调用时无需重新竞争锁&#xff09;。 ​关键点​&#xff1a;防止死锁&#xff0c;避免线程因重复请求已持有的锁而阻塞。…

Pie Menu Editor V1.18.7.exe 怎么安装?详细安装教程(附安装包)​

​​Pie Menu Editor V1.18.7.exe​ 是一款用于创建和编辑 ​饼图菜单&#xff08;Pie Menu&#xff09;​​ 的工具软件&#xff0c;通常用于游戏开发、UI设计、3D建模&#xff08;如 Blender 等&#xff09;、或自定义软件操作界面。 一、准备工作 ​下载文件​ 下载了 ​Pi…

基于Spark的中文文本情感分析系统研究

引言 1.1 研究背景与意义 随着互联网的普及和社交媒体的兴起、特别是自媒体时代的来临&#xff0c;网络文本数据呈现爆炸式增长。这些文本数据蕴含着丰富的用户情感信息&#xff0c;如何有效地挖掘和利用这些信息&#xff0c;对于了解舆情动态、改进客户服务、辅助决策分析具…

Simulink子系统、变体子系统及封装知识

1.引言 文章三相新能源并网系统序阻抗模型——序阻抗分析器IMAnalyzer介绍了一种用于分析和扫描序阻抗的软件。其中&#xff0c;在序阻抗扫频操作过程中&#xff0c;用到了一个扰动注入、测量和运算工具【IMtool】&#xff0c;它外表长这样&#xff1a; 内部长这样&#xff1a…

高阶组件介绍

高阶组件约定俗成以with开头 import React, { useEffect } from react; import { TouchableOpacity, Image, StyleSheet } from react-native;type IReactComponent React.ClassicComponentClass| React.ComponentClass| React.FunctionComponent| React.ForwardRefExoticComp…

C++ STL系列-02.泛型入门

C STL系列-02.泛型入门C中的泛型编程主要通过模板&#xff08;template&#xff09;实现。模板允许我们编写与类型无关的代码&#xff0c;是一种将类型作为参数进行编程的方式。在C中&#xff0c;模板分为函数模板和类模板。 1. 函数模板函数模板允许我们定义一个函数&#xff…