Pregunta

En mi micro Freescale HCS08 de 8 bits, cada vez que llamo una función de biblioteca que devuelve los valores a los punteros, lo paso, y realmente no los quiero, arrojé un nulo, por ejemplo,

UART_SendBlock((char *)txstr, strlen(txstr), NULL);

El tipo de argumento es uint16_t * y devuelve el número de caracteres que realmente envían, un valor que no me importa.

Sin embargo, estaba teniendo problemas con el puerto A en mi micro manguera cada vez que se llamaba esa función, y la depuración me señaló a ese argumento atornillando las cosas. La configuración del puerto A se registra en vivo en las direcciones 0x0000 y 0x0001, que es donde NULL (también conocido como (void *)0) puntos. Pensé NULL de alguna manera era magia donde en realidad no haría nada, pero no parece así.

Mi solución se siente realmente hack:

#define MNUL (void *)(&mynull)
uint32_t mynull;

¿Hay una mejor solución? Intenté definir MNUL a un segmento de memoria no utilizado en mi procesador, pero eso causa un reinicio inmediato.

¿Fue útil?

Solución

A menos que la documentación para UART_SENDBLOCK declare que pasarlo un puntero nulo está bien, probablemente obtenga un comportamiento indefinido si lo hace, y en este caso parece que la función solo escribe en la dirección que lo pasa, la dirección 0, que estaría bajo "indefinida comportamiento".

Solo llámalo con un parámetro, no hay razón para ser "inteligente" al respecto.

uint16_t unused_16;
UART_SendBlock((char *)txstr, strlen(txstr), &unused_16);

Si está limitado a los recursos, haga unused_16 un global y reutilizarlo en otros lugares

Otros consejos

La función está tratando de escribir un valor en el lugar donde el último argumento apunte. Está pasando en nulo (0x0000), por lo que el resultado se está escribiendo en la ubicación de memoria 0x0000, o su puerto A. Por lo general (en la programación general), la función verificaría el argumento y no intentaría escribir en la ubicación si fuera así. NULL, pero parece que esta función no sigue esa convención. Debe asignar una variable para que la función escriba su resultado, incluso si no la va a usar.

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