Cuestión : El indicador de la función corrompió/compensó cuando estaba pasado a la función

Me estoy divirtiendo tan más conmigo AT91SAM9261.  Estoy intentando inicializar una interrupción del sistema para fijar a un tratante a un contador de tiempo perioidic de la interrupción. Soy bonito mucho copiando el código del ejemplo para hacer esto.   Estoy consiguiendo a diversos resultados extraños cuando funciono conmigo código, de la muestra code.

On la buena secuencia en el proyecto que vino con IAR EWARM, él de la muestra llamo:

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit); el
where AT91C_ID_SYS=1 (interrupción del sistema), e ISR_Pit es una función con el

and del prototype

void ISR_Pit en la posición de memoria 0x200011B8.  el

And remonto la llamada de función con el siguiente:

void IRQ_ConfigureIT (fuente sin firmar de la internacional, modo sin firmar del
internacional, vacío del
(*handler) (vacío))
{neutralización del
// el first
de la interrupción AT91C_BASE_AIC->AIC_IDCR = 1 << fuente; el

// configura el modo y el handler
AT91C_BASE_AIC->AIC_SMR [source] = modo;
AT91C_BASE_AIC->AIC_SVR [source] = tratante (internacional sin firmar); interrupt
del

// AT91C_BASE_AIC->AIC_ICCR = 1 << fuente;


and del
} en el line

AT91C_BASE_AIC->AIC_SVR [source] = tratante (internacional sin firmar); el

I considera el cambio del registro AIC_SVR_1 a 0x200011B8, que es todo el

On del *** de good.

a la mala secuencia.  Cuando hago la misma llamada de mi programa (yo tener cortar y pegar la misma inicialización y las rutinas de ISR):

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit); el

I verifica que AT91C_ID_SYS sea el valor 1, e ISR_Pit es una función del prototype

void ISR_Pit (vacío) en la dirección 0x200000A4

And entonces que la remonto en el

void IRQ_ConfigureIT2 (fuente sin firmar de la internacional, modo sin firmar del
internacional, vacío del
(*handler) (vacío) de la llamada)
{neutralización del
// el first
de la interrupción AT91C_BASE_AIC->AIC_IDCR = 1 << fuente; el

// configura el modo y el handler
AT91C_BASE_AIC->AIC_SMR [source] = modo;
AT91C_BASE_AIC->AIC_SVR [source] = tratante (internacional sin firmar); interrupt
del

// AT91C_BASE_AIC->AIC_ICCR = 1 << fuente; el

And del
} examino el valor del “tratante” y es la dirección 0x200000A5 (!!!), un octeto más que el indicador pasajero.  Y veo el registro cambiar al valor incorrecto 0x200000A5, cuando quisiera que señalara en mi dirección de ISR_Pit del

So del *** de 0x20000A4.

que mi indicador de la función conseguido dio un pequen@o codazo por uno cuando llamé la función.  Mis dos preguntas están tan: ¿

1) que qué usted los expertos haría en términos de incluso localización de averías de esta observación extraña?  ¿Qué podía explicar esto?  ¿Se demole el mi conseguir del apilado?  ¿Más ediciones de la alineación de la memoria? ¿
2) que qué puede yo hacer para apaciguir a los dioses encajados, a que he enfurecido claramente?

Thanks mucho para cualquie thoughts.
class= del

Respuesta : El indicador de la función corrompió/compensó cuando estaba pasado a la función

Comprobar siempre el archivo del mapa para ver las compensaciones correctas.
¿Aparte de eso, hacen los trabajos del código?
¿También, cómo se define AT91C_BASE_AIC y AIC_SVR? ¿él se define como volátil?
¿Puede usted reproducir el problema quitando código todo no pertinente, para excluirle tener un mán indicador el incrementar de su registro?
Otras soluciones  
 
programming4us programming4us