Documentos actualizados. 19 Enero, 2007
Posted by pjmicrocontroladores in Información general.add a comment
Gracias a Maxi Sanchez he visto que había incogruencias entre los artículos del software y el hardware del programador por puerto paralelo. El problema erá que hay que invertir además de MCLR , los data in, data out y clock, para que el programador funcione. Ya he modificado los artículos, pero ruego que todo aquel que vea un fallo lo indique en el foro o si no tiene cuenta de la forja, en esta misma página como comentario. Una vez más gracias a Maxi por el aviso. Saludos.
Nueva versión 0.1.9 3 Enero, 2007
Posted by pjmicrocontroladores in Información general, Lanzamiento de versión.add a comment
Como ya comenté el siguiente hito era usar la memoria completa dejando de lado el error con las call_used. Pues pocas horas después de decirlo encontré por donde iban los tiros y ya está solucionado. El problema es que en una primera instancia el error parecía provenir de las funciones que indicaban en que registros pasar y recibir los argumentos de una función. Al usar funciones sin argumentos descubrí que el error iba justo después de que GCC encontrará los registros adecuados, en la formación de la insn de llamada a funciones. Al usar un general_operand para recoger la dirección de la llamada se permitían construcciones invalidas que, si bien deberían hacer fallar al compilador en la etapa de generación, el fallo (el conocido violación de segmento) se producía en la segunda pasada de optimización cse2, anulando esta pasada pude observar el fallo en la salida y al corregirlo restringiendo las posibles direcciones puedo decir por fin adiós al error. Para mí se quedan las horas de navidad gastadas en esto…
Bueno, de todas formas sigo como dije para permitir que un programa pueda acceder a toda la memoria del dispositivo. Para ello se ha pensado crear cuatro estructuras para los cuatro bancos que tengan dos variables una que indique el espacio total disponible y otra el espacio usado. En la llamada de una función se tomarán el espacio necesario para la ejecución de la misma y se asignará dinámicamente. Los cuatro bancos serán del mayor tamaño posible una vez desquitada la información de registros, memoria de programa y pila. Realmente una vez discernida la idea, no parece difícil de implementar.
Para la memoria dinámica, se necesitará construir una estructura que mantenga los bloques asignados, libere la misma y optimice los huecos. Todo esto queda para una versión posterior a la futura 1.0, dado que no veo utilidad real en usar una memoria asignada dinámicamente en un PIC por la alta perdida de espacio en RAM que representa. Realmente con los bancos explicados del párrafo anterior la asignación dinámica se puede hacer por software.
Me despido hasta (creo) el domingo donde tendré la versión 0.2 con acceso al total de la memoria. Saludos.
Año nuevo, vida nueva 31 Diciembre, 2006
Posted by pjmicrocontroladores in Información general.2 comments
Hola, esta semana no ha sido para nada una semana vacacional como dictan las fechas. El culpable es el error que comente en el post anterior y que me ha impedido avanzar en nada. Sigo sin resolverlo y ni siquiera he descubierto por donde van los tiros. Por lo tanto y siguiendo el refrán del título, seguiré avanzando en lo que tenía pensado del proyecto dejando el error para las horas en las que tenga mente y espíritu despejados.
Por tanto el siguiente hito de consideración va a ser, poder usar el total de la memoria RAM del microcontrolador en un programa. Los avances de versión seguirán este nuevo objetivo y con suerte a lo mejor soluciono el maligno error.
Para terminar, pasáoslo bien, no abusar de la bebida y Feliz 2007.
Nueva versión 0.1.1 29 Noviembre, 2006
Posted by pjmicrocontroladores in Información general, Lanzamiento de versión.add a comment
Optimizada la inclusión de funciones matemáticas de librería, y corregidos pequeños fallos. Se han encontrado diversos errores en la generación de código al utilizar la memoria, aparentemente no es culpa de las insn, por lo que el desarrollo se orienta a reparar estas anomalías, además de seguir corrigiendo el código de las insn. En la próxima versión se incluirá la selección del número de registros y el tamaño de la pila desde la línea de comandos.
Saludos.
Encuesta: PIC12 si o no 22 Noviembre, 2006
Posted by pjmicrocontroladores in Información general.add a comment
He comenzado una encuesta en la forja donde podeis opinar si merece la pena portar GCC a la familia de microcontroladores PIC12. Debemos saber que esta familia es reducida tanto en memoria RAM como en memoria de código. En principio solo sería factible portar código para bytes y enteros y funciones de un único nivel, dado que no hay memoria RAM para mucho más. Debido a esto realmente no veo que merezca la pena portar GCC para los 12 bits.
Esta encuesta estará abierta durante todo el periodo del concurso pero los que quieran, que vayan votando y dando su opinión a favor o en contra, para ir dirigiendo el proyecto cuando tome más cuerpo.
Podéis dar vuestro voto en la encuesta Gama Baja de los PIC y vuestra opinión en el hilo Opiniones sobre el porting de GCC a PIC12
Nueva versión 0.0.7 22 Noviembre, 2006
Posted by pjmicrocontroladores in Información general, Parches.add a comment
En esta versión se han revisado las insn a nivel de sintaxis, y se ha incluido la posibilidad de paso de parámetros a las funciones. En un plazo de dos o tres semanas iré revisando todas las insn a nivel de código, es decir que el código ensamblador generado haga realmente lo que tiene que hacer. Si alguien se anima…
Nueva versión 0.0.6 19 Noviembre, 2006
Posted by pjmicrocontroladores in Información general.add a comment
Lanzada nueva versión donde he terminado de crear todas las insn que, en principio, forman el porting. Debido a la cantidad de código creado es muy probable que haya bastantes fallos en el mismo, pero a partir de ahora se trata de completar, mejorar y corregir.
Nueva Versión 0.0.5 15 Noviembre, 2006
Posted by pjmicrocontroladores in Información general, Parches.add a comment
Lanzada nueva versión en la que el modo QI se completa a falta de la multiplicación y división. La linea de trabajo fundamental es acabar de crear las insn o patrones de instrucción del modo QI y pasar a realizar el modo HI y SI. En breve también un mini manual para compilar GCC con la arquitectura PIC para aquellos que quieran ver los avances.
Nueva Versión 0.0.4 12 Noviembre, 2006
Posted by pjmicrocontroladores in Información general, Parches.add a comment
Publico una nueva versión en la que podremos ver la mentalidad número 3 mentada en la publicación anterior. Por lo tanto, tenemos ahora 32 registros más el W que permiten un funcionamiento completo de la compilación. Se pueden realizar copias, sumas y restas en variables de 1 byte.
Hay tres niveles de especificación de modo de operando cuya diferencia es el tamaño de palabra. El modo QI es de 1 byte y corresponde a variables de tipo char o short. El modo HI de 2 bytes y corresponde a enteros y el modo SI de 4 bytes y usado para long. No tiene sentido (aunque se podría) aumentar los modos de operación dado que en un PIC usar más de 4 bytes para un dato es realmente improbable. Por lo tanto solo se usarán estos tres modos en la definición de la arquitectura, pero de usarse modos mayores, no hay problema dado que si GCC no encuentra una operación en la especificación de la máquina para un tipo mayor, usará una librería (conocida como libgcc) para crear las operaciones necesarias a partir de las existentes.
Por ahora el desarrollo será dirigido al modo QI de 1 byte. La extensión a otros modos se realizará en posteriores fases de desarrollo a partir de lo hecho para el modo QI. Además en lo que respecta al uso de W como registro, por el momento solo le veo problemas, por lo que cuando lo valore a fondo será usado o excluido definitivamente.
Hasta pronto.
Nuevo Parche 0.0.3 9 Noviembre, 2006
Posted by pjmicrocontroladores in Información general, Parches.add a comment
Por problemas de salud no he hecho todo lo que quería, pero por lo menos me ahorro el pinchazo de la vacuna de la gripe
.
Bien, subido un nuevo parche que esta vez consigue crear el CC1 que compila código. No se cuelga sino que informa de lo que le falta para seguir compilando. Con esto, basta con rellenar lo que pide para seguir adelante. Llegados a este punto ahora si tenemos que fijar una idea del objetivo del porting a crear. Pese a que quería documentar más a fondo las ideas existentes, las resumo aquí y dejo la promesa de explicar la definitiva más adelante.
El motivo de tener varias ideas es GCC. Este tiene sus más y sus menos en las arquitecturas y en principio esta orientado a modelos de memoria más grandes que un microcontrolador. En un PIC como el 16F877 tenemos 352 posiciones de RAM. En ellas tienes que entrar la pila y el espacio de memoria local de cada función entre otros parámetros. Esto sumado a que el espacio no es continuo sino dividido en 4 bancos hace la gestión de memoria complicada. Además tenemos un solo registro, el W, pero toda la memoria puede accederse de manera directa, por lo que se podría pensar que tenemos 352 registros más uno. Todo esto lleva a tres modelos de memoria – registros cuya elección final lo dará el código generado por GCC. Obviamente será el más eficiente.
Los tres modos de memoria son:
1) Un solo registro, el W y todo lo demás es memoria. Pros: el código es más fácil y GCC traduce las instrucciones a un solo nemotécnico por instrucción. Contras: GCC trabaja con infinitos registros, optimiza, y después establece estos registros en registros reales, pasando los que no puede recargar a la pila o memoria. Con un solo registro no se como funcionará esto, ya que la mayoría serán pasados a memoria o pila y por omisión parece que GCC siempre elije registros a memoria, por lo que se formaría el circulo vicioso.
2) Todo son registros, menos lo mínimamente necesario para que GCC tenga memoria. Pros: se acerca a la idea de GCC de muchos registros. Contras: GCC quiere memoria, según que programa compile se pedirá más o menos. Ajustar esto en tiempo de compilación es complicado desde ya, imaginaos cuando lo hagamos. Según la documentación de GCC, éste usará un espacio de memoria al que llama “frame” (marco), con un puntero que será (o puede ser) reasignado en cada llamada para ajustarse a necesidades. Esto lleva a no poder usar toda la memoria como registros y con ello a la idea 3.
3) Habrá x registros, y el resto es memoria a usar. Pros: Con esto llegamos a una solución de compromiso entre 1 y 2. Contras: pues suponiendo que usemos un banco para pila, y otro para registros, quedan dos bancos para memoria. Esto lleva a moverse entre dos bancos, lo que no es ni eficiente, ni fácil.
Pues de estas ideas primero escogí la número 1, para definir la estructura del porting, pero cada vez más veo más negro su futuro. De escoger la siguiente idea cogería la 3, pero comenzaría con un solo banco para memoria de frame y dejaría los otros para registros y pila (en un futuro ya buscaría optimizar memoria). Con esto retraso la gestión de memoria hasta que el porting sea funcional, con lo que alivio la complejidad del trabajo.
Sin más hasta pronto.