TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: migsantiago en 18 de Mayo de 2014, 02:20:23
-
Hola
Estoy compilando con XC8 1.30 y 1.31. El 1.30 con modo PRO tarda demasiado en compilar y termina arrojando lo siguiente:
Looping around allocGlobals()
make[2]: Leaving directory `D:/GPS_tracker.X'
make[1]: Leaving directory `D:/GPS_tracker.X'
(908) exit status = 1
make[2]: *** [dist/default/production/GPS_tracker.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 4m 35s)
Creo que es porque no sabe cómo acomodar la ROM y mejor se rinde jajaj
Y el 1.31 sí compila, pero mis strings constantes en ROM no se envían bien por la UART.
¿Alguien sabe cómo corregir este problemita? :8}
Vi en otros lados que el looping around es muy común, pero que no tiene solución :angry:
Gracias.
-
Ya con la mente más fresca me puse a pasar escoba por funciones que no utilizo. Bajé el tamaño de la ROM y el compilador terminó de compilar. Aún así me preocupa que el código nuevo que agregué no cupiera, tenía 54% de ROM en un PIC18F26K20 de 64kB. Tengo muchas funciones de pequeño tamaño por lo que acomodarlas en el jarrito no debería ser complicado.
Ahorita quedó así en modo free:
Program space used 795Dh ( 31069) of 10000h bytes ( 47.4%)
:?
Esto con la v1.31.
Con la 1.30 sigue sin compilar :8}
Edito: Si no hago uso de printf, el código compila en la 1.30 :S
-
Ya envié un ticket a Microchip. :(
-
Bueno, como buenos camaradas, me contestaron los de Microchip con un workaround en lo que resuelven el issue en el compilador. Se los paso por si sufren lo mismo que yo. El problema ocurre cuando printf recibe una dirección ROM para imprimir un string. Se pone loco el compilador y calcula mal lo que tiene que enviar y manda basura. En mi caso sólo enviaba el primer char del string.
Hi Santiago,
Thanks for writing to us and sending projects to replicate the problem. I am able to replicate the error in printf output with code which you have sent. Looks the problem is in printf in calculating the number of letters in string passed through %s format specifier. I have submitted a detailed report about the problem in our process tracking tool and developers will look into it. Thanks for bringing this into our notice.
As a workaround for copy the string from program memory into temporary array before sending it to printf. So change the code as:
void SIM_Send_AT_Command(const char* command)
{
/* Wait some time if there is a response still arriving */
volatile char array_temp[20],temp=0;
Cust_Delay(SIM_SEND_DELAY);
/* Clear the RX buffer */
SIM_Clear_RX_Buffer();
while(*command)
array_temp[temp++]=*(command++);
array_temp[temp]=0;
/* Send the command */
printf("%s\r\n", array_temp);
Response_Pending = true;
}
Regards,
-----
Compiler Analysis and Assistance Team
-
Se estan copiando de CCS !! :D :D :D :D
-
Jaja, lo malo se pega
-
Jeje
Sí, lo bueno es que acá ya los puse a trabajar :mrgreen:
Lo malo es que me hicieron sufrir un rato, igual a Akenafab que me encargó este trabajo jejej
-
Una pregunta por curiosidad:
Si en vez de copiar el array a una variable temporal en RAM pruebas a hacer un casting, qué sucede?
printf("%s\r\n", (char*) command
);
o
printf("%s\r\n", (volatile char*) command
);
No sé cuál será el resultado, pero yo suelo hacer esos casting en los printf para evitar los típicos warning del compilador.
Un saludo!
-
Hola Tisco, no lo sé... no tengo el hardware a la mano. Se lo preguntaré a Akenafab. Gracias.