Página 1 de 1
Cuidados em C

Enviado:
17 Nov 2006 06:59
por veioloko
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

Enviado:
17 Nov 2006 07:56
por brasilma
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.

Enviado:
17 Nov 2006 08:28
por andre_luis
É, o único cuidado - que obviamente é indiferente em Assembly ou 'C' - é com relação aos ponteiros, pois eles são acessados dinamicamente.

Enviado:
17 Nov 2006 08:30
por Paulo
É 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.

Enviado:
17 Nov 2006 09:28
por veioloko
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

Enviado:
17 Nov 2006 10:12
por Jorge_Francisco
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

Enviado:
17 Nov 2006 12:46
por Paulo
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.

Enviado:
20 Nov 2006 15:02
por veioloko
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

Enviado:
22 Nov 2006 09:34
por veioloko
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!