Página 1 de 2
travamento ARM7...

Enviado:
11 Mar 2011 12:14
por fabim
Imaginem a seguinte situação.
float data,*ponteiro;
void temp_1khz(void)__IRQ{
Se botao_inc precionado
*ponteiro += 1;
Se botao_dec precionado
*ponteiro -= 1;
}
int main(void){
X
X
X
ponteiro = &ponteiro;
while(1){
xxx
xxx
xxx
neste ponto eu vou usar a variavel data;
xxx
xxx
xxx
xxx
}
}
Vejam que tem uma maquina de estados infinita no main, e que a cada uma volta ela vai fuçar na variavel data;
PERGUNTA:> Por que, raioz de motivos!?
Se o main estiver manipulando DATA, e acontecer a interrupção de 1khz, e esta incrementar ou decrementar o *ponteiro.
Acontece o DAbtHandler ?
Lembrando que o DABT acontece quando tenta acessar um endereço inacessivel, ou escrever algo na flash.
Re: travamento ARM7...

Enviado:
11 Mar 2011 13:26
por andre_luis
fabim escreveu:...Se botao_inc precionado...
Se esta lógica for implementada por nível, ao invéz de pulso, nada garante que o tempo de acionamento do botão INC seja o mesmo que o do botão DEC, e assim &ponteiro poderá fazendo um acesso á uma área proibida pelo linker.
Não é isso que pode estar acontecendo ?
+++

Enviado:
11 Mar 2011 13:49
por fabim
cara não vejo como isso pode acontecer.
lembre-se!!!
*ponteiro += 1; ou *ponteiro -=1;
não estou fuçando no endereço apontado pelo ponteiro, e sim ao valor que o ponteiro esta apontando!!!

Enviado:
11 Mar 2011 14:25
por tcpipchip
Se voce nao declarar como FLOAT, dá o mesmo erro ?

Enviado:
11 Mar 2011 15:04
por fabim
tcpipchip escreveu:Se voce nao declarar como FLOAT, dá o mesmo erro ?
poisé"!!! não...
Se eu fizer com inteiro signed ou não, fica lindamente redondo, só trava com float.
Re: travamento ARM7...

Enviado:
11 Mar 2011 15:06
por Rodrigo_P_A
fabim escreveu:Imaginem a seguinte situação.
float data,*ponteiro;
void temp_1khz(void)__IRQ{
Se botao_inc precionado
*ponteiro += 1;
Se botao_dec precionado
*ponteiro -= 1;
}
int main(void){
X
X
X
ponteiro = &ponteiro;
while(1){
xxx
xxx
xxx
neste ponto eu vou usar a variavel data;
xxx
xxx
xxx
xxx
}
}
Vejam que tem uma maquina de estados infinita no main, e que a cada uma volta ela vai fuçar na variavel data;
PERGUNTA:> Por que, raioz de motivos!?
Se o main estiver manipulando DATA, e acontecer a interrupção de 1khz, e esta incrementar ou decrementar o *ponteiro.
Acontece o DAbtHandler ?
Lembrando que o DABT acontece quando tenta acessar um endereço inacessivel, ou escrever algo na flash.
mas o ponteiro tá apontando pra onde?
isso aqui está no seu código: ponteiro=&ponteiro
vc está apontando o ponteiro para o endereço do ponteiro?
Provavelmente vc num inicializou corretamente o ponteiro e está incrementando de tal forma que chega a um valor de memória que não existe

Enviado:
11 Mar 2011 15:07
por fabim
rodrigo !!!
Disfarça,
ponteiro = &data !!!
incrementando o valor, e não posição na ram.

Enviado:
11 Mar 2011 15:19
por xultz
rodrigo !!!
Disfarça,
ponteiro = &data !!!
Droga, já estava com meu "HAHAHAHAHA" pronto...

Enviado:
11 Mar 2011 17:48
por tcpipchip
È que nunca tinha visto ponteiro para FLOAT...

Enviado:
11 Mar 2011 17:57
por Rodrigo_P_A
fabim escreveu:rodrigo !!!
Disfarça,
ponteiro = &data !!!
incrementando o valor, e não posição na ram.
qual tamanho da pilha para ser usada na interrupção?
eu "ACHO" que a rotina de float deve fazer chamada a alguma subrotina e deve estar usando a pilha, e talvez seja que a sua pilha esteja configurada com valor muito baixo, e faz com q o uC acesse uma região de memória não acessível etc....
ou, talvez o compilador usa muita memória e tua pilha tá pequena.
Tudo é "teoria do achismo" pois eu num sei como é seu projeto e num conheço melhor seu programa.

Enviado:
11 Mar 2011 20:14
por fabim
o sistema é regido por uma interrupção que acontece a cada 1mS.
Ali dentro lê o touch screem, testa todas as teclas, le o encoder incremental que trabalha com incremento de um ponteiro int e um ponteiro float.
faz o papel pid, xon-xoff. Testa valores para acionar alarmes, etc etc etc..

Enviado:
11 Mar 2011 22:38
por polesapart
Pois é, qual o tamanho da pilha no modo irq então? tua int tá trabalhando demais, provavelmente é estouro de pilha. Se você tiver usando floats ou coisas do gênero na irq, lembrando que o suporte a floats é todo emulado, por baixo do pano estão sendo chamadas várias funções taradas por pilha.
Por essas e outras que tenho preferido um rtos (simples, nada doutro mundo), assim as ints fazem o mínimo dos mínimos e o resto é processado em modo user, system, ou o que for.
(neste contexto ints = interrupções, não inteiros)

Enviado:
12 Mar 2011 16:12
por fabim
intão polesapart.
Fiz um teste simples, e criei dois flags flag_inc, flag_dec.
La no main, eu vejo se inc ou dec esta a um, e eu somo ou subtraio 0.1 nos setpoints....
Eu sempre trabalho com maquina de estados em coisas que necessitam de **** confiabilidade...
E todas as variaveis possuem OLD_VALOR, e são tratadas somente se atual diferente de OLD..
Assim o refresh dos valores no display fica putaquepariumente rapido, e simples!!!
me add no msn, que depois te mostro um vidiozinho de como ficou.
fableach@hotmail.com

Enviado:
12 Mar 2011 16:31
por Rodrigo_P_A
fabim escreveu:intão polesapart.
Fiz um teste simples, e criei dois flags flag_inc, flag_dec.
La no main, eu vejo se inc ou dec esta a um, e eu somo ou subtraio 0.1 nos setpoints....
Eu sempre trabalho com maquina de estados em coisas que necessitam de **** confiabilidade...
E todas as variaveis possuem OLD_VALOR, e são tratadas somente se atual diferente de OLD..
Assim o refresh dos valores no display fica putaquepariumente rapido, e simples!!!
me add no msn, que depois te mostro um vidiozinho de como ficou.
fableach@hotmail.com
mas qual é o tamanho da pilha para IRQ ?

Enviado:
12 Mar 2011 17:20
por fabim
bom rodrigo, como eu não to usando muita ram interna.
UND_Stack_Size EQU 0x00000200
SVC_Stack_Size EQU 0x00000200
ABT_Stack_Size EQU 0x00000200
FIQ_Stack_Size EQU 0x00000200
IRQ_Stack_Size EQU 0x00000200
USR_Stack_Size EQU 0x00000200
soquei 1024 pra todo mundo, sendo que não uso 1024 nem de longe nas ints.