【Bluedroid】藍牙協議棧enable流程深度解析

本文詳細剖析 Bluedroid 藍牙功能啟用的核心流程,從enable()函數觸發開始,深入解析藍牙協議棧的異步啟動機制、核心協議模塊初始化、硬件控制器綁定及狀態同步全流程。重點闡述接口就緒性檢查、異步線程管理、配置文件回調機制等關鍵環節,揭示藍牙棧從軟件初始化到硬件交互的完整生命周期管理。

一、概述

1. 接口就緒性與異步啟動

  • 接口檢查enable()函數首先通過interface_ready()驗證藍牙硬件和軟件接口是否就緒

  • 異步啟動:通過stack_manager_get_interface()->start_up_stack_async()非阻塞啟動藍牙棧,避免主線程阻塞

2. 協議棧核心初始化流程

  • 狀態校驗event_start_up_stack首先檢查stack_is_running避免重復啟動

  • 基礎環境初始化:通過ensure_stack_is_initialized確保協議棧基礎環境僅初始化一次

  • 核心模塊加載:按序初始化 BTM、L2CAP、GATT、SDP 等協議模塊,構建協議棧基礎架構

  • 配置文件回調通過startProfiles()觸發上層業務邏輯,啟動 A2DP、HID 等配置文件

3. 硬件交互與狀態同步

  • 控制器綁定:初始化 GD_CONTROLLER_MODULE 與物理硬件交互,完成固件加載與射頻校準

  • 異步等待機制:通過future_await阻塞等待硬件初始化完成,確保協議棧與硬件狀態一致

  • 錯誤處理:啟動失敗時通過event_shut_down_stack完成資源清理

  • 狀態通知:通過event_signal_stack_up通知 JNI 線程,觸發系統狀態變更廣播

4. 分層架構設計

  • 協議層:BTM、L2CAP 等底層協議模塊負責硬件抽象

  • 應用層:BTA 模塊封裝上層 API,提供設備管理等應用級功能

  • 接口層:BTIF 模塊實現與 Android Framework 的接口適配

二、源碼解析

enable

packages/modules/Bluetooth/system/btif/src/bluetooth.cc
static int enable() {if (!interface_ready()) return BT_STATUS_NOT_READY;stack_manager_get_interface()->start_up_stack_async(CreateInterfaceToProfiles(), &start_profiles, &stop_profiles);return BT_STATUS_SUCCESS;
}

啟動藍牙棧,并在棧啟動完成后異步初始化藍牙配置文件(如 HID、A2DP、GATT 等)。流程可概括為:

  • 接口就緒性檢查:確保藍牙硬件和軟件接口已準備好(如驅動加載、硬件初始化完成)。

  • 異步啟動藍牙棧:通過非阻塞方式啟動藍牙協議棧,避免阻塞調用線程。

  • 配置文件回調注冊:在棧啟動成功 / 失敗時,觸發配置文件的啟動或停止邏輯。

start_up_stack_async

packages/modules/Bluetooth/system/btif/src/stack_manager.cc
static void start_up_stack_async(bluetooth::core::CoreInterface* interface, // 藍牙核心接口指針ProfileStartCallback startProfiles, // 棧啟動成功后的回調函數ProfileStopCallback stopProfiles) { // 棧啟動失敗/停止后的回調函數management_thread.DoInThread(FROM_HERE, base::BindOnce(event_start_up_stack, interface, startProfiles,stopProfiles));}

通過異步線程管理和回調機制,實現了藍牙棧啟動與配置文件初始化的解耦,確保核心流程在獨立線程中可靠執行。

event_start_up_stack

packages/modules/Bluetooth/system/btif/src/stack_manager.cc
// Unvetted includes/imports, etc which should be removed or vetted in the
// future
static future_t* hack_future;
// End unvetted section// If running, the stack is fully up and able to bluetooth.
static bool stack_is_running;// Synchronous function to start up the stack
static void event_start_up_stack(bluetooth::core::CoreInterface* interface,ProfileStartCallback startProfiles,ProfileStopCallback stopProfiles) {// 1. 啟動前狀態校驗:避免重復啟動if (stack_is_running) {log::info("stack already brought up");return;}// 2. 基礎環境初始化:確保運行前提ensure_stack_is_initialized(interface);// 3.  異步等待標記創建:阻塞等待硬件就緒log::info("is bringing up the stack");future_t* local_hack_future = future_new(); // 阻塞當前線程,等待某些異步操作完成(如硬件固件加載、控制器初始化)hack_future = local_hack_future;// 4. 核心協議模塊初始化:構建協議棧基礎log::info("Gd shim module enabled");get_btm_client_interface().lifecycle.btm_init();       // BTM(藍牙傳輸管理層)初始化module_start_up(get_local_module(BTIF_CONFIG_MODULE)); // BTIF配置模塊啟動(藍牙接口層)l2c_init(); // L2CAP(邏輯鏈路控制與適配協議)初始化sdp_init(); // SDP(服務發現協議)初始化gatt_init(); // GATT(通用屬性協議)初始化SMP_Init(get_btm_client_interface().security.BTM_GetSecurityMode()); // SMP(安全管理協議)初始化get_btm_client_interface().lifecycle.btm_ble_init();   // BTM BLE子模塊初始化RFCOMM_Init(); // RFCOMM(串口仿真協議)初始化GAP_Init();  // GAP(通用訪問配置文件)初始化// 5. 配置文件啟動回調:觸發上層業務邏輯startProfiles();// 6. 藍牙應用層(BTA)初始化:封裝上層 APIbta_sys_init();                                   // BTA系統模塊初始化(事件隊列、消息機制)module_init(get_local_module(BTE_LOGMSG_MODULE)); // 日志模塊初始化(用于協議棧內部日志記錄)btif_init_ok();                                   // BTIF層標記初始化完成(通知上層接口就緒)BTA_dm_init();                                   // BTA設備管理模塊初始化(設備發現、配對管理)bta_dm_enable(btif_dm_sec_evt, btif_dm_acl_evt); // 啟用設備管理(注冊安全事件、ACL連接事件回調)// 7. 硬件與控制器綁定:連接物理硬件btm_acl_device_down();  // 關閉所有現有ACL連接(啟動前清理)CHECK(module_start_up(get_local_module(GD_CONTROLLER_MODULE))); // 啟動GD控制器模塊(與硬件控制器交互)BTM_reset_complete(); // 通知BTM控制器重置完成(硬件初始化完成)BTA_dm_on_hw_on(); // 通知BTA設備管理模塊硬件已開啟// 8. 異步等待與錯誤處理:確保硬件就緒// 阻塞當前線程,等待local_hack_future被標記為完成// 若超時或失敗,進入錯誤處理流程if (future_await(local_hack_future) != FUTURE_SUCCESS) {log::error("failed to start up the stack");stack_is_running = true;  // So stack shutdown actually happensevent_shut_down_stack(stopProfiles); // 啟動失敗,觸發清理return;}// 9. 最終狀態同步與完成module_start_up(get_local_module(RUST_MODULE));  // 啟動Rust模塊stack_is_running = true; // 標記棧已成功運行log::info("finished");do_in_jni_thread(FROM_HERE, base::BindOnce(event_signal_stack_up, nullptr)); // 通知JNI線程棧已啟動
}

同步完成藍牙棧的完整初始化,包括:

  • 協議模塊初始化(如 L2CAP、SDP、GATT 等);

  • 配置文件啟動(通過startProfiles回調);

  • 硬件與系統服務綁定(如 BTM、GD 控制器);

  • 錯誤處理與資源清理(如啟動失敗時的棧關閉);

  • 狀態同步(通知 JNI 線程棧已啟動)。

執行流程可概括為:

狀態校驗 → 基礎環境初始化 → 異步等待標記創建 → 核心協議模塊初始化 → 配置文件啟動 → 應用層初始化 → 硬件綁定 → 異步等待硬件就緒 → 錯誤處理/狀態同步

異步等待的必要性:

future_await用于等待硬件初始化完成(如控制器固件加載、射頻校準),這些操作通常由硬件驅動異步執行。通過阻塞管理線程等待,確保協議棧在硬件就緒后再繼續初始化,避免因硬件未就緒導致的功能異常。

①啟動前狀態校驗:避免重復啟動

stack_is_running:全局布爾變量,標記藍牙棧是否已處于 “完全運行” 狀態(所有模塊初始化完成,可正常通信)。

防止多次調用啟動函數導致的模塊重復初始化、資源競爭(如多個 L2CAP 實例沖突)或硬件狀態混亂。

②基礎環境初始化:ensure_stack_is_initialized

packages/modules/Bluetooth/system/btif/src/stack_manager.cc
// If initialized, any of the bluetooth API functions can be called.
// (e.g. turning logging on and off, enabling/disabling the stack, etc)
static bool stack_is_initialized;static void ensure_stack_is_initialized(bluetooth::core::CoreInterface* interface) {if (!stack_is_initialized) {log::warn("found the stack was uninitialized. Initializing now.");// No future needed since we are calling it directlyinit_stack_internal(interface);}
}

藍牙協議棧生命周期管理中的初始化守護函數,通過全局狀態標記stack_is_initialized確保藍牙棧的基礎環境僅被初始化一次,避免重復初始化導致的資源競爭或狀態混亂。為后續模塊啟動和功能調用提供可靠的前提條件。

檢查stack_is_initialized是否為false(未初始化)。若已初始化(true),函數直接返回。如果沒有初始化,調用init_stack_internal(interface)執行實際初始化邏輯。【Bluedroid】藍牙啟動之init_stack_internal 函數全流程源碼解析-CSDN博客

③異步等待標記創建:阻塞等待硬件就緒

  • future_t:異步等待對象,用于阻塞當前線程,等待硬件初始化(如固件加載、射頻校準)等異步操作完成。

  • hack_future:全局變量,用于其他線程(如硬件驅動線程)設置完成狀態。(通過future_ready()設置)

④核心協議模塊初始化:構建協議棧基礎

模塊功能說明(按初始化順序):

  • BTM(Bluetooth Transport Manager):藍牙傳輸管理層,負責 ACL 連接管理、鏈路控制、功耗模式切換,是協議棧的 “交通警察”。【Bluedriod】藍牙啟動之 btm_init 源碼解析-CSDN博客

  • BTIF_CONFIG_MODULE(Bluetooth Interface Layer):藍牙接口層配置模塊,負責與 Android Framework 的接口適配(如 JNI 回調注冊)【Bluedriod】藍牙協議棧GD模塊(GD_SHIM_MODULE)啟動機制及源碼解析_gd協議棧詳細介紹-CSDN博客

  • L2CAP(Logical Link Control and Adaptation Protocol):協議棧的核心適配層,負責數據包分段、通道管理(如控制通道、中斷通道),是上層協議(GATT、RFCOMM)的基礎【Bluedroid】藍牙啟動之 l2c_init 源碼解析-CSDN博客

  • SDPService Discovery Protocol:服務發現協議,用于設備間查詢支持的服務(如查詢耳機支持的 A2DP 服務)。【Bluedroid】藍牙啟動之sdp_init 源碼解析-CSDN博客

  • GATT(Generic Attribute Protocol):通用屬性協議,是 BLE(低功耗藍牙)數據通信的核心,定義了服務(Service)、特征(Characteristic)的層級結構。【Bluedroid】藍牙啟動之gatt_init 流程源碼解析_bluedroid gatt-CSDN博客

  • SMP(Security Manager Protocol):安全管理協議,負責配對、密鑰生成、加密等安全操作,依賴 BTM 提供的安全模式。???????【Bluedroid】藍牙啟動之 SMP_Init 源碼解析_android p-256曲線-CSDN博客

  • BTM BLE:BTM 對 BLE 的擴展支持(如 LE 連接參數管理)。???????【Bluedroid】藍牙啟動之btm_ble_init源碼分析-CSDN博客

  • RFCOMM(Radio Frequency Communication):基于 L2CAP 的串口仿真協議,用于傳統藍牙(BR/EDR)的串行數據傳輸(如 HID 鍵盤)。???????【Bluedroid】藍牙啟動之 RFCOMM_Init 流程源碼解析-CSDN博客

  • GAP(Generic Access Profile):通用訪問配置文件,定義設備發現、配對、連接等基礎流程,是所有藍牙設備的 “入口”。???????【Bluedroid】藍牙啟動之 GAP_Init 流程源碼解析-CSDN博客

⑤配置文件啟動回調:startProfiles

調用上層傳入的startProfiles回調函數,啟動藍牙配置文件(Profiles)的業務邏輯。

典型操作(根據具體 Profile 類型):

  • 音頻類(A2DP):注冊音頻流傳輸服務;

  • 人機接口類(HID):初始化 HID 主機以支持鍵盤、鼠標連接;

  • 智能設備類(GATT):注冊自定義 GATT 服務(如心率傳感器)。

【Bluedroid】藍牙啟動之核心模塊(startProfiles )初始化與功能源碼解析-CSDN博客

⑥藍牙應用層(BTA)初始化:封裝上層 API

BTA(Bluetooth Application Layer):藍牙應用層,負責將協議棧功能封裝為上層可調用的 API(如 Android 的BluetoothManager),并管理設備發現、配對等應用級邏輯。

關鍵模塊:

  • bta_sys_init:初始化 BTA 的事件隊列和消息循環,是 BTA 與協議棧交互的基礎;???????【Bluedroid】藍牙啟動之 bta_sys_init 源碼解析-CSDN博客

  • module_init(get_local_module(BTE_LOGMSG_MODULE)): 日志模塊初始化(用于協議棧內部日志記錄)???????【Bluedroid】藍牙啟動之模塊初始化機制(module_init)深度解析 -CSDN博客

  • btif_init_ok:BTIF層標記初始化完成(通知上層接口就緒)???????【Bluedroid】藍牙啟動之 btif_init_ok 流程源碼解析-CSDN博客

  • BTA_dm_init/bta_dm_enable:設備管理模塊初始化,注冊安全事件(如配對請求)和 ACL 連接事件(如設備連接 / 斷開)的回調,上層通過這些回調感知設備狀態變化。

【Bluedroid】藍牙啟動之 BTA_dm_init 流程源碼解析-CSDN博客

【Bluedroid】藍牙啟動之 bta_dm_enable 流程梳理 & 源碼解析-CSDN博客

⑦ 硬件與控制器綁定:連接物理硬件

GD_CONTROLLER_MODULE:藍牙硬件控制器的抽象層( “GD” 即 “Generic Driver” 的縮寫),負責與具體藍牙芯片(如高通、博通)交互,完成以下操作:

  • 加載芯片固件(如bt_firmware.bin);

  • 配置控制器參數(如 MTU 大小、功耗模式);

  • 啟動射頻(RF)模塊,完成校準。

btm_acl_device_down:清理歷史連接,避免殘留的 ACL 連接干擾新啟動流程。【Bluedroid】藍牙啟動之 btm_acl_device_down 流程源碼解析-CSDN博客

BTM_reset_complete: 通知BTM控制器重置完成(硬件初始化完成)。???????【Bluedroid】藍牙啟動之BTM_reset_complete源碼解析-CSDN博客

BTA_dm_on_hw_on:通知BTA設備管理模塊硬件已開啟。???????【Bluedroid】藍牙設備管理器初始化全流程深度解析(BTA_dm_on_hw_on)-CSDN博客

⑧異步等待與錯誤處理:確保硬件就緒

  • future_await:阻塞當前線程,等待local_hack_future被標記為完成(由硬件驅動線程或其他異步任務通過future_set觸發)。若超時或失敗(返回非FUTURE_SUCCESS),進入錯誤處理。

  • 錯誤處理邏輯

    • 強制標記stack_is_running = true:確保event_shut_down_stack能觸發完整的關閉流程(如釋放已初始化的模塊);

    • 調用event_shut_down_stack(stopProfiles):清理已初始化的模塊(如關閉 BTA 服務、釋放協議層資源),避免狀態不一致。

⑨最終狀態同步與完成:通知上層棧已啟動

  • RUST_MODULE:用 Rust 語言實現的模塊(如安全敏感邏輯或高性能計算),需在核心模塊啟動后加載。

  • do_in_jni_thread:將event_signal_stack_up任務提交到 JNI 線程( Android 的主線程),通知上層(如BluetoothManagerService)藍牙棧已啟動完成,觸發系統廣播(如ACTION_BLUETOOTH_STATE_CHANGED)或 UI 更新(如藍牙開關按鈕變藍)。

event_signal_stack_up

packages/modules/Bluetooth/system/btif/src/stack_manager.cc
static void event_signal_stack_up(void* /* context */) {// Notify BTIF connect queue that we've brought up the stack. It's// now time to dispatch all the pending profile connect requests.// 1. 調度積壓的連接請求btif_queue_connect_next();// 2. 通知上層藍牙狀態已變為“開啟”GetInterfaceToProfiles()->events->invoke_adapter_state_changed_cb(BT_STATE_ON);
}

在藍牙棧完全啟動后(即event_start_up_stack函數成功執行完畢),由 JNI 線程( Android 主線程)調用,確保上層應用能及時感知藍牙狀態變化。

主要負責觸發兩個核心操作:

  • 處理藍牙棧啟動前積壓的連接請求(如在藍牙開啟過程中已提交的連接任務);

  • 通知所有注冊的回調函數:藍牙適配器狀態已變為 “開啟”(BT_STATE_ON)。

作為藍牙棧啟動完成的 “回調終點”,將底層啟動細節(如協議模塊初始化、硬件綁定)與上層業務邏輯(如連接請求處理、狀態通知)分離,符合單一職責原則

①btif_queue_connect_next

藍牙接口層(BTIF)的連接隊列調度函數,負責處理啟動前積壓的連接請求。具體邏輯可能包括:

  • 從連接請求隊列(如btif_connect_queue)中取出下一個待處理的連接任務(如連接藍牙耳機、HID 設備);

  • 調用對應配置文件(Profile)的連接接口(如A2DP_ConnectHID_Connect)執行實際連接操作;

  • 若隊列中還有任務,則遞歸調用自身繼續處理,直到隊列為空。

在藍牙棧啟動過程中,上層可能已提交了連接請求(如用戶在藍牙開關動畫期間點擊連接設備)。通過隊列機制,確保這些請求在棧啟動完成后按序執行,避免丟失或亂序。

  • 隊列機制允許用戶在藍牙啟動過程中提前發起操作(如點擊連接設備),系統會在棧就緒后自動執行,減少用戶等待時間。

  • 狀態變更通知及時觸發 UI 更新,使藍牙開關動畫與實際功能狀態同步,提升交互流暢感。

②通知上層藍牙狀態變更:invoke_adapter_state_changed_cb

  • GetInterfaceToProfiles():獲取藍牙配置文件(Profiles)的接口管理器,通常是單例對象,負責管理所有配置文件的生命周期和事件分發。

  • events:配置文件事件處理器,包含一組回調函數指針,用于處理藍牙狀態變更、設備發現等事件。

  • invoke_adapter_state_changed_cb(BT_STATE_ON):遍歷并調用所有注冊的適配器狀態變更回調函數,通知藍牙適配器已進入 “開啟” 狀態(BT_STATE_ON)。

packages/modules/Bluetooth/system/btif/src/bluetooth.cc
void invoke_adapter_state_changed_cb(bt_state_t state) {do_in_jni_thread(FROM_HERE, base::BindOnce([](bt_state_t state) {HAL_CBACK(bt_hal_cbacks,adapter_state_changed_cb, state);},state));
}

藍牙協議棧與 Android 系統框架之間的狀態回調橋梁,主要負責將藍牙適配器的狀態變更(如開啟、關閉)異步通知到 Java 層。確保 Java 層能及時更新藍牙狀態并通知應用。

  • do_in_jni_thread:將任務提交到 JNI 線程( Android 主線程)執行,確保 Java 層回調在正確的線程上下文執行。這是必要的,因為:

    • Android Java 框架的 UI 操作必須在主線程進行;

    • JNI 回調函數通常要求在創建它們的線程中調用,以避免線程安全問題。

  • base::BindOnce:創建一個一次性執行的回調(lambda 函數),并將當前狀態(state)作為參數綁定到該回調中。BindOnce確保回調僅執行一次,執行后自動釋放資源。

  • bt_hal_cbacks:藍牙 HAL 層的回調函數結構體,由 Java 層通過 JNI 注冊到 C++ 層。

  • adapter_state_changed_cb:具體的狀態變更回調函數指針,指向 Java 層實現的狀態處理邏輯。

  • 回調傳遞的狀態值state參數通常是bt_state_t枚舉類型,常見值包括:

/** Bluetooth Adapter State */
typedef enum { BT_STATE_OFF, BT_STATE_ON } bt_state_t;

典型接收者與行為

  • Android Framework 層BluetoothManagerService會監聽此事件,更新系統藍牙狀態(如設置Settings.Global.BLUETOOTH_ON),并廣播ACTION_BLUETOOTH_STATE_CHANGED通知所有應用。

  • 應用層:注冊了BluetoothAdapter.ACTION_STATE_CHANGED廣播的應用會收到通知,更新 UI(如藍牙開關按鈕狀態、已配對設備列表)。

  • 藍牙配置文件:各配置文件(如 A2DP、HID)可能在此時啟動后臺掃描或連接任務(如自動連接上次使用的耳機)。

當用戶在設置中打開藍牙開關時,完整的狀態通知路徑可能為:

1. 用戶點擊Android設置中的藍牙開關 →
2. Java層調用JNI接口觸發藍牙開啟 →
3. 協議棧啟動流程(event_start_up_stack)執行 →
4. 棧啟動完成后調用event_signal_stack_up →
5. event_signal_stack_up調用invoke_adapter_state_changed_cb(BT_STATE_ON) →
6. invoke_adapter_state_changed_cb將回調任務提交到JNI線程 →
7. JNI線程執行HAL層回調,觸發Java層的adapter_state_changed_cb實現 →
8. Java層更新系統狀態(如Settings.Global.BLUETOOTH_ON)并廣播ACTION_BLUETOOTH_STATE_CHANGED

三、流程圖

Android 藍牙棧啟動流程采用分層架構與異步機制設計,通過嚴格的狀態管理、模塊化初始化及錯誤處理機制,確保藍牙功能從軟件初始化到硬件交互的可靠執行。核心設計亮點包括:

  • 異步線程管理實現協議棧啟動與主線程解耦

  • 模塊化初始化保證各協議層按依賴順序加載

  • 雙向狀態同步機制確保底層與上層狀態一致性

  • 完善的錯誤處理流程避免資源泄漏


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88858.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

各種開發語言主要語法對比

各類主流編程語言的語法有著顯著差異,這些差異源于語言設計哲學(簡潔性 vs 顯式性)、應用領域(系統級、Web、數據科學)、運行方式(編譯 vs 解釋)以及支持的范式(面向對象、函數式、過…

小鵬汽車6月交付車輛34,611輛,同比增長224%

小鵬汽車-W(09868)發布公告,2025年6月,小鵬汽車共交付智能電動汽車34,611輛,同比增長224%,這標志著小鵬汽車已連續第八個月交付量超過了30,000輛。2025年第二季度,小鵬汽車共交付103,181 輛智能電動車,創下…

深入理解觀察者模式:構建松耦合的交互系統

在軟件開發中,我們經常遇到這樣的場景:一個對象的狀態變化需要通知其他多個對象,并且這些對象需要根據變化做出相應的反應。比如,用戶界面中的數據變化需要實時反映到多個圖表上,或者電商系統中的庫存變化需要通知訂單…

React強大且靈活hooks庫——ahooks入門實踐之常用場景hook

什么是 ahooks? ahooks 是一個 React Hooks 庫,提供了大量實用的自定義 hooks,幫助開發者更高效地構建 React 應用。其中場景類 hooks 是 ahooks 的一個重要分類,專門針對特定業務場景提供解決方案。 安裝 ahooks npm install …

Qt常用控件之QWidget(一)

Qt常用控件之QWidget(一)1.QWidget2.enabled屬性2.geometry🌟🌟hello,各位讀者大大們你們好呀🌟🌟 🚀🚀系列專欄:【Qt的學習】 📝📝本…

AIOT開發選型:行空板 K10 與 M10 適用場景與選型深度解析

前言 隨著人工智能和物聯網技術的飛速發展,越來越多的開發者、學生和愛好者投身于創意項目的構建。 在眾多的開發板中,行空板 K10 和 M10 以其獨特的優勢脫穎而出。 本文旨在為讀者提供一份詳盡的行空板 K10 和 M10 對比分析,從適用場景、…

redis匯總筆記

語雀完整版: https://www.yuque.com/g/mingrun/embiys/calwqx/collaborator/join?tokensLcLnqz5Rv8hOKEB&sourcedoc_collaborator# 《Redis筆記》 Redis 一般問題 Redis內存模型(I/O多路模型)多路復用IO如何解釋 為什么Redis要使用單線…

STM32用PWM驅動步進電機

硬件介紹:連線:注意這里stp連的是pwm脈沖,dir連的是方向到時候代碼pwm波形就是從這里來的,具體接線根據你的代碼來注意要點:步進電機和舵機驅動是不一樣的,它是根據步長來移動的,所以要開一個中…

力扣25.7.10每日一題——重新安排會議得到最多空余時間 II

Description 今天這道題和昨天類似,只是允許順序變化。 Solution 把會議區間視作桌子,空余時間視作空位,我們要把一個桌子移到別的空位中。 初步想法是枚舉桌子,找一個長度大于等于桌子長度的空位移過去。看上去,找…

IP報文分片與重組原理及實現分析

IP報文分片與重組原理及實現分析 引用: ppp/net/packet/IPFragment.hppp/net/packet/IPFragment.cpp 1. IP分片原理 當IP數據包大小超過MTU(最大傳輸單元)時,路由器/主機將其分割為多個片段傳輸,每個片段包含&…

[python]在drf中使用drf_spectacular

安裝drf_spectacular 文檔 pypi鏈接:https://pypi.org/project/drf-spectacular/ 文檔鏈接:https://drf-spectacular.readthedocs.io/en/latest/readme.html 安裝步驟 在環境中添加 pip install drf-spectacular在setting的INSTALLED_APPS中添加 INSTALLED_APPS [# ALL…

【Datawhale AI 夏令營】 用AI做帶貨視頻評論分析(二)

5.預訓練模型跑分 回顧賽題 回顧賽題任務 挑戰與難點: 標注數據少 ——> 半監督學習 or 數據增強 聚類分析噪點影響嚴重 回顧Baseline 問題: TF-IDF無法捕捉以下語義。聚類分析粗糙,未評估聚類質量。 提升方案: 分類任務…

SPSSPRO:數據分析市場SaaS挑戰者的戰略分析

目錄 第一部分:執行摘要 第二部分:平臺解構:產品、架構與用戶體驗 2.1 SaaS范式轉移:架構與起源 2.2 功能能力:分析師的工具箱 2.3 “智能分析”的價值主張 第三部分:市場滲透與受眾細分 3.1 目標用戶…

低版本hive(1.2.1)UDF實現清除歷史分區數據

目標&#xff1a;通過UDF實現對表歷史數據清除 入參&#xff1a;表名、保留天數N 一、pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

C++中頂層const與底層const

在C中&#xff0c;const關鍵字用于定義常量&#xff0c;但它在指針和引用上下文中會產生兩種不同的常量性&#xff1a;頂層const&#xff08;top-level const&#xff09;和底層const&#xff08;low-level const&#xff09;。理解它們的區別是避免編譯錯誤和提高代碼質量的關…

“SRP模型+”多技術融合在生態環境脆弱性評價模型構建、時空格局演變分析與RSEI指數生態質量評價

集成云端、桌面端等環境&#xff0c;結合遙感云計算、GIS空間分析&#xff0c;R語言統計分析的優勢&#xff0c;以分析生態環境脆弱性的時空演變為主線。通過本課程的學習&#xff0c;您將掌握&#xff1a;第一&#xff0c;收集各類指標數據&#xff0c;構建的“生態壓力度-生態…

算法學習筆記:17.蒙特卡洛算法 ——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

在計算機科學和數學領域&#xff0c;蒙特卡洛算法&#xff08;Monte Carlo Algorithm&#xff09;以其獨特的隨機抽樣思想&#xff0c;成為解決復雜問題的有力工具。從圓周率的計算到金融風險評估&#xff0c;從物理模擬到人工智能&#xff0c;蒙特卡洛算法都發揮著不可替代的作…

Tortoise 設置

如何關閉 Windows 下 TortoiseGit 任務欄里窗口標題的分支顯示 一、引言 TortoiseGit 是一個專為團隊協作設計的 Git 圖形化客戶端&#xff0c;旨在解決版本控制中常見的問題&#xff0c;如沖突、回滾、歷史查看等。本文檔是 TortoiseGit 的使用手冊前言部分&#xff0c;旨在向…

[論文閱讀] 人工智能 + 軟件工程 | AI助力軟件可解釋性:從用戶評論到自動生成需求與解釋

AI助力軟件可解釋性&#xff1a;從用戶評論到自動生成需求與解釋 Automatic Generation of Explainability Requirements and Software Explanations From User ReviewsarXiv:2507.07344 Automatic Generation of Explainability Requirements and Software Explanations From …

C語言---自定義類型(上)(結構體類型)

結構體結構體的定義與聲明結構體其實和數組一樣&#xff0c;都是一些值的集合&#xff0c;只不過數組是一系類相同類型的值&#xff0c;而結構體里邊的成員可以是不同的數據類型。關于它的聲明&#xff0c;所用到的關鍵字是struct。聲明的語法如下&#xff1a;struct 結構體名{…