Erro no uso de funções no MikroC

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Erro no uso de funções no MikroC

Mensagempor lpagano » 21 Set 2008 09:17

Tenho um programa aqui em que o mesmo tem 6 funções diferentes, incluíndo a main ( ).
Quando estou fazendo o programa e uma segunda função é chamada esta num determinado local chama uma terceira função. Após a chamada desta terceira função, há um local nessa terceira função em que a segunda função é chamada novamente.
Nesse ponto o compilador dá o seguinte erro: Undeclared identifier ["nome da segunda função"].

Para exemplificar melhor veja abaixo:

Código: Selecionar todos



void funcao_1 ( )
{

...
...
       funcao_2 ( );
...
...

}



void funcao_2 ( )
{

...
...
       funcao_1 ( );       // o erro acontece quando eu incluo essa linha
...
...

}



void main ( )
{

...
...
      funcao_1 ( );       
...
...

}






Ou seja, uma função 2 chama a função 3, e vice-versa.
Não necessariamente essas duas vão ficar num loop, isso depende das condições internas de cada uma, mas o compilador não está aceitando.

É claro que dentro das funções que eu falei, tem chamadas para outras funções em que não tive problemas na compilação.

Só para comentar, uma vez me disseram que o PIC tem um limite pequeno para esses "pulos" de programas, mais conhecidos como Stack Pointer. Será que tem alguma coisa em haver ou estou falando besteira?

Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor barboza » 21 Set 2008 12:08

Seu problema deve estar na montagem do seu projeto e organização dos seus arquivos fontes.

Você fez a declaração dos prototipos das funções?

Poste seu arquivo fonte...
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Erro no uso de funções no MikroC

Mensagempor Renie » 21 Set 2008 14:06

Olá Ipagano,

Não sei como o MikroC vai montar isso, mas, este tipo de estrutura
recursiva é bem perigosa, se não for muito bem controlada, corre o
risco de estourar a pilha do PIC.
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor joao » 21 Set 2008 15:15

Ola Lpagano,

Provavelmente você precisa declarar essas funções.
o que acontece é uma função não consegue achar uma outra função que está abaixo dela. Pegando o seu código como exemplo, a função 2 está abaixo da função 1. Então, se vc chamar a função 1 dentro da funçào 2. Ou ainda chamar a função 1 ou 2 dentro do main, não tem problema, porque elas já foram criadas. Mas se a função 1 tentar chamar a funçào 2, você tem erro, porque ela está tentando chamar algo que ainda não foi criada.

Para resolver o seu problema, você precisa criar um prototipo da funções entre os includes e o começo da criacao das funcoes, como no exemplo abaixo:

Código: Selecionar todos
#include....
#include....

//Prototipo
void funcao_1 ( );
void funcao_2 ( );

//Inicio das funcoes
void main ( )
{

...
...
      funcao_1 ( );       
...
...

}

void funcao_1 ( )
{

...
...
       funcao_2 ( );
...
...

}



void funcao_2 ( )
{

...
...
       funcao_1 ( );       // o erro acontece quando eu incluo essa linha
...
...

}


Com os prototipos, agora é até possivel usar as funcoes depois do main.

Espero que tenha entendido.

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor joao » 21 Set 2008 15:16

mensagem repetida.
Editado pela última vez por joao em 21 Set 2008 16:09, em um total de 1 vez.
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor lpagano » 21 Set 2008 15:46

joao,

Não sabia desse detalhe no C.

Por mim eu sempre fiz a função main ( ) como sendo a última da lista, ou seja, sem protótipos.

Mas fiz como você disse e aí na compilação deu erros de "Call Stack Overflow" e "Recursion or Cross-Calling funcao_1".
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor joao » 21 Set 2008 16:12

Olha,

Acho que dai esse erro pode ser o problema que o Renie comentou.
Porque é que nem recursividade. Vc acaba colocando na pilha(stack) a cada nova chamada de uma mesma função.
Eu sei que tem um limite no PIC, mas não sei de quanto que é. Quem souber, por favor, poste ai.
Mesmo assim, você pode colocar mais dados sobre os erros?(linha, função e etc)
Quem sabe é outra coisa que está acontecendo...

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Sergio38br » 21 Set 2008 19:33

boa noite, linha 16F a pilha é de 8 e a linha 18F é de 31 niveis

[ ]'s

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor lpagano » 22 Set 2008 16:37

Sérgio,

Você escreveu o que eu iria escrever agora.

Bom, só para complementar eu estou usando o PIC 16F877A que tem 8 posições de pilha. Quando eu mudei para o 18F4520 que tem 31 posições o problema continuou.

No assembly desse código eu verifiquei que tenho 25 instruções "CALL" e nenhuma interrupção, portanto no 18F deveria funcionar.

Esse meu programa é aquele famoso reloginho com o DS1307 em que os comandos de configuração e leitura do barramento I2C criam vários CALLs no assembly.

O que vou tentar agora é eliminar essa chamada de função que está dando esse problema, ou seja, tentar voltar na função anterior de outra forma.


Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor turuna » 22 Set 2008 17:10

Mas pra estourar a pilha da linha 16 só se; o programa está no main vc chama uma subrotina ai dentro desta se vc chamar outras 8 subrotinas sem um return ai sim estoura a pilha, mas se chamar e retornar ao main houve um desempilhamento e tudo permanece como antes...........

Turuna
turuna
Nibble
 
Mensagens: 97
Registrado em: 10 Mar 2008 12:50

Mensagempor lpagano » 23 Set 2008 13:45

turuna,

Então o meu problema não é esse pois tenho várias funções. Só na chamada da configuração do I2C que tem alguns CALLs. Mas antes nunca tive problema com isso.

Ontem eu já consegui fazer um jeito de evitar isso. Deu certo. Fiz vários SEs um dentro do outro.

Obrigado pela ajuda de todos!!!!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23


Voltar para PIC

Quem está online

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

x