Pergunta

Eu percebo que agora é específica do compilador, mas a minha expectativa é que o posicionamento da extrema especificador deve fazer sentido para aqueles que realmente entendem ponteiros.

Então, eu tenho dois aplicativos que compartilham todo espaço de memória do processador.

App Um precisa chamar foo função que existe no aplicativo B.

Eu sei que o local de memória da função foo.

Então, isso deve funcionar, no aplicativo A:

typedef int (* __far MYFP)(int input);

void somefunc(void)
{
   int returnvalue;
   MYFP foo;

   foo = (MYFP) 0xFFFFFA;

   returnvalue = foo(39);
}
  • É o __far no lugar certo na typedef?
  • Preciso adicionar __far ao (MYFP) elenco?
  • Algumas informações sugerem que a chamada para foo não precisa ser dereferenced, qual é a sua experiência?
  • O que mais sobre isso parece incorreto, ou talvez eu tento fazer isso?

  • Existe uma maneira melhor de fazer isso?

Editar:

Esta é em um dispositivo incorporado (dispositivo Freescale S12XEQ) usando Guerreiro Código. É um dispositivo de 16 bits com espaço de memória de 24 bits, então sim, é segmentado / bancados.

-Adam

Foi útil?

Solução

é o __far no lugar certo na typedef?

[Edit, em resposta ao comentário de ChrisN - graças]

Esta é uma característica dependente do compilador, uma vez que não faz parte do ANSI C. De acordo com o manual do compilador << a href = "http://www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM .pdf" rel = "noreferrer"> http: // www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM.pdf >, capítulo 8, você tê-lo colocado corretamente. Em outros compiladores, pode ser necessário para inverter a ordem. Este deve ser bastante fácil de descobrir, embora, desde que exatamente uma das duas opções irá compilar com qualquer compilador.

Eu preciso adicionar __far ao (MYFP) elenco?

Não, é parte do tipo.

Algumas informações sugerem que a chamada para foo não precisa ser dereferenced, qual é a sua experiência?

Ponteiros de função pode ser opcionalmente desreferenciado em C. As linhas seguintes são ambos válidos fazer exatamente a mesma coisa:

foo = (MYFP)0xFFFFFA;
returnvalue = foo(39);  // 1
returnvalue = (*foo)(39);  // 2

O que mais sobre isso parece incorreto, ou eu poderia tentar fazer isso?

Você já fez isso exatamente corretamente.

Outras dicas

A palavra-chave __far, pelo menos no mundo MS, foi usado ao criar binários que usaram memória segmentada. Você precisa entender o 8086 sistema de memória para compreender isso. 8086 dividiu a memória em segmentos, cada segmento foi de 64 K de comprimento, de modo que cada endereço em um segmento necessária 16bits. Endereços veio em duas formas: perto e de longe. Um endereço de perto era 16bits e foi um deslocamento para o segmento atual, um dos CS, DS, ES, SS, dependendo da instrução, uma agora foi 32bits e consistiu de um segmento e um deslocamento. Em 8086, o endereço absoluto foi de 16 * + offset segmento, dando um intervalo endereçável de 1 Mb.

Se você não está usando um sistema de memória segmentada, e parece que você não está, então todos os endereços têm o mesmo número de bits para que o perto / longe distinção não é necessário que significa que a palavra-chave é provavelmente ignorado pelo compilador .

Este é um trecho de código que funciona a partir de um projeto que eu estou trabalhando. É Paradigm C ++, para que ele usa alguma versão do Borland. A CPU que ele usa é um clone de 8086, de modo segmentado de memória de 20 bits.

void softSerial0SR(unsigned16);
void (__far *softHandler)(unsigned16);

Eu inicializar softHandler a 0 sem reclamar.

Em seguida,

softHandler = softSerial0SR;

no código de configuração.

Para chamá-lo, basta ligar softHandler como uma função regular.

Note que este código é ligeiramente voltado para você a partir do código real que eu tenho.

os dois programas foram construídos pelo mesmo compilador / opções, assim que usam o mesmo OBI?

Concordo os olhares de código bem - neste caso, gostaria de obter uma desmontagem do código gerado, e descobrir se ele saiu certo. Deve haver apenas 10 instruções no máximo -. E então você vai saber com certeza se funcionou

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