Autor Tema: manejar interrupt en ARM9 con GCC  (Leído 5204 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
manejar interrupt en ARM9 con GCC
« en: 10 de Enero de 2009, 11:52:17 »
Hola,

aunque estoy buscando informacion por internet, queria hacer esta consulta. Estoy utilizando un MX21 de freescale (ARM9) a pelo, sin sistema operativo. Aunque ya manejo algunos subsistemas (LCD, sensor imagen, uart, timer,....), no se como implementar las interrupciones en el compilador GCC.

Ahora mismo, cargo el programa directamente en RAM, con el bootloader interno del micro. Una vez cargado se ejecuta (bueno el soft que carga el programa por el puerto serie, envia primero unos comandos para inicializar el controlador de SDRAM, y alguna cosa mas).

Segun lo que he leido, en ARM cuando salta la interrupcion IRQ nos lleva a la direccion 0x00000018. En esa direccion estaria mi NOR flash. En la aplicacion final, en esa direccion de la flash puedo escribir el salto a mi rutina de interrupcion, pero ahora mismo la flash no la utilizo, y no se como redireccionar ese salto de la IRQ inicial a zona de RAM.

Se que dentro de la IRQ service routine realizare el salto a la rutina de servicio apropiada(uart, timer,...), para lo cual el micro facilita esto mediante un registro, en el cual te indica el indice del vector de interrupcion pendiente con mayor prioridad (segun lo hayas programado tu previamente al inicializar). El tema es que no quiero que me salte a la 0x00000018, si no a otra zona de RAM.

Veo que GCC admite escribir la rutina de servicio IRQ como: "void IRQ_service() __attribute__ ((interrupt ("IRQ")));
De esto modo, comprende que es una rutina de servicion de interrupcion, y genera el codigo de entrada y salida de la funcion adecuados.
En concreto al compilar, he observado que si me crea esa entrada y salida tipica de una funcion de interrupcion, pero me la coloca en una zona RAM como si fuera mas codigo.

Si alguien tiene algun ejemplito de ARM corriendo en RAM con interrupciones, le agradeceria me lo comentara.

Un saludo. Dani.


Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: manejar interrupt en ARM9 con GCC
« Respuesta #1 en: 16 de Enero de 2009, 17:40:13 »
Me respondo yo mismo ya que ya me funciona jeje

Primero: en la zona del vector de interrupciones (en el caso de la IRQ la 0x00000018) no esta mi flash como habia dicho en el otro post. En esa zona reside un Bootloader que lleva integrado el procesador en ROM. Entonces, hay una zona de RAM donde se almacena un vector de interrupciones 'sustituto'. Es decir que el Boot que hay en ROM lee de ese vector de interrupciones de esa zona de RAM las direcciones de las rutinas a servir, segun el tipo de interrupcion levantada (IRQ, FIQ, UNDEF,...)

Entonces da igual que ejecute desde mi flash o cargue el programa en RAM, ya que el vector de direcciones esta en RAM interna del micro y es totalmente configurable en las rutinas de inicializacion de la aplicacion.
Eso si, me he pasado 3 dias dandole vueltas porque no me funcionaba, y yo veia todos los registros del controlador de interrupciones y los del timer bien y al final era un maldito bit de un registro que habilitaba el reloj al modulo Bootloader de la ROM. Es que cada modulo (uart, timer,... se le puede desactivar el reloj de entrada independientemente para disminuir consumo). Resulta que de normal no me inlfuia, pero claro al producirse una interrupcion, va a ejecutar en la ROM y si el reloj no se lo has habilitado....se te queda colgado (en realidad esta habilitado por defecto en el reset, pero la faena me la jugo el copy-paste de un ejemplo con cual empece a jugar con este micro). Y claro al ppo, no puedes conocer todos los registros (no hay ni nada) y te crees lo que hay en la inicializacion del ejemplo.....

Bueno dejo ya el rollo que me estoy soltando sin venir a cuento. De todos modos si alguien esta jugando con este micro, lo cuento para que este al tanto.

Un saludo. Dani.

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: manejar interrupt en ARM9 con GCC
« Respuesta #2 en: 16 de Enero de 2009, 20:45:42 »
hola damago, con que tarjeta de evaluacion estas trabajando? me interesa los arm de freescale, pero los quehe visto estan algo caros (bastante caros) y me gustaria saber donde adquiriste la tuya?
saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: manejar interrupt en ARM9 con GCC
« Respuesta #3 en: 17 de Enero de 2009, 11:51:16 »
Hola scientist, es cierto que son caras. Yo estoy usando un modulo que compre en vitualcogs. Pero parece que cerraron hace tiempo. Es posible que mas adelante compremos en el curro la MX27 PDK (cuesta sobre 1300€).

Hay opciones mas baratas, por ej:
- https://ssl3.ovh.net/~armadeus/onlineshop/catalog/product_info.php?cPath=25&products_id=36&osCsid=7dd011bedaca238066c75a59524e654e
son 160€+ impuestos + gastos de envio (sin LCD)

- creo que si aun quedan se puede comprar el MX21 litekit por unos 350€ (con LCD incluido). En la misma pagina de freescale es posible que aparezca (ya es algo vieja). Si no mira en digikey o algun sitio de esos, o te miro yo.

- http://www.phytec.com/products/rdk/ARM-XScale/phyCORE-ARM9-i.MX27.html (sobre 900$). Completo

- http://www.strategic-embedded.com/freescale_i.mx27_linux_windows_ce/index.html
Solo es el modulo con el MX27, flash y RAM, pero cuesta 99€. La placa base te la podrias hacer tu en 2 capas o comprarla en el mismo sitio.

- http://www.cogcomp.com/csb_csb735.htm (sobre 600$ completita con el modulo y la placa base con LCD). Tiene buena pinta.

Si veo alguna direccion mas, te la paso.

Un saludo. Dani.

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: manejar interrupt en ARM9 con GCC
« Respuesta #4 en: 17 de Enero de 2009, 21:32:22 »
gracias damago, lo estare checando, hace un rato estaba viendo una placa de st, pero debido a mi gusto por freescale, decide comprarme una de esta marca, pero la diferencia de precio es evidente, de todas maneras tengo algo juntado, asi que a lo mejor me haga de una de estas mas adelante, por ahora estoy bastante metido dandole duro a el mc9s08qe128 y el qe128 de 32 bits, y terminando me pondre a trabajar con los arm que desde hace bastante tiempo les traigo ganas, saludos y estare al tanto si posteas algo de estos micros poderosos de freescale los imx, que por cierto sacaron su cortex8 con el cual sacaron la primera netbook con este micro arm, aqui pongo el link netbook freescale que saldra a la venta a mediados de este año con un precio de alrededor de 200 dolares y correra ubuntu, saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado Lejan

  • PIC10
  • *
  • Mensajes: 25
Re: manejar interrupt en ARM9 con GCC
« Respuesta #5 en: 13 de Noviembre de 2009, 17:23:52 »
Hola Damago, estoy incursionando en ARM con el LPC2114 NXP de Philips, la verdad que está costando un poco el tema porque yo vengo de programar PICs en Windows y estoy empezando con ARM mediante LINUX, programo con GNU ARM Toolchain, version 3.4.3. La placa me la he armado yo.
El tema es que con todo el rollo del startup.s, el linkeador, el programa en c, se me hace un lio y todavía no logro hacer andar mi primer programa ( como siempre prender y apagar leds). Mi consulta es sobre las interrupciones, cuando armas el startup.s como haces para relacionar los vectores de interrupciones que defines mediante los registros adecuados? Por ejemplo, yo quiero habilitar la interrupcion del I2C (en mi proyecto final tengo que usarlo) según la hoja de datos tengo que setear ciertos bits en ciertos registros, esto lo hago en mi programa en C o en el startup.s ?

Muchas gracias !!!

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: manejar interrupt en ARM9 con GCC
« Respuesta #6 en: 16 de Noviembre de 2009, 17:00:57 »
Hola Lejan,

he hecho alguna cosilla con arm7, en concreto con el LPC2148, aunque con KEIL sobre windows, y no con GNU ARM.

Te paso un pedazo de codigo para utilizar la interrupcion del timer. Todo esta hecho en C (nada de tocar ensamblador). De todos modos mañana echo un vistazo a codigo que tengo para el ARM9, que si lo he hecho con el GNUARM y te comento:

#include <LPC214x.H>                       /* LPC21xx definitions */
#include "timer.h"

void Ini_timer0(unsigned short ms)
{
   T0PR = 14999;      // Preescaler: cada 1mseg (15000 PCLK ticks), incrementa T0TC
   T0TCR = 0x00000002;   // Reset counter
   T0MCR = 0x00000003;   // genera interrupcion cuando MR0 = TC, y resetea TC
   T0MR0 = ms;      // Cuando T0TC llega a 1000, se produce una interrupcion (match0 channel)
     T0TCR = 0x00000001;   // Enable counter

   VICVectAddr4 = (unsigned) T0_interrupt;
   VICVectCntl4 = 0x00000024;   // Habilitamos este vector de interrupcion y asociamos a timer0
   VICIntEnable |= 0x00000010;   // Habilitamos interrupcion timer0
}

void T0_interrupt(void) __irq
{
   // YOUR CODE
   FIO0PIN = FIO0PIN ^ 0x00000800;
   // END YOUR CODE

   T0IR |=   0x00000001;         // Borramos match0 flag
   VICVectAddr = 0x00000000;   // Dummy write to addres
}

Espero que te sirva de referencia. Osea, puedes hacerlo todo en C.

Nota: Ahora ya no recuerdo el porque, pero no olvides la línea "VICVectAddr = 0x00000000;" al final de la interrupcion o se va todo a tomar por c....  Tiene su razon :), pero no la recuerdo.

EDIT: te adjunto tambien la parte de I2C que tenia de codigo. Veras que hay cosas comentadas, ya que era para usar o no interrupcion. Es codigo de hace tiempo, y no lo tengo fresco (para explicarlo). Echale un vistazo, a ver si le sacas partido. Descomenta lo relacionado con la interrupcion y lo pruebas. No me acaba de gustar usar I2C por interrupcion, veras que tiene muchos estados la rutina de interrupcion (que si el bit de start, que si bit de restart, que si ack correcto a address o a data, etc.....). Es una excepcion, pero el I2C es el unico recurso que prefiero hacerlo por polling.

Un saludo. Dani.
« Última modificación: 16 de Noviembre de 2009, 17:14:25 por damago »