ADA - problema importando in8 out8 a ada

 
Vista:

problema importando in8 out8 a ada

Publicado por Chechu (1 intervención) el 08/08/2007 12:18:18
Buenos dias.
Os detallo mi problema por si alguien sabe como solucionarlo
estoy importando funciones de QNX 6.3 a ADA y me encuentro con un problema cuando llamo a las funciones in8 y out8 para lectura y escritura de un byte.

me he creado unas funciones en c para manejarlas pero me dan errores:

uint8_t read_handle( uint64_t port_handle) {
port_value=in8(port_handle);
return port_value;
}

void write_handle( uint64_t port_handle, uint8_t value ){
port_h=port_handle;
out8(port_h, value);
}
Esto asi no hace nada

Ahora he probado a llamar a port handle como un puntero
uint8_t read_handle( uint64_t *port_handle) {
port_value=in8(*port_handle);
return port_value;
}

void write_handle( uint64_t *port_handle, uint8_t value ){
port_h=*port_handle;
out8(port_h, value);
}

Esto escribe perfectamente pero cuando lee provoca un memory fault (core dumped)

y la solución final para q funcionará es esta:

uint8_t read_handle( uint64_t port_handle) {
port_value=in8(port_handle);
return port_value;
}

void write_handle( uint64_t * port_handle, uint8_t value ){
port_h=*port_handle;
out8(port_h, value);
}
Y claro tener codigo q funciona aleatoriamente no me convence asi que si alguien sabe
porque read funciona sinpuntero y write si, o si es x fallo de tipos o alguna cosa

las llamadas en QNX son estas
uint8_t in8 (uintptr_t port);
void out8 (uintptr_t port, uint8_t val);
dnd uintptr_t no se que tipo usar para importalo si usar un integer unsigned o un puntero
Si os fijais los port siempre se pasan asi y yo en mi solución uno usa unpuntero y otro no
No entiendo xq es asi.
¿Alguna Ayuda?
gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Problema al importar funciones de QNX 6.3 para lectura y escritura de bytes

Publicado por Alejandro (155 intervenciones) el 30/06/2023 19:43:38
Tu problema parece estar relacionado con la forma en que estás manejando los punteros en las funciones que importas desde QNX 6.3 a Ada. Veamos algunas consideraciones que podrían ayudarte a resolverlo:

1. Tipo de dato para el puerto (`port_handle`): Asegúrate de utilizar el tipo de dato adecuado para el puerto en Ada. En QNX, se utiliza el tipo `uintptr_t`, que representa un puntero sin tipo. En Ada, podrías usar el tipo `System.Address` para representar un puntero sin tipo. De esta manera, el tipo de `port_handle` en tus funciones de Ada sería `System.Address`.

2. Lectura (`read_handle`): En tu solución final, donde no utilizas un puntero para `port_handle`, es posible que funcione porque el valor de `port_handle` se pasa como un entero directo. Sin embargo, es importante asegurarse de que el tipo del valor que pasas a la función sea coherente con el tipo esperado por la función `in8` en QNX. Si `port_handle` se representa como un puntero en QNX, entonces deberías usar el tipo `System.Address` en Ada y realizar la lectura de la siguiente manera:

1
2
3
4
5
6
function Read_Handle(Port_Handle: System.Address) return Uint8 is
   Port_Value : Uint8;
begin
   Port_Value := Uint8(QNX.In8(UintPtr(Port_Handle)));
   return Port_Value;
end Read_Handle;

3. Escritura (`write_handle`): En tu solución final, estás utilizando un puntero para `port_handle`, lo cual es correcto si el valor se pasa como un puntero en QNX. Al igual que en el caso de la lectura, asegúrate de utilizar el tipo correcto en Ada y realizar la escritura de la siguiente manera:

1
2
3
4
5
procedure Write_Handle(Port_Handle: System.Address; Value: Uint8) is
   Port_H : UintPtr := UintPtr(Port_Handle);
begin
   QNX.Out8(Port_H, Value);
end Write_Handle;

Recuerda importar adecuadamente los paquetes de QNX en tu código Ada y asegurarte de que las funciones `in8` y `out8` se encuentren correctamente enlazadas.

Ten en cuenta que estas soluciones son una guía general y podrían requerir adaptaciones adicionales según la configuración y la estructura de tu código. Te recomendaría consultar la documentación de QNX y las especificaciones de Ada para obtener más información sobre cómo manejar correctamente los punteros y los tipos de datos correspondientes.

Espero que estas sugerencias te sean útiles y te permitan solucionar el problema que estás enfrentando al importar funciones de QNX a Ada. ¡Buena suerte con tu proyecto en Ada!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar