Cuidados em C

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Cuidados em C

Mensagempor veioloko » 17 Nov 2006 06:59

Olá pessoal!

sou iniciante em programação em C para microcontroladores.

Que cuidados eu tenho que ter em relação a parte de memoria, area de codigo, bits etc do microcontrolador?

Pois não sei se as "variaveis" podem sobreescrever uma area de codigo por exemplo. Não sei se fui claro.

É que por exemplo tenho uma rotina para ler o A/D funcionando e um display lcd. É so adicionar mais linhas de mensagens no lcd que o a/d nao funciona mais. É como se estourasse a RAM não sei.

obs.: Estou usando um texas 1200y3

Obrigado
veioloko
Byte
 
Mensagens: 348
Registrado em: 10 Nov 2006 06:01
Localização: São Bernardo do Campo

Mensagempor brasilma » 17 Nov 2006 07:56

Creio que o problema não seja esse; uma das vantagens dos compiladores C é justamente o gerenciamento dos recursos de hardware (o programador não tem de se preocupar com posição e tamanho do stack, alocação de RAM para variáveis, localização das constantes na ROM, etc), e caso haja algum problema, no momento da compilação ele dá o erro e nem termina de compilar.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor andre_luis » 17 Nov 2006 08:28

É, o único cuidado - que obviamente é indiferente em Assembly ou 'C' - é com relação aos ponteiros, pois eles são acessados dinamicamente.
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Paulo » 17 Nov 2006 08:30

É o que o Brasilma disse, mas vc tem que ter um pouco de preocupação sim, dependendo da sua aplicação, pois se vc faz uma alocação de variáveis locais de forma dinâmica, em execução, isso pode ocasionar em um estouro de stack ou outro problema.Também tem que ficar atento com funções que utilizam recursividade, pelo mesmo problema citado anteriormente, mas programar em C é bem mais legível e mais fácil que Assembly, digo isso porque já programei em Assembly durante muito tempo e hoje não vejo outra maneira que não seja C ou talvez um C++, mas aí é outra conversa, pois sai da linguagem estruturada e entra em conceito de orientação a objetos.
Acho que vc deve iniciar com algumas aplicações simples, para se familiarizar com a linguagem, compilador e sentir como isso funciona e depois partir para aplicações mais expressivas.
Qq coisa posta aí, que a galera vai te dando apoio e dicas no que for possível.

Até +...
Paulo D.
"Se o teu sonho for maior que ti, Alonga tuas asas, Esgarça os teus medos, Amplia o teu mundo, Dimensiona o infinito, E parte em busca da estrela... " (Trecho de Voa - Ivan Lins / Leda Selma)
Avatar do usuário
Paulo
Byte
 
Mensagens: 421
Registrado em: 07 Nov 2006 07:26

Mensagempor veioloko » 17 Nov 2006 09:28

Olá! O que seria:

se vc faz uma alocação de variáveis locais de forma dinâmica,
Teria algum exemplo? Pois não entendi muito bem.

Sei o que sao variaveis locais, mas o que seria forma dinamica?

e o que é recursividadee?
Que retornam um valor?

obrigado
veioloko
Byte
 
Mensagens: 348
Registrado em: 10 Nov 2006 06:01
Localização: São Bernardo do Campo

Mensagempor Jorge_Francisco » 17 Nov 2006 10:12

Quando um programa é executado,é reservado um espaço de memória para o código (ou instruções do programa) e outro espaço para as variáveis usadas durante a execução. Grosso modo, esses espaços ocupam uma mesma região, que podemos denominar memória local. Também existem outras zonas de memória, como a pilha, usada, entre outras coisas, para realizar o intercâmbio de dados entre as funções. O resto, a memória que não estiver em uso por nenhum programa, é o que se conhece por memória livre (área de alocação dinâmica, heap ou free store). Quando um programa usa a área de alocação dinâmica, naturalmente estará usando parte desse resto de memória.


O maior poder esperado na utilização de ponteiros decorre, justamente, de seu uso junto a esse conceito de alocação de memória dinamica.


Uma função recursiva é aquela que faz uma chamada a si mesma(direta ou indiretamente.Exemplo:


Código: Selecionar todos
unsigned int fatorial(unsigned int n)
{
    if(n == 0)
    return 1;

   n= n *  fatorial (n-1);

  return n;
}



Abraços
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Paulo » 17 Nov 2006 12:46

veioloko,

Acho que o Jorge_Francisco, respondeu as suas perguntas, mas caso vc não tenha entendido ou possua alguma uma outra dúvida, coloque aí que vamos conversando sobre o assunto.

Até +...
Paulo D.
"Se o teu sonho for maior que ti, Alonga tuas asas, Esgarça os teus medos, Amplia o teu mundo, Dimensiona o infinito, E parte em busca da estrela... " (Trecho de Voa - Ivan Lins / Leda Selma)
Avatar do usuário
Paulo
Byte
 
Mensagens: 421
Registrado em: 07 Nov 2006 07:26

Mensagempor veioloko » 20 Nov 2006 15:02

Olá!

Então seria melhor eu usar variáveis globais do que variaveis locais?

Então estou tendo problema quando adiciono muitas linhas :

Código: Selecionar todos
lcd_env_inst(0x80);
lcd_puts("TESTEEEE 1.00");
lcd_env_inst(0xc0);
lcd_puts("programa doido  ");


onde lcd_puts é

Código: Selecionar todos
void lcd_puts(char *aaa){
unsigned int i=0;
for(;aaa[i]!=0;i++)lcd_env_dado(aaa[i]);
}


Se adiciono por exemplo umas 10 vezes o primeiro codigo o programa não le mais o A/D
veioloko
Byte
 
Mensagens: 348
Registrado em: 10 Nov 2006 06:01
Localização: São Bernardo do Campo

Mensagempor veioloko » 22 Nov 2006 09:34

Funcionou aqui de outro jeito....
esta usando sprintf.....acho que isso consome muita memoria não sei...
fiz do modo normal mesmo que é enviar dado por dado....tipo em assembler...funcionou!
veioloko
Byte
 
Mensagens: 348
Registrado em: 10 Nov 2006 06:01
Localização: São Bernardo do Campo


Voltar para 8051

Quem está online

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

x