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
英文地址,請注明出處:http://en.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…