USB3.0設備控制器驅動分析

一、USB驅動框架分析

? ? ? ? USB控制器作為device的驅動框架分為:gadget Function驅動、gadget Function API、Composite以及UDC驅動。

  • gadget Function 驅動
    • 解釋:是針對 USB 設備特定功能的驅動程序。
    • 功能:負責實現 USB 設備對外提供的具體功能,比如一個 USB 存儲設備的 gadget Function 驅動,就負責處理數據的讀寫操作等與存儲功能相關的任務 。
  • gadget Function API
    • 解釋:為 gadget Function 驅動提供的一組應用程序接口。
    • 功能:方便開發者在編寫 gadget Function 驅動時調用,使驅動能夠更好地與上層應用以及下層的其他組件交互,實現不同功能模塊之間的通信和數據傳遞。
  • Composite
    • 解釋:用于組合多個 gadget Function,使一個 USB 設備可以同時提供多種功能。
    • 功能:比如一個多功能的 USB 設備,既可以作為存儲設備,又可以作為音頻設備,Composite 就負責將這兩種功能整合起來,讓設備以一個整體的形式被主機識別和使用。
  • UDC 驅動
    • 解釋:USB Device Controller 驅動,即 USB 設備控制器驅動。
    • 功能:負責管理 USB 設備控制器硬件,處理與硬件相關的底層操作,比如數據的傳輸控制、設備狀態的監測和管理等,是連接硬件和上層軟件的關鍵橋梁 。

1.USB控制器作為Host的時候(USB主機控制器),使用USB主機控制器驅動。USB控制器作為Device時(USB設備控制器)。使用UDC(usb device controller)驅動。

USB控制器作為Device時,驅動架構為

上層 gadget function 驅動(代表具體設備驅動),比如存儲設備:移動硬盤、U 盤設備;通訊設備:USB 串口、USB 虛擬網卡等;UAC 驅動(USB 聲卡、USB 音頻設備)。
gadget function API(抽象層),向上和向下提供統一的標準接口 API。
composite 中間層(支持多種功能的設備與 USB 復合設備驅動的開發)。

USB控制器是計算機系統中用于管理USB通信的硬件組件。它可以作為Host(主機)或Device(設備)。

  • 作為Host(主機控制器)?:當USB控制器作為Host時,它負責管理和控制連接到它的所有USB設備。例如,電腦的USB端口就是一個Host控制器,它可以連接鍵盤、鼠標、U盤等設備。
  • 作為Device(設備控制器)?:當USB控制器作為Device時,它是一個被連接到Host的設備。例如,U盤、鼠標、鍵盤等都是Device。

2.gadget function驅動使用usb_function_driver數據結構進行描述:

usb_function_driver?結構體

這個結構體定義了一個 USB 功能驅動程序的基本信息和操作方法。

重要成員:

  1. const char *name:

    • 功能: 用于標識該功能驅動程序的名稱。
    • 使用: 在注冊功能驅動程序時,需要提供一個唯一的名稱,以便在系統中識別和引用。
  2. struct module *mod:

    • 功能: 指向該功能驅動程序所屬的模塊。
    • 使用: 用于模塊管理,確保在模塊卸載時能夠正確地清理資源。
  3. struct list_head list:

    • 功能: 用于將該功能驅動程序鏈接到一個全局的鏈表中。
    • 使用: 內核通過這個鏈表來管理和查找所有已注冊的功能驅動程序。
  4. struct usb_function_instance *(*alloc_inst)(void):

    • 功能: 用于創建并初始化一個?usb_function_instance?實例。
    • 使用: 當需要使用該功能時,調用這個函數來創建一個實例,并進行必要的初始化操作。
  5. struct usb_function *(*alloc_func)(struct usb_function_instance *inst):

    • 功能: 用于創建并初始化一個?usb_function?實例。
    • 使用: 在創建?usb_function_instance?實例之后,調用這個函數來創建一個具體的?usb_function?實例,并進行進一步的初始化。

usb_function結構體:
usb_function
?結構體描述了一個具體的 USB 功能模塊,它包含了功能模塊的名稱、描述符、配置信息等一個 USB 設備可以包含多個功能模塊,每個功能模塊都對應一個?usb_function?實例。

重要成員及其功能:

    1. const char *name:

      • 功能: 用于標識該功能模塊的名稱。
      • 使用: 在注冊功能模塊時,需要提供一個唯一的名稱,以便在系統中識別和引用。
    2. struct usb_gadget_strings**strings:

      • 功能: 用于存儲該功能模塊的字符串描述符。
      • 使用: 當 USB 主機請求字符串描述符時,通過這個成員來提供相應的字符串信息。
    3. struct usb_descriptor_header**fs_descriptors:

      • 功能: 用于存儲該功能模塊的全速描述符。
      • 使用: 當 USB 設備工作在全速模式時,通過這個成員來提供相應的描述符信息。

?

3. gadget function api(抽象層):上層為function 驅動,使用function api注冊和注銷,下層為composite驅動使用function api和function驅動綁定和匹配。function驅動要實現usb_function_driver數據結構并向function api層注冊,具體api如下:

1.?usb_function_register?函數

功能:

usb_function_register?函數用于向USB gadget框架注冊一個新的USB功能驅動。注冊后,該功能驅動可以被USB gadget設備使用,以提供特定的USB功能(如串口、網絡、存儲等)。

參數:
  • struct usb_function_driver *newf:指向要注冊的新USB功能驅動的結構體指針。這個結構體包含了功能驅動的名稱、功能實現函數等信息。
使用案例:

假設我們正在開發一個USB gadget設備,該設備需要提供一個虛擬串口功能。我們可以編寫一個虛擬串口功能驅動,并使用usb_function_register函數將其注冊到USB gadget框架中。

// 定義虛擬串口功能驅動結構體
static struct usb_function_driver my_serial_driver = {.name = "my_serial",.fops = &my_serial_fops,.bind = my_serial_bind,.unbind = my_serial_unbind,// 其他功能實現函數...
};// 在設備初始化時注冊虛擬串口功能驅動
static int __init my_gadget_init(void)
{int ret;// 注冊虛擬串口功能驅動ret = usb_function_register(&my_serial_driver);if (ret < 0) {printk(KERN_ERR "Failed to register my_serial driver\n");return ret;}printk(KERN_INFO "my_serial driver registered successfully\n");return 0;
}module_init(my_gadget_init);

2.?usb_function_unregister?函數

功能:

usb_function_unregister?函數用于從USB gadget框架中注銷一個已注冊的USB功能驅動。注銷后,該功能驅動將不再被USB gadget設備使用。

參數:
  • struct usb_function_driver *fd:指向要注銷的USB功能驅動的結構體指針。
使用案例:

假設我們之前注冊了一個虛擬串口功能驅動,現在由于某種原因(如設備配置變更、驅動更新等),需要將該功能驅動從USB gadget框架中注銷。

// 在設備配置變更時注銷虛擬串口功能驅動
static void my_gadget_config_change(void)
{// 注銷虛擬串口功能驅動usb_function_unregister(&my_serial_driver);printk(KERN_INFO "my_serial driver unregistered successfully\n");
}module_init(my_gadget_init);

?

1.?usb_get_function_instance?函數

參數和功能
  • 參數:
    • const char *name: 一個字符串,表示要獲取的USB功能實例的名稱。
  • 功能:
    該函數從gadget function API層獲取一個指定名稱的usb_function_instance結構體實例。這個實例代表了一個特定的USB功能(如Mass Storage、Ethernet等),并且可以被USB gadget設備使用。
使用案例

假設你正在開發一個USB gadget設備,該設備需要提供一個Mass Storage功能,以便其他設備可以通過USB接口訪問存儲在設備上的文件。

// 獲取名為"mass_storage"的USB功能實例
struct usb_function_instance *fi = usb_get_function_instance("mass_storage");if (!fi) {// 處理獲取實例失敗的情況printk(KERN_ERR "Failed to get mass storage function instance\n");return -ENODEV;
}// 使用獲取到的實例進行進一步的配置和使用
// ...

2.?usb_put_function_instance?函數

參數和功能
  • 參數:
    • struct usb_function_instance *fi: 一個指向usb_function_instance結構體的指針,表示要釋放的USB功能實例。
  • 功能:
    該函數用于釋放一個之前通過usb_get_function_instance獲取的USB功能實例。這通常在不再需要使用該功能實例時調用,以釋放相關的資源。
使用案例

假設你在之前獲取了一個USB功能實例,并且在完成相關操作后,不再需要使用這個實例了。

// 假設fi是之前通過usb_get_function_instance獲取的實例
struct usb_function_instance *fi;// ... 使用fi進行相關操作 ...// 完成操作后,釋放USB功能實例
usb_put_function_instance(fi);

usb_get_function
  • 參數:
    • struct usb_function_instance *fi: 這是一個指向usb_function_instance結構體的指針。usb_function_instance代表一個USB功能實例,它包含了配置和初始化USB功能所需的信息。
  • 功能:
    • 該函數從usb_function_instance中獲取一個usb_function結構體指針。usb_function結構體描述了具體的USB功能,例如一個USB設備的特定功能模塊(如USB存儲、USB網絡等)。

????????使用案例:假設你正在開發一個USB設備驅動程序,該設備需要支持USB存儲功能。你需要從USB功能實例中獲取USB存儲功能的描述信息,以便進一步配置和使用該功能。

// 假設fi是一個已經初始化好的usb_function_instance結構體指針
struct usb_function_instance *fi = ...;// 從fi中獲取USB存儲功能的描述信息
struct usb_function *storage_func = usb_get_function(fi);if (storage_func) {// 配置和使用USB存儲功能// 例如,設置存儲容量、文件系統等configure_storage_function(storage_func);use_storage_function(storage_func);
} else {// 處理獲取功能失敗的情況printk(KERN_ERR "Failed to get USB storage function\n");
}
usb_put_function
  • 參數:
    • struct usb_function *f: 這是一個指向usb_function結構體的指針。usb_function結構體描述了具體的USB功能。
  • 功能:
    • 該函數用于釋放一個usb_function結構體。它通過調用f->free_func(f)來執行釋放操作,確保資源被正確清理。

????????使用案例:假設你已經使用完了一個USB功能(例如USB存儲功能),現在需要釋放該功能所占用的資源,以避免內存泄漏和資源浪費。

// 假設storage_func是一個已經使用完的usb_function結構體指針
struct usb_function *storage_func = ...;// 釋放USB存儲功能
usb_put_function(storage_func);// 此時storage_func所指向的資源已經被正確釋放,可以安全地將其置為NULL
storage_func = NULL;

?

4.在Linux內核中直接使用composite層的USB gadget legacy驅動(如USB音頻設備驅動文件audio.c USB虛擬以太網設備驅動文件ether.c等等)。USB gadget configfs屬于文件系統,可以在用戶空間直接控制內核對象。主要適用于對象很多配置的模塊。

一、Legacy驅動(如audio.c、ether.c)

1.?基本概念
  • 定位:Legacy驅動是早期Linux內核中USB Gadget的配置方式,通過直接編寫內核代碼實現功能()。
  • 特點
    • 靜態配置:需要在內核源碼中定義功能和參數(如VID/PID),重新編譯內核才能生效。
    • 單一功能為主:每個驅動文件(如audio.cether.c)通常只實現單一功能(如音頻設備或虛擬網卡)。
    • 依賴Composite框架:通過module_usb_composite_driver宏注冊驅動,將多個功能(Function)組合成一個復合設備()。
2.?示例:Legacy驅動的使用

例如,若要將設備配置為USB音頻設備:

  1. 在內核配置中啟用CONFIG_USB_G_AUDIO
  2. 加載模塊:modprobe g_audio
  3. 設備會被主機識別為一個USB音頻設備。

缺點:靈活性差,修改配置需重新編譯內核,無法動態組合多個功能。


二、USB Gadget ConfigFS

1.?基本概念
  • 定位:ConfigFS是一種基于內存的虛擬文件系統,允許用戶空間通過目錄和文件動態配置內核對象。
  • 特點
    • 動態配置:無需修改內核代碼,通過腳本或命令行動態組合功能。
    • 模塊化:內核提供獨立的功能模塊(如uac2mass_storageecm等),用戶按需組合。
    • 用戶空間控制:通過創建目錄、寫入屬性文件、建立符號鏈接完成配置。
2.?核心原理
  • ConfigFS掛載:將ConfigFS掛載到/sys/kernel/config目錄,生成usb_gadget子目錄。
  • 配置步驟
    1. 創建Gadget模板:在usb_gadget下新建目錄(如g1),設置VID/PID、字符串描述符等。
    2. 添加功能(Function)?:在functions子目錄下創建功能實例(如uac2.0ecm)。
    3. 綁定功能到配置:在configs目錄下創建配置,通過符號鏈接將功能關聯到配置。
    4. 綁定UDC控制器:將Gadget綁定到USB設備控制器(UDC),激活設備。
3.?示例:通過ConfigFS配置USB音頻+網卡
# 掛載ConfigFS
mount -t configfs none /sys/kernel/config
cd /sys/kernel/config/usb_gadget# 創建Gadget模板
mkdir g1
cd g1
echo 0x1d6b > idVendor    # Linux Foundation的VID
echo 0x0104 > idProduct   # 復合設備PID
mkdir strings/0x409       # 英文語言ID
echo "123456" > strings/0x409/serialnumber
echo "My Company" > strings/0x409/manufacturer
echo "Composite Device" > strings/0x409/product# 添加音頻功能(uac2)
mkdir functions/uac2.0# 添加網卡功能(ecm)
mkdir functions/ecm.usb0# 創建配置并綁定功能
mkdir configs/c.1
mkdir configs/c.1/strings/0x409
echo "Config 1" > configs/c.1/strings/0x409/configuration
ln -s functions/uac2.0 configs/c.1/
ln -s functions/ecm.usb0 configs/c.1/# 綁定UDC控制器(假設UDC為fe200000.dwc3)
echo "fe200000.dwc3" > UDC

三、Legacy驅動與ConfigFS的對比

四、實際應用場景

  1. Legacy驅動

    • 嵌入式設備中功能固定的場景(如僅需作為U盤)。
    • 示例:加載g_ether模塊,直接生成虛擬網卡(。
  2. ConfigFS

    • 開發調試:快速測試不同功能組合。
    • 復雜設備:如手機通過USB同時提供MTP、ADB、RNDIS等功能(。
    • 動態切換配置:通過腳本切換設備模式(如從U盤模式切換到聲卡模式)。

5.UDC驅動函數接口:內核初始化和模塊加載初始化

1.?usb_udc_init?函數

功能:

usb_udc_init?函數用于初始化 USB UDC(USB Device Controller)驅動。它創建了一個名為 "udc" 的設備類,并設置了一個設備事件處理函數?usb_udc_uevent。如果創建設備類失敗,函數會返回相應的錯誤碼。

使用案例:

假設你正在開發一個基于 Linux 內核的 USB 設備驅動程序,需要初始化 UDC 驅動。在驅動程序的初始化代碼中,你可以調用?usb_udc_init?函數來完成 UDC 驅動的初始化工作。

?

static int __init my_usb_driver_init(void)
{int ret;ret = usb_udc_init();if (ret) {pr_err("Failed to initialize UDC driver\n");return ret;}// 其他初始化代碼return 0;
}

2.?usb_add_gadget_udc?函數

功能:

usb_add_gadget_udc?函數用于將一個 USB gadget 設備添加到 UDC 驅動中。它接收一個?struct device *parent?和一個?struct usb_gadget *gadget?作為參數,并將?gadget?添加到 UDC 鏈表中。

使用案例:

假設你有一個 USB gadget 設備需要添加到 UDC 驅動中,可以在設備的初始化代碼中調用?usb_add_gadget_udc?函數。

static int __init my_usb_gadget_init(void)
{struct device *parent = /* 獲取 parent 設備 */;struct usb_gadget *gadget = /* 初始化 gadget 設備 */;int ret = usb_add_gadget_udc(parent, gadget);if (ret) {pr_err("Failed to add gadget to UDC\n");return ret;}// 其他初始化代碼return 0;
}

3.?usb_del_gadget_udc?函數

功能:

usb_del_gadget_udc?函數用于從 UDC 驅動中刪除一個 USB gadget 設備。它接收一個?struct usb_gadget *gadget?作為參數,并從 UDC 鏈表中移除該?gadget

使用案例:

假設你需要在驅動程序的退出代碼中刪除一個 USB gadget 設備,可以在退出函數中調用?usb_del_gadget_udc?函數。

static void __exit my_usb_gadget_exit(void)
{struct usb_gadget *gadget = /* 獲取 gadget 設備 */;usb_del_gadget_udc(gadget);// 其他清理代碼
}

6.了解UDC驅動使用usb_udc數據結構進行描述,我們注冊所有的usb_udc都會掛接到udc_list鏈表。usb_gadget_ops是USB設備控制器的硬件操作函數(包含開啟USB設備控制器、停止USB設備控制器,vbus電源等功能)

?

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

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

相關文章

《Redis 入門指南:快速掌握高性能緩存技術》

目錄 一、準備工作 二、操作數據庫 2.1 切換數據庫 2.2 存儲和查看數據 一、存儲語法 二、一次性存儲多個鍵值對 三、追加值 四、查看值的類型 五、查詢值 六、一次查詢多個值 七、查看當下數據庫所有的鍵 八、刪除鍵 九、查看 鍵 是否存在 十、重命名鍵 2.3 過期…

跨部門溝通與團隊協作

【跨部門協作&#xff1a;破局之道在冰山之下】 感謝太原市組織部信任&#xff0c;上海財經大學邀約 今日為財務精英拆解《跨部門溝通與團隊協作》迷局。從本位思維到共同愿景&#xff0c;用因果回路圖透視沖突本質&#xff0c;當財務人開始用"延遲反饋"視角看預算博…

【零基礎到精通Java合集】第一集:Java開發環境搭建

以下是針對**“Java開發環境搭建”**的15分鐘課程內容設計,包含知識點拆分、實操演示與互動練習: 課程標題:Java開發環境搭建(15分鐘) 目標:完成JDK安裝、IDE配置并運行第一個Java程序 一、課程內容與時間分配 0-2分鐘 課程目標與前置準備 明確學習目標:JDK安裝、環境…

【JavaEE】wait 、notify和單例模式

【JavaEE】wait 、notify 和單例模式 一、引言一、wait()方法二、notify()方法三、notifyAll()方法四、wait&#xff08;&#xff09;和sleep&#xff08;&#xff09;對比五、單例模式5.1 餓漢模式5.2 懶漢模式5.2 懶漢模式-線程安全&#xff08;改進&#xff09; 博客結尾有此…

http報文的content-type參數和spring mvc傳參問題

很早之前博主聊過HTTP的報文結構以及其中和傳參相關的重要參數content-type還有spring mvc&#xff0c;以前的三篇文章&#xff1a; HTTP與HTTPS協議詳解&#xff1a;基礎與安全機制-CSDN博客 詳解Http的Content-Type_content-type application-CSDN博客 如何在Spring Boot中…

‘ts-node‘ 不是內部或外部命令,也不是可運行的程序

新建一個test.ts文件 let message: string = Hello World; console.log(message);如果沒有任何配置的前提下,會報錯’ts-node’ 不是內部或外部命令,也不是可運行的程序。 此時需要安裝一下ts-node。 npm install

《白帽子講 Web 安全:點擊劫持》

目錄 摘要&#xff1a; 一、點擊劫持概述 二、點擊劫持的實現示例&#xff1a;誘導用戶收藏指定淘寶商品 案例 構建惡意頁面&#xff1a; 設置絕對定位和z - index&#xff1a; 控制透明度&#xff1a; 三、其他相關攻擊技術 3.1圖片覆蓋攻擊與 XSIO 3.2拖拽劫持與數據…

基于機器學習的圖像分類綜述

圖像分類是計算機視覺和模式識別領域的核心任務之一,其目標是從輸入的圖像中自動識別并標注其所屬的類別標簽。基于機器學習的圖像分類技術近年來取得了顯著進展,尤其是在深度學習的推動下,性能得到了質的提升,并在多個實際應用中表現出色。 以下是對基于機器學習的圖像分…

SQL Server 中行轉列

在 SQL Server 數據庫中&#xff0c;行轉列在實踐中是一種非常有用&#xff0c;可以將原本以行形式存儲的數據轉換為列的形式&#xff0c;以便更好地進行數據分析和報表展示。本文將深入淺出地介紹 SQL Server 中的行轉列技術&#xff0c;并以數據表中的時間數據為例進行詳細講…

系統架構設計師—計算機基礎篇—系統性能評價

文章目錄 性能評價指標主頻CPU時鐘周期機器周期CPIMIPS 系統性能調整阿姆達爾解決方案性能優化數據庫應用系統Web應用系統 性能評估方法評價程序真實程序基準測試程序核心程序小型基準程序合成基準程序 基準測試程序組 評測準確度 性能指標計算機數據庫應用系統Web應用系統 性能…

web3.0簡介

Web3.0&#xff08;或簡稱 Web3&#xff09;是近年來廣泛討論的一個新型互聯網概念&#xff0c;其核心思想在于利用區塊鏈及相關分布式技術&#xff0c;打造一個更加開放、去中心化、透明且以用戶為主導的網絡生態系統。這意味著在 Web3.0 時代&#xff0c;用戶不再只是信息的消…

python第十一課:并發編程 | 多任務交響樂團

&#x1f3af; 本節目標 理解多線程/多進程/協程的應用場景掌握threading與multiprocessing核心用法學會使用asyncio進行異步編程開發實戰項目&#xff1a;高并發爬蟲引擎破解GIL鎖的性能迷思 1?? 并發編程三劍客 &#x1f3bb; 生活化比喻&#xff1a; 多線程 → 餐廳多個…

微服務架構實踐:SpringCloud與Docker容器化部署

## 微服務架構實踐&#xff1a;SpringCloud與Docker容器化部署 隨著互聯網應用的復雜性不斷增加&#xff0c;傳統的單體應用架構面臨著諸多挑戰&#xff0c;如難以部署、維護困難、開發效率低下等問題凸顯出來。為了解決這些問題&#xff0c;微服務架構應運而生&#xff0c;它通…

SpringBoot實戰(三十二)集成 ofdrw,實現 PDF 和 OFD 的轉換、SM2 簽署OFD

目錄 一、OFD 簡介 1.1 什么是 OFD&#xff1f;1.2 什么是 版式文檔&#xff1f;1.3 為什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 簡介 2.1 定義2.2 Maven 依賴2.3 ofdrw 的 13 個模塊 三、PDF/文本/圖片 轉 OFD&#xff08;ofdrw-conterver&#xff09; 3.1 介紹&#xf…

隨機樹算法 自動駕駛汽車的路徑規劃 靜態障礙物(Matlab)

隨著自動駕駛技術的蓬勃發展&#xff0c;安全、高效的路徑規劃成為核心挑戰之一。快速探索隨機樹&#xff08;RRT&#xff09;算法作為一種強大的路徑搜索策略&#xff0c;為自動駕駛汽車在復雜環境下繞過靜態障礙物規劃合理路徑提供了有效解決方案。 RRT 算法基于隨機采樣思想…

Vscode通過Roo Cline接入Deepseek

文章目錄 背景第一步、安裝插件第二步、申請API key第三步、Vscode中配置第四步、Deepseek對話 背景 在前期介紹【IDEA通過Contince接入Deepseek】步驟和流程&#xff0c;那如何在vscode編譯器中使用deepseek&#xff0c;記錄下來&#xff0c;方便備查。 第一步、安裝插件 在…

C++ 二叉樹代碼

二叉樹代碼&#xff0c;見下 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL)TreeNode(T x):val(x), left(NULL), right(NULL){} };template&l…

leetcode第17題求電話號碼組合

原題出于leetcode第17題https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/題目如下&#xff1a; 題目稍微有點復雜&#xff0c;初看會感覺特別復雜&#xff0c;首先我們需要理清思路&#xff1a; 最后的結果是字母組合&#xff0c;因此遍歷的是…

Deepseek對ChatGPT的沖擊?

從測試工程師的視角來看&#xff0c;DeepSeek對ChatGPT的沖擊主要體現在**測試場景的垂直化需求與通用模型局限性之間的博弈**。以下從技術適配性、效率優化、風險控制及未來趨勢四個維度展開分析&#xff1a; --- ### **一、技術適配性&#xff1a;垂直領域能力決定工具選擇…

三十五周學習周報

目錄 摘要abstract文獻閱讀1.1相關知識1.1.1 PSO1.1.2 BI-LSTM1.1.3 BI-GRU 1.2 整體框架1.3 實驗分析 總結 摘要 在本周閱讀的文獻中&#xff0c;作者提出了一種創新的水文時間序列預測模型&#xff0c;其通過將粒子群優化&#xff08;PSO&#xff09;與Bi-LSTM和Bi-GRU相結合…