Pergunta

Gostaríamos de apoiar algum hardware que foi recentemente descontinuado. O controlador para o hardware é um simples de 32 bits DLL C. Não temos o código fonte, e (por razões legais) não estão interessados ??em Decompiling ou fazer engenharia reversa do condutor.

O hardware envia toneladas de dados rapidamente, assim as necessidades do protocolo de comunicação a ser bastante eficiente.

Nosso software é um aplicativo nativo C 64-bit ++, mas nós gostaríamos de acessar o hardware através de um processo de 32 bits. O que é uma maneira eficiente, elegante para aplicações de 32 bits e 64 bits para se comunicar uns com os outros (que, idealmente, não envolve inventar um novo protocolo)?

A solução deve ser em C / C ++.

Update: vários entrevistados solicitou esclarecimentos se este era um modo de usuário ou driver de modo kernel. Felizmente, é um controlador de modo de usuário.

Foi útil?

Solução

Se este é um (modo kernel) verdadeiro condutor, você está SOL. O Vista x64 não permitem a instalação de drivers não assinados. É esta é apenas uma DLL do modo de usuário, você pode obter uma correção usando qualquer um dos mecanismos IPC padrão. Canos, COM out-of-proc, mais ou menos nessa ordem. Tudo opera em velocidades de barramento por isso, enquanto você pode buffer dados suficientes, a sobrecarga de troca de contexto não deve doer muito.

Outras dicas

Gostaria apenas de usar soquetes. Ele permitirá que você usá-lo sobre IP se você precisar dele no futuro, e você não vai ser amarrado a uma API de mensagens. Se no futuro você deseja implementar isso em outro sistema operacional ou linguagem, você pode.

Este artigo pode ser do seu interesse. Discute-se o problema e, em seguida, sugere o uso COM como uma solução. Eu não sou um grande fã do COM, mas dada a sua onipresença no universo do Windows, é possível que ele pode ser o suficiente eficiente. Você provavelmente vai querer arquitecto sua solução para que você possa dados de lote (você não quer fazer chamada uma COM para cada item de dados).

Elegant? C ++? DCOM / chamadas RPC para si mesmo pode funcionar, ou você pode criar um pipe nomeado e usar isso para falar entre os dois processos (talvez criar uma "classe CMessage" ou algo assim), embora cuidado com o alinhamento estrutura diferente entre x86 e x64.

Se o motorista faz vir a ser um verdadeiro motorista, nobugz é quase certo - você vai ter que trabalhar muito mais, você não está completamente SOL. Uma solução consiste em instalar Win32 em alguma outra máquina (ou máquina virtual) e, em seguida, utilizar alguma forma de RPC, tal como chaves de caixa (como sugerido por Pyrolistical) ou UDP ou MQ ou mesmo Tibco Encontro (que reivindicações para suportar muito elevado rendimento na ordem para lidar com os volumes de dados gerados pelos mercados financeiros -. pelo menos é o que eu me lembro de volta nos velhos tempos)

Um arquivo de memória mapeada, partilhada por ambos os lados teriam o mesmo conteúdo. O sistema operacional terá que fazer algumas coisas ponteiro interessante para que isso aconteça, mas muito provavelmente será capaz de configurar os 2 pontos de vista, de tal forma que você não está copiando fisicamente memória ao redor. Zero cópias é quase tão bom quanto ele ganha

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top