Pergunta : O ponteiro da função corrompeu/deslocou quando passado à função

Assim eu estou tendo mais divertimento com meu AT91SAM9261.  Eu estou tentando inicializar uma interrupção do sistema para setup um alimentador a um temporizador perioidic da interrupção. Eu sou bonito muito copiando o código do exemplo para fazer isto.   Eu estou começ a resultados diferentes estranhos quando eu funciono meu código, da amostra code.

On a boa seqüência no projeto que veio com IAR EWARM, ele da amostra chamo:

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit); o
where AT91C_ID_SYS=1 (interrupção do sistema), e ISR_Pit são uma função com

and do prototype

void ISR_Pit na posição de memória 0x200011B8.  o

And eu sigo a ligação de controle com o seguinte:

void IRQ_ConfigureIT (fonte não assinada do int, modalidade não assinada do
int, vácuo do
(*handler) (vácuo))
{inutilização do
// o first
da interrupção AT91C_BASE_AIC->AIC_IDCR = 1 << fonte; o

// configura a modalidade e o handler
AT91C_BASE_AIC->AIC_SMR [source] = modalidade;
AT91C_BASE_AIC->AIC_SVR [source] = (int não assinado) alimentador; interrupt
do

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


and do
} no line

AT91C_BASE_AIC->AIC_SVR [source] = (int não assinado) alimentador; o

I considera a mudança do registo AIC_SVR_1 a 0x200011B8, que é todo o

On do *** de good.

à seqüência má.  Quando eu faço a mesma chamada de meu programa (mim ter o cortado e colado a mesma iniciação e rotinas de ISR):

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit); o

I verific que AT91C_ID_SYS é o valor 1, e ISR_Pit é uma função do prototype

void ISR_Pit (vácuo) no endereço 0x200000A4

And então que eu o sigo no

void IRQ_ConfigureIT2 da chamada (fonte não assinada do int, modalidade não assinada do
int, vácuo do
(*handler) (vácuo))
{inutilização do
// o first
da interrupção AT91C_BASE_AIC->AIC_IDCR = 1 << fonte; o

// configura a modalidade e o handler
AT91C_BASE_AIC->AIC_SMR [source] = modalidade;
AT91C_BASE_AIC->AIC_SVR [source] = (int não assinado) alimentador; interrupt
do

// AT91C_BASE_AIC->AIC_ICCR = 1 << fonte; o

And do
} eu inspeciono o valor do “alimentador” e é o endereço 0x200000A5 (!!!), um byte mais do que o ponteiro passado.  E eu ver o registo mudar ao valor incorreto 0x200000A5, quando eu o quero apontar em meu endereço de ISR_Pit do

So que do *** de 0x20000A4.

meu ponteiro da função começ nudged por um quando eu chamei a função.  Assim minhas duas perguntas são:

1) o que você peritos faria nos termos mesmo de pesquisar defeitos esta observação estranha?  Que podia explicar este?  Minha obtenção da pilha é derrotada?  Mais edições do alinhamento da memória?
2) o que pode mim fazer para satisfazer os deuses encaixados, quem eu enfureci claramente?

Thanks muito para algum thoughts.
class= do

Resposta : O ponteiro da função corrompeu/deslocou quando passado à função

Verific sempre a lima do mapa para ver os offsets corretos.
Distante disso, fazem os trabalhos do código?
Também, como AT91C_BASE_AIC e AIC_SVR são definidos? são definidos como o volátil?
Pode você reproduzir o problema removendo o código toda não pertinente, para exclui-lo para ter um ponteiro mau incrementar seu registo?
Outras soluções  
 
programming4us programming4us