travamento ARM7...

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

travamento ARM7...

Mensagempor fabim » 11 Mar 2011 12:14

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.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Re: travamento ARM7...

Mensagempor andre_luis » 11 Mar 2011 13:26

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 ?

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor fabim » 11 Mar 2011 13:49

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!!!
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor tcpipchip » 11 Mar 2011 14:25

Se voce nao declarar como FLOAT, dá o mesmo erro ?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor fabim » 11 Mar 2011 15:04

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.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Re: travamento ARM7...

Mensagempor Rodrigo_P_A » 11 Mar 2011 15:06

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
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor fabim » 11 Mar 2011 15:07

rodrigo !!!
Disfarça,
ponteiro = &data !!!

incrementando o valor, e não posição na ram.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor xultz » 11 Mar 2011 15:19

rodrigo !!!
Disfarça,
ponteiro = &data !!!

Droga, já estava com meu "HAHAHAHAHA" pronto...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor tcpipchip » 11 Mar 2011 17:48

È que nunca tinha visto ponteiro para FLOAT...
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor Rodrigo_P_A » 11 Mar 2011 17:57

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.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor fabim » 11 Mar 2011 20:14

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..
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor polesapart » 11 Mar 2011 22:38

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)
Warning: time of day goes back (-163479us), taking countermeasures. :)
Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba

Mensagempor fabim » 12 Mar 2011 16:12

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Rodrigo_P_A » 12 Mar 2011 16:31

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 ?
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor fabim » 12 Mar 2011 17:20

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.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Próximo

Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x