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

Gre*_*reg 34 usb android real-time

使用Android时,我丢失了传入USB数据流的数据,在Windows中读取相同的设备/流时我不会丢失这些数据.(我知道Android不是一个实时操作系统,但Windows也不是,而Windows在跟上数据方面没有问题.)

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

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

尽管如此,Android还是"没有绕过"USB数据,有时在读取之间等待长达12ms,导致一堆数据丢失.

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

Yim*_*ong 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;
}
Run Code Online (Sandbox Code Playgroud)

你提到你试过C,所以将它转换成实际函数应该很简单.避免使用便利功能的诱惑,您希望尽可能接近金属.例如,如果O/S功能Read()依次调用read()哪个调用_read(),则需要使用_read().在此过程中,设备会明显变慢,但这是实时访问的权衡.