跳至內容
測試伺服器
開發伺服器

Linux 上的 USB 3.0 錯誤「Failed to Submit Transfer Status=0xe2100001」#

問題#

若您在Linux 上使用 USB 3.0 攝影機,並提高了傳輸層 MaxTransferSize 若將參數設定為大於 65536 位元組的值,您可能會在主控台反覆收到以下錯誤訊息:

Failed to submit transfer status=0xe2100001.

擴增傳輸層 MaxTransferSize 此參數通常能降低 CPU 負載,因為它可減少資料開銷並降低 CPU 中斷的發生頻率。在Linux 上,「最大傳輸大小」的上限約為 3 MB。

出現此錯誤訊息的原因是,核心模組「usbcore」沒有足夠的記憶體來處理所要求的 USB 請求區塊 (URB) 大小。預設情況下,「usbcore」約有 16 MB 的可用記憶體。

所要求的 URB 大小計算方式如下:

最大傳輸大小 × 最大佇列 URB 數量

預設情況下,「佇列中 URB 的最大數量」設定為 64。

解決方案#

為避免出現上述錯誤訊息,請依下列步驟操作:

  1. 使用上述公式並將 NumMaxQueuedUrbs 請在 `pylon Viewer ` 或您的應用程式中調整該值,直到錯誤訊息消失為止。
  2. 為核心模組「usbcore」分配更多記憶體:

    1. 若要查詢目前已分配的記憶體量(以 MB 為單位),請在主控台中執行以下指令:

      cat /sys/module/usbcore/parameters/usbfs_memory_mb
      
    2. 若要僅針對當前工作階段增加記憶體(例如增加至 32 MB),請以 root 身分登入並執行以下指令:

      echo -n 32 > /sys/module/usbcore/parameters/usbfs_memory_mb
      

如何永久增加已分配的記憶體,取決於所使用的Linux 發行版。

對於採用「grub2」的 Ubuntu,可以採取以下步驟:

  1. 編輯檔案:/etc/default/grub。
  2. 變更變數: GRUB_CMDLINE_LINUX為所有類別設定合理的預設值開始。例如:
    GRUB_CMDLINE_LINUX="usbcore.usbfs_memory_mb=32"
    
  3. 以 root 身分執行以下指令,然後重新啟動系統:
    update-grub
    

返回知識文章