Entrar    Registrar

Dica do VonNilmam

Software e Hardware para uC PIC

Moderadores: aluis-rcastro, guest2003, 51, Renie

  • Autor
    Mensagem

Dica do VonNilmam

Mensagempor Guri » 04 Set 2019 10:57

:D Venho muito humildemente compartilhar com todos os amigos algumas das minhas experiências com linguagem C. Essa dica foi feita com base no Mikroc.

Não sei se vai ajudar alguém, porém tenho observado uma coisa até que óbvia, mas que pode passar desapercebido e causar muitos transtornos.

Sempre que você utilizar uma variável LOCAL na interrupção e essa variável tiver que ser "manipulada" fora da interrupção, lembre-se de que variáveis LOCAIS, são utilizadas apenas naquele momento da sua execução, após isso ela é "descartada".

Exemplo:

"FORMA ERRADA" :cry:

Rotina utilizando a interrupção do TIMERx:
voide timer....}
rotina de interrupção....

Rotina comum que esta dentro da interrupção do TIMERx
void PiscaumLed()
{unsigned char Contador (essa variável é declarada localmente, aqui esta o problema)
if(Contador==100)
{
Contador=0;
PiscaLed=~PiscaLed;
}Contatdor++;
}

Notem que a a variável Contador foi declarada como LOCAL, note também que o protótipo void "PiscaumLed()" é uma rotina de chamada que tem uma "variável GLOBAL".
Caso você declare ela como LOCAL, como é o caso da rotina acima, acontecerá que a contagem dessa variável vai se perder.
O correto é fazer a declaração GLOBAL, ficando assim:

"FORMA CORRETA" :lol:

unsigned char Contador; (essa variável esta sendo declarada de forma GLOBAL).

Rotina comum que esta dentro da interrupção do TIMERx
void PiscaumLed()
{
if(Contador==100)
{
Contador=0;
PiscaLed=~PiscaLed;
}Contatdor++;
}

Peço desculpas se não consegui me expressar corretamente, espero que tenham entendido e ficarei muito feliz se apenas um amigo for beneficiado com esta dica...deixem seus comentários.
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 264
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dica do VonNilmam

Mensagempor eletroinf » 04 Set 2019 11:34

Tem outra forma de fazer, escondendo a variável do resto do código.
Se a variável é global, ela pode ser acessada de qualquer lugar (exportando) ou, ao menos de todo o arquivo .c que ela se encontra (no seu caso aí). Isso abre espaço pra tu fazer mesbla, mexendo indevidamente na variável a partir de outras partes do código.

Tu pode usar uma variável que se preserva (como se fosse global), mas restrita à função, usando o modificador static.
Com o static a variável se mantém, mas só é visível para a função na qual é declarada. Não esqueça de inicializar as variáveis. Tome isso por hábito, e dispensará muitas dores de cabeça, :)
Ficaria algo como:

Código: Selecionar todos
//Rotina comum que esta dentro da interrupção do TIMERx
void PiscaumLed()
{
static unsigned char Contador=0;

if(Contador==100)
{
Contador=0;
PiscaLed=~PiscaLed;
}Contatdor++;
}
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 778
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Dica do VonNilmam

Mensagempor vtrx » 04 Set 2019 12:15

Demorei um pouco a entender a declaração STATIC dentro de uma função,até que um dia testei ela como Global,e a rotina retornou valores aleatórios...principalmente na primeira execução.
vtrx
Dword
 
Mensagens: 1872
Registrado em: 20 Abr 2008 21:01

Re: Dica do VonNilmam

Mensagempor Guri » 06 Set 2019 09:42

Essa da função STATIC, eu não conhecia.

Vou testar, achei interessante (ela se comportar como GLOBAL, porém esta declarada como LOCAL).

Só uma dúvida? Se eu chamar essa variável STATIC, de fora da ROTINA, tendo o mesmo nome, não haveria perigo então de "mexer nela", né! :mrgreen:

Por falar em macetes, tomei conhecimento (ainda não testei), de uma função chamada de STRUCT.

Pelo que lí, ela parece ser uma instrução muito LINDA, pois consegue "espelhar" se assim posso dizer, uma determinada quantidade de variáveis de forma muito transparente, ideal para uso em banco de dados.

Se alguém puder comentar mais sobre ela seria legal, pois existem funções muito interessantes em C e fico admirado com tanta flexibilidade.

8) , só um detalhe a esclarecer: "como eu sou do tempo antigo do assembler", tenho a perpectiva de montar variáveis globais como hábito, mas aprendi que variáveis LOCAIS são uma ótima pedida também e efeicientes.
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 264
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Dica do VonNilmam

Mensagempor xultz » 06 Set 2019 16:24

Guri, uma variável static é local, então de fora você não consegue acessá-la. Se você declarar uma global com o mesmo nome da local, até onde já percebi, o compilador trata como duas variáveis diferentes, e se você tentar acessar de dentro da função, vai acessar a variável local.

As structs não são uma função, são um tipo de variável. Ela serve prá você agrupar dentro várias variáveis do tipo que você quiser.
A maneira mais comum de usar struct é criando um novo tipo, você faz isso fora das funções, como se fosse uma variável global (mas você não está criando uma variável, está criando um novo TIPO de variável), assim:
Código: Selecionar todos
typedef struct
{
    float Peso;
    int Idade;
    float Altura;
} Pessoa;


Dentro de qualquer função (ou mesmo como variável global) você pode criar uma nova variável struct com este tipo que você inventou, por exemplo:
Pessoa usuario;

E pode colocar os valores assim:
usuario.Peso = 98.3;
usuario.Idade = 45;
usuario.Altura = 1.87;

O interessante é que uma estrutura pode ser usada como retorno de uma função. Da mesma maneira que uma função pode retornar um int, um char, um float, ela também pode retornar Pessoa.
Uma estrutura pode ter dentro outra estrutura, que pode ter outra estrutura, até onde tua imaginação permitir.
E uma estrutura pode ter também um ponteiro para outra estrutura, inclusive do mesmo tipo. Isso é muito útil prá criar uma lista encadeada, é um recurso bem legal.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2923
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Voltar para PIC

Quem está online

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