Android – 丢失传入(高速)USB数据

在使用Android时,我正在丢失传入的USB数据stream上的数据,在Windows中读取相同的设备/数据stream时,我不会丢失数据。 (我知道Android不是实时操作系统,但Windows也不是,而且Windows跟数据保持一致没有问题。)

我使用内置4K缓冲区的FTDI 2232H芯片以3.5MB /秒的速度传输数据。 libusb中的bulk_transfer调用一次可以请求16K,因此Android需要每4ms收集USB缓冲区的内容。

我已经尝试过:用Java和C编写,将线程(和/或进程)优先级提高到最高,同步和asynchronous例程,甚至为每个USB读取传递一个单独的缓冲区,所以我甚至不需要复制连续读取之间的数据。 (在传输过程中没有垃圾收集)我只需要缓冲20MB的数据,所以全部都是RAM。

尽pipe如此,Android还是不愿意使用USB数据,有时候在读取之间等待12ms,导致大量数据丢失。

有没有人有任何想法? DMA? 对内核的某种“实时”请求?

Solutions Collecting From Web of "Android – 丢失传入(高速)USB数据"

我以前遇到过这样的问题。 忘记使用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,所以它应该是直接转换成真正的function。 避免使用便利function的诱惑,你希望尽可能靠近金属。 例如,如果一个O / S函数Read()依次调用read() ,而read()又调用_read()_read()使用_read() 。 在这种情况下,设备会明显变慢,但这是实时访问的折衷。