【发布时间】:2012-02-23 01:07:12
【问题描述】:
在使用 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 数据“没有绕过”,有时读取之间的等待时间长达 12 毫秒,导致大量数据丢失。
有人有什么想法吗? DMA?对内核的某种“实时”请求?
【问题讨论】:
-
你的手机是什么类型的,安卓版本是什么等
-
两台平板电脑,一台 Toshiba Thrive 和一台 ASUS Transformer,均运行 Android 3.2.1,均已植根。 (对不起,我忘了在原帖中提到这一点。)
-
@Greg 我有完全相同的问题 (stackoverflow.com/questions/10889461/…)。你找到解决办法了吗?
-
@REACHUS - 经过数周的尝试,我终于确定 Android 平台根本无法跟上高速、“固定速率”的 USB 数据流。我放弃并在我的设计中添加了一个硬件 FIFO 缓冲区以进行补偿,这使我能够以 Android 的最大速率输出数据(具有讽刺意味的是,这比我想要的整体速度要快,但在我假设系统是间歇性间隙的情况下困扰着我只是“处理其他事件”。)
-
我尝试了我能想到的一切(当我试图在软件中解决这个问题时)。我最终通过向设备添加一个 8MB FIFO 来解决这个问题,这使我能够以“Android 速度”提取数据。我记得,我没有“流水线”任何东西,我只是在完成一个请求后立即提出另一个请求(当时的设备有一个 4K 缓冲区,所以我期待/希望 Android 总是准备好迎接下一个缓冲区填充之前的数据包 - 它成功地完成了 99% 的时间)。如果我有机会尝试管道,我会在此处发布结果。