Entrar    Registrar

Dúvida Sinistra em C

Software e Hardware para linha ARM

Moderadores: guest2003, 51, Renie, gpenga

  • Autor
    Mensagem

Dúvida Sinistra em C

Mensagempor Guri » 13 Set 2018 13:57

Olá amigos,

Eu estou com um problema no mikroC,

Me deparei com um problema que não estou conseguindo entender.

Eu tenho uma função de interrupção do timer, eu criei um protótipo para essa interrupção, ok...até aqui tudo beleza. Tipo:

cpp code
void Timer2_interrupt() iv IVT_INT_TIM2 {
TIM2_SR.UIF = 0;
}


Agora criei um novo protótipo com outra função de DELAY, Tipo:

cpp code
void DelayMacro() {
Delay_ms(1000);
PortLed=1;
Delay_ms(500);
PortLed=0;
}


Então criei dois protótipos, sendo timer ligado na interrupção e outro que é uma rotina de tempo. Funcionam legal se chamadas lá do main...ok.

Agora se eu fizer isso dá erro na compilação "undeclarable DleayMacro(), indefinid!

cpp code
void Timer2_interrupt() iv IVT_INT_TIM2 {
TIM2_SR.UIF = 0;
DelayMacro(); // quando adiciono esse protótipo dentro desse outro protótipo dá erro, porque?
}


Pelo que entendi, o compilador esta dizendo que um protótipo não pode ser incluido em outro protótipo, isso é verdade, se é então como eu faço para chamar essa rotina DelayMacro().

Lá vem eu denovo :mrgreen: Se fosse em ASM eu simplesmente teria minha rotina DelayMacro como uma CHAMADA e poderia chamar ela de qualquer ponto do main... :oops:

Obrigado,
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dúvida Sinistra em C

Mensagempor Rodrigo_P_A » 13 Set 2018 14:01

Sobre o erro eu num sei, mas vc vai mesmo chamar uma rotina de delay dentro da interrupção?
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 1932
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Dúvida Sinistra em C

Mensagempor Guri » 13 Set 2018 14:25

É só um exemplo... :|
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dúvida Sinistra em C

Mensagempor Guri » 13 Set 2018 14:28

Corrigindo para melhor entendimento: :roll:


void DelayMacro() {

PortLed=1;

}

Então criei dois protótipos, sendo timer ligado na interrupção e outro que é uma rotina de tempo. Funcionam legal se chamadas lá do main...ok.

Agora se eu fizer isso dá erro na compilação "undeclarable DleayMacro(), indefinid!

void Timer2_interrupt() iv IVT_INT_TIM2 {
TIM2_SR.UIF = 0;
DelayMacro(); // quando adiciono esse protótipo dentro desse outro protótipo dá erro, porque?
}
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dúvida Sinistra em C

Mensagempor xultz » 13 Set 2018 14:56

Eu tive um problema semelhante, com outro compilador, e usando PIC.
A questão era que não era possível chamar uma função de dentro da ISR. Não lembro se era limitação do compilador ou do próprio PIC. Eu tentei até chamar a função como sendo inline (ou seja, compilador "copia" o código prá dentro da função, ao invés de pular prá função) mas mesmo assim não dava certo. A solução foi copiar o código prá dentro da ISR e pimba. Nunca mais tentei chamar uma função de dentro da ISR, mesmo porque essa é uma prática não muito boa.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2887
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Dúvida Sinistra em C

Mensagempor vtrx » 13 Set 2018 14:57

Delay tem que estar declarada primeiro no prototipo das funções..
vtrx
Dword
 
Mensagens: 1757
Registrado em: 20 Abr 2008 21:01

Re: Dúvida Sinistra em C

Mensagempor eletroinf » 13 Set 2018 15:15

Guri, está meio confuso de entender o seu texto.
Vamos começar pela definição de protótipo, que seria o esqueleto de uma função existente, contendo informações de variáveis de retorno, chamada, nome...
https://www.quora.com/What-is-meant-by-prototype-in-C

Bom, então tu tem a função em algum lugar e cria o protótipo para o compilador saber que existe a função em outra parte.

Obviamente o protótipo deve estar antes da parte do código em que ele é chamado.

Outro ponto é estar atendo de não utilizar a mesma função de Delay para o código "normal" e a interrupção. Mais objetivamente, o seu código pode estar executando a função de Delay e entrar na interrupção e esta chamar a mesma função, viu a bagunça que pode dar? Alguns compiladores que utilizei não avisavam desse problema, bem naquela ideia de que em C tu pode fazer tudo, inclusive "se matar".
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 723
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Dúvida Sinistra em C

Mensagempor Guri » 13 Set 2018 15:43

:lol: O Eletroinf e VTR mataram a charada.

Confuso!...realmente eu tenho uma enorme "rotina" que entra em loop, sempre quando tento explicar alguma coisa :roll: kkk

O problema é a DECLARAÇÂO de onde esta a CHAMADA.

Como eu tinha declarado a CHAMDA DelayMacro depois do protótipo onde ela iria rodar, o compilador não achava a rotina, por isso dava o erro de não estar achando a DelayMacro.h.

Só foi colocar o protótipo DelayMacro.h antes do outro protótipo, que era a rotina de interrupção,

Estou feliz, pela ajuda de todos vocês...
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dúvida Sinistra em C

Mensagempor Guri » 13 Set 2018 15:44

Sabem com isso se chama?

....xiii, até esqueci do que ia falar, kkk :mrgreen:
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dúvida Sinistra em C

Mensagempor Aquino » 13 Set 2018 17:42

Primeiro, em C protótipo é a declaração prévia da função:
void minha_funcao(void); // Isso é um protótipo


//Isso é a implementação da função
void minha_funcao(void){

//Codigos aqui

}

Quanto ao teu erro:
Nem comentarei isso, não adianta me trovar que programa em assembly :)

void DelayMacro() {
Delay_ms(1000);
PortLed=1;
Delay_ms(500);
PortLed=0;
}

Olha isso:
"undeclarable DleayMacro(), indefinid!
"...People who are really serious about software should make their own hardware..." Alan Kay
Aquino
Dword
 
Mensagens: 1777
Registrado em: 12 Out 2006 22:24

Re: Dúvida Sinistra em C

Mensagempor Aquino » 13 Set 2018 17:43

Deixei um tempão sem recarregar e vieram muitas respostas, agora vou deixar a reposta acima.
"...People who are really serious about software should make their own hardware..." Alan Kay
Aquino
Dword
 
Mensagens: 1777
Registrado em: 12 Out 2006 22:24

Re: Dúvida Sinistra em C

Mensagempor Guri » 13 Set 2018 20:02

Valeu Aquino, pela dica.

Longe de mim, "trolar" :shock:

Eu sou novato no assunto, e quando tomei referencia ao ASM, foi porque minha cabeça ainda tenta pensar desse jeito...mas estou perto da cura :roll:

Realmente foi uma grande falta de malícia da minha parte, mas aconteceu...

Agradeço a todos, :P
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dúvida Sinistra em C

Mensagempor Aquino » 13 Set 2018 21:19

Mas se voce programa coisas mais complexas, acabara precisando extruturar o codigo em varios arquivos.
Geralmente eh necessario alguma declaracao do tipo EXTERN ou semelhante para que simbolos de um modulo sejam visiveis em outros.
Eh como dizer:"Eu sou sabia fazer a conta com laranjas"
"...People who are really serious about software should make their own hardware..." Alan Kay
Aquino
Dword
 
Mensagens: 1777
Registrado em: 12 Out 2006 22:24

Re: Dúvida Sinistra em C

Mensagempor Guri » 13 Set 2018 23:31

Você tem toda a razão Aquino...Obrigado pelas dicas, :P
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 139
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dúvida Sinistra em C

Mensagempor KrafT » 14 Set 2018 07:47

Eu sou autodidata em programação e creio que o GuriVonilman também seja. O que acontece é que a falta de uma formação formal tem seus impactos. Por sorte tenho trabalhado com colegas "fodas" para dicas eventuais. Mas não é a mesma coisa, a gente sempre está defasado com o povo que estudou especificamente engenharia de software, por mais proficiente que um autodidata possa ser.

Nada disso impede que se obtenha resultados. Apenas é mais penoso.

Obs: Por outo lado, muita gente que se forma só sabe mexer com Python e Arduíno, o que é o outro extremo do problema.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2072
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Próximo

Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes