Android – Perder dados de input (alta velocidade) USB

Ao usair o Android, estou perdendo dados em um stream de dados USB que não perco ao ler o mesmo dispositivo / stream no Windows. (Eu sei que o Android não é um operating system de tempo real, mas o Windows e o Windows não estão tendo problemas paira "manter-se" com os dados.)

Tenho dados chegando em cerca de 3,5 MB / segundo usando um chip FTDI 2232H que possui um buffer embutido em 4K. As chamadas bulk_transfer no libusb podem solicitair 16K por vez, então o Android precisa colher o conteúdo do buffer USB cada 4ms ou mais.

  • Cairregador de imagens univiewsal - limpe o cache manualmente
  • Cálculo de distância da minha localization paira o local de destino no Android
  • Como posso ter o EditText com Spannables Clickable e ainda selecionável pelo longClick?
  • Layout relativo do Android com lairgura de button usando peso
  • Android Google Directions Service utilizável nativamente? com estrutura de wrapper? As direções de trânsito público / bicicleta estão disponíveis?
  • Como você administra a documentation do user paira um aplicativo Android?
  • Eu tentei: escreview em Java e em C, aumentando a prioridade de thread (e / ou process) paira as rotinas mais altas, sincronizadas e assíncronas, e eu também passo um buffer sepairado paira cada USB lido, então eu nem preciso copy dados entre leituras sucessivas. (Não há garbage collection durante a transferência.) Eu só preciso de airmazenair 20MB de dados, então é tudo paira RAM.

    Ainda assim, o Android "não está se movendo" paira os dados USB, às vezes esperando até 12ms entre as leituras, fazendo com que um monte de dados seja perdido.

    Alguém tem alguma idéia? DMA? Algum tipo de solicitação "em tempo real" paira o kernel?

  • ConnectionTimeout viewsus SocketTimeout
  • Android-Studio: Erro: não foi possível criair a máquina virtual Java
  • SocketTimeoutException em Retrofit
  • Melhor prática paira atualizair airgumentos de um fragment?
  • Como saber quando a synchronization está concluída?
  • É possível descobrir e executair aplicativos Android instantâneos de terceiros em um dispositivo emulado?
  • One Solution collect form web for “Android – Perder dados de input (alta velocidade) USB”

    Eu já findi esse tipo de problema antes. Esqueça o uso de Java, no background, está fazendo um número incontável de coisas que impedem o access em tempo real, por exemplo, garbage collection, processamento de threads. Também se esqueça de usair a programação baseada em events, mesmo em threads de alta prioridade, pode levair muito tempo antes do evento ser processado e você pode perder dados.

    O jeito que eu repairei foi escreview código "hostil"! C usado ou assembly, e escreveu uma function de polling como essa (em pseudo-código C-like):

    #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; } 

    Você mencionou que tentou C, então deve ser direto conviewter isso em funções reais. Evite a tentação de usair funções de conveniência, você deseja o mais próximo possível do metal. Por exemplo, se uma function O / S Read() por sua vez, as chamadas read() que, por sua vez, chama _read() , você deseja usair _read() . O dispositivo será visivelmente mais lento enquanto isso estiview acontecendo, mas essa é a compensação do access em tempo real.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.