2012-02-23 21 views
33

使用Android時,我正在丟失傳入USB數據流上的數據,在Windows中讀取相同設備/數據流時,我不會丟失數據。 (我知道Android不是實時操作系統,但Windows也不是,而且Windows跟數據保持一致沒有問題。)Android - 丟失傳入的(高速)USB數據

我有數據以大約3.5MB /秒的速度進入,使用FTDI 2232H芯片,內置4K緩衝器。 libusb中的bulk_transfer調用一次可以請求16K,所以Android需要每4ms調整USB緩衝區的內容。

我嘗試過:在Java和C中編寫,將線程(和/或進程)優先級提高到最高,同步和異步例程,我甚至爲每個USB讀取傳遞一個單獨的緩衝區,所以我不甚至必須在連續讀取之間複製數據。 (在傳輸過程中沒有垃圾收集。)我只需要緩衝20MB的數據,所以全部都是RAM。儘管如此,Android還沒有到達USB數據,有時候在讀取之間等待12ms,導致一堆數據丟失。

有沒有人有任何想法? DMA?對內核的某種「實時」請求?

+0

你有什麼類型的手機,什麼樣的Android版本等。 – PearsonArtPhoto 2012-02-23 14:58:31

+0

兩款平板電腦,一款東芝Thrive和一款華碩變形金剛,均運行Android 3.2.1,兩者均紮根。 (對不起,我忘了在原帖中提到) – Greg 2012-02-23 19:54:21

+0

@Greg我有完全相同的問題(http://stackoverflow.com/questions/10889461/android-usb-host-api-bulk-transfer-buffer-size )。你有沒有找到解決辦法? – syntagma 2012-06-25 07:54:47

回答

5

我以前遇到過這種問題。忘記使用Java,在後臺它做了許多阻止實時訪問的事情,例如垃圾收集,線程處理。即使在高優先級的線程中,也忘記使用事件驅動的編程,在處理事件之前可能需要很長時間,並且可能會丟失數據。

我修正它的方法是編寫「不友好」的代碼!二手C或彙編,並寫了這樣的查詢功能(在C類僞代碼):

#define PAUSE 2 /* Check twice as often as the packet rate */ 
#define TIMEOUT (500/PAUSE) /* Abort if half a second of no data */ 

/* Provide handle, data buffer and size of buffer 
    Returns TRUE if full buffer read, FALSE if not, data unread in size 
*/ 
BOOL real_time_read(HANDLE handle, BYTE *data, size_t *size) 
{ 
    BOOL result = FALSE; 
    int timeout = TIMEOUT; 

    set_thread_priority(REALTIME); 

    while (is_handle_valid(handle)) 
    { 
     if (is_data_pending(handle)) 
     { 
      size_t count = get_data(handle, data, size); 
      data += count; 
      *size -= count; 
      if (!*size) 
      { 
       result = TRUE; 
       break; 
      } 
     } 
     else if (!--timeout) 
      break; 

     /* Give a tiny time slice to other processes */ 
     usleep(PAUSE); 
    } 

    return result; 
} 

你提到你嘗試C,所以它應該是簡單的將其轉換爲真正的功能。避免使用便利功能的誘惑,你希望儘可能接近金屬。例如。如果操作系統功能Read()又調用read(),然後調用_read(),則要使用_read()。 在這種情況發生時,設備會明顯變慢,但這是實時訪問的折衷。

+1

我不敢相信我沒有試過'REALTIME'---文檔讓我相信最重要的設置是'URGENT_AUDIO'(-19而不是-20)。從硬件上解決了這個問題後,我可能沒有機會嘗試'REALTIME',但如果我這樣做,我會在這裏發佈結果。 (見上面對'dragonroot'的迴應。) – Greg 2013-01-28 03:41:25

+0

因爲我也要嘗試解決[我的問題](http://stackoverflow.com/questions/10889461/android-usb-host-api-bulk-transfer-buffer-大小)這種方式,你能詳細解釋一下這個解決方案嗎? C中有多少完整的解決方案(除了引用的引用和使用的引用外,還有其他功能)?之後在使用NDK連接Java應用程序時遇到麻煩了嗎? – syntagma 2013-04-10 07:26:08

+0

你用什麼設備進行測試? – syntagma 2013-04-10 07:32:49