Pregunta

Me doy cuenta de que lejos es específico del compilador, pero mi expectativa es que la ubicación del especificador lejano debería tener sentido para aquellos que realmente entienden los punteros.

Entonces, tengo dos aplicaciones que comparten todo el espacio de memoria del procesador.

La aplicación A necesita llamar a la función foo que existe en la aplicación B.

Conozco la ubicación de la memoria de la función foo.

Entonces esto debería funcionar, en la aplicación A:

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

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

   foo = (MYFP) 0xFFFFFA;

   returnvalue = foo(39);
}
  • ¿Está __far en el lugar correcto en typedef?
  • ¿Necesito agregar __far al elenco (MYFP)?
  • Alguna información sugiere que la llamada a foo no necesita ser desreferenciada, ¿cuál es su experiencia?
  • ¿Qué más sobre esto parece incorrecto, o podría intentar lograrlo?

  • ¿Hay una mejor manera de hacer esto?

Editar:

Esto está en un dispositivo integrado (dispositivo Freescale S12XEQ) usando Code Warrior. Es un dispositivo de 16 bits con espacio de memoria de 24 bits, así que sí, está segmentado / almacenado.

-Adam

¿Fue útil?

Solución

¿Está __far en el lugar correcto en typedef?

[Editar, en respuesta al comentario de ChrisN - gracias]

Esta es una característica dependiente del compilador, ya que no es parte de ANSI C. Según el manual del compilador < http://www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM.pdf > ;, capítulo 8, lo has colocado correctamente. En otros compiladores, es posible que deba invertir el orden. Sin embargo, esto debería ser bastante fácil de entender, ya que exactamente una de las dos opciones se compilará con cualquier compilador.

¿Necesito agregar __far al elenco (MYFP)?

No, es parte del tipo.

Alguna información sugiere que la llamada a foo no necesita ser desreferenciada, ¿cuál es su experiencia?

Los punteros de función se pueden desreferenciar opcionalmente en C. Las siguientes líneas son válidas y hacen exactamente lo mismo:

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

¿Qué más sobre esto parece incorrecto, o podría intentar lograrlo?

Lo has hecho exactamente correctamente.

Otros consejos

La palabra clave __far, al menos en el mundo de MS, se usó al crear binarios que usaban memoria segmentada. Necesita comprender el sistema de memoria 8086 para comprender esto. El 8086 dividió la memoria en segmentos, cada segmento tenía una longitud de 64 K, por lo que cada dirección en un segmento necesitaba 16 bits. Las direcciones llegaron en dos formas: cerca y lejos. Una dirección cercana era de 16 bits y era un desplazamiento en el segmento actual, uno de CS, DS, ES, SS dependiendo de la instrucción, un lejos era de 32 bits y consistía en un segmento y un desplazamiento. En el 8086, la dirección absoluta era 16 * segmento + desplazamiento, dando un rango direccionable de 1Mb.

Si no está utilizando un sistema de memoria segmentado, y parece que no lo está, entonces todas las direcciones tienen el mismo número de bits, por lo que no es necesaria la distinción cercano / lejano, lo que significa que el compilador probablemente ignore la palabra clave .

Este es un fragmento de código que funciona desde un proyecto en el que estoy trabajando. Es Paradigm C ++, por lo que utiliza alguna versión de Borland. La CPU que utiliza es un clon 8086, por lo que segmenta la memoria de 20 bits.

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

Inicializo softHandler a 0 sin quejas.

Entonces,

softHandler = softSerial0SR;

en el código de configuración.

Para llamarlo, simplemente llame a softHandler como una función normal.

Tenga en cuenta que este código está ligeramente modificado para usted del código real que tengo.

ambos programas fueron construidos por el mismo compilador / opciones, ¿entonces usan el mismo OBI?

De acuerdo, el código se ve bien; en este caso, obtendría un desensamblaje del código generado y averiguaría si salió bien. Solo debe haber 10 instrucciones como máximo, y luego sabrá con certeza si funcionó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top