Página 1 de 2

code optimization do keil

MensagemEnviado: 15 Mar 2007 10:23
por j.silvestre
Poderia o code optmization do keil dependendo do nivel escolhido ferrar
o código que vc escreveu ??? eu acho que sim. Alguem já passou por isso?




j.silvestre

MensagemEnviado: 15 Mar 2007 17:35
por Viktor
Nunca passei por isso. É possível que isso esteja acontecendo, mas por outros motivos.

Re: code optimization do keil

MensagemEnviado: 17 Mar 2007 09:42
por setyco93
j.silvestre escreveu:Poderia o code optmization do keil dependendo do nivel escolhido ferrar
o código que vc escreveu ??? eu acho que sim. Alguem já passou por isso?


Já aconteceu comigo várias vezes, mas ainda não consegui descobrir o porque.
Teve um código que originalmente era escrito para o AVC51, quando modifiquei e compilei com o keil, compilava mas o funcionamento ficava muito estranho.
Dava a impressão que partes do código haviam sido modificados ou eliminados, só foi resolvido depois que abaixei o nivel de otimização.
Então acho que isso depende muito da forma como estruturamos o código.

MensagemEnviado: 17 Mar 2007 15:11
por lucflores
Aproveitando o tópico, como faso para baixar ou aumentar o nível de optmization do keil???? valeu...

MensagemEnviado: 19 Mar 2007 14:46
por setyco93
lucflores escreveu:Aproveitando o tópico, como faso para baixar ou aumentar o nível de optmization do keil???? valeu...


Menu "Project"
Options for target 'target1'

clique na orelha "C51"

Na janela "Code Optimization" escolha em level o nivel de otimização desejado. Em "Emphasis" escolha "Favor Size" se quiser priorizar o tamanho (vai gerar .HEX menor, porem não necessáriamente o mais rápido) e "Favor Speed" prioriza a velocidade (Gera .HEX mais rápido porem não necessáriamente o menor).

MensagemEnviado: 20 Mar 2007 09:00
por lucflores
Ok, Obrigado

MensagemEnviado: 11 Abr 2007 15:35
por j.silvestre
senhores

Confirmado dependendo do nivel de optimization escolhido o keil ferra o seu código... diminui o numero de variaveis na data e do código gerado mas te quebra as pernas. um nivel seguro qu eu achei foi o nivel 3.
veja um exemplo onde deu pau até o nivel 4:

unsigned char u,d,c,m; //unidade ,dezena ,centena ,milhar
val = val * 10;//
//val =(unsigned char) val;

d=val/10;
d= d % 10;
d= (d + 0x30);


c=val/100;
c=c % 10;
c=c+'0';

ele deixava o valor do C e do D iguais e não somava o 0x30.


j.silvestre

MensagemEnviado: 11 Abr 2007 19:25
por Maurício
Salve, Silvestre.

As variáveis que vc criou são usadas em outro lugar depois dos cálculos que são feitos nelas, ou vc só criou este programa para testes ?

Se o caso é o de testes, os compiladores otimizam mesmo o uso da memória. Se uma posição puder ser ocupada por outra variável, o compiladoor vai usar essa posição para a nova variável. Talvez por isso, que suas duas variáveis possuam o mesmo valor.

Agora, se o seu programa USA realmente as variáveis que vc criou, se o compilador conseguiu alocar espaço para elas, então, elas terão seus valores corretos.

[]'s

RETI.

MensagemEnviado: 11 Abr 2007 20:09
por j.silvestre
Grande Mauricio blz ???

Eram variaveis locais, mas tinham que manter, o seu valor diferente até o
final da função...e não mantiveram... no nivel 8 entre data e idata o keil
reservou 117,2 bytes, no nivel 3 reservou 123,2 bytes. depois eu refiz a função de outra maneira com mais variveis locais e funcionou no nivel 8.
mas se eu fizer daquele jeito:

d=d %10;
d= d+0x30;

c= c/10;
c= c+0x30;

dá pau na certa.

isso foi o que eu consegui ver e provar que estava errado... mas comigo está acontecendo algumas coisas estranhas no nivel 8, tipo variaveis da classe extern as vezes da pau... por via das duvidas vou continuar no nivel 3. Como vc é o guru do Keil... testa ai e posta os resultados hehehe...

j.silvestre

MensagemEnviado: 11 Abr 2007 20:22
por ijftec
Ola!
Por essas e outras ainda continuo com assembly. Não dá pau, é mais enxuto, usa pouca memória, temos domínio total da máquina....... e por ai a fora. No C cada programa que foi feito no Keil, não compila no XXX, o programa feito no YYY não compila no ZZZ.........
Viva o assembly!!!!!!!!!!!!!!
Visite
www.ijftec.com.br

MensagemEnviado: 11 Abr 2007 22:08
por Maurício
É isso aí, Inácio, assembly é O CANAL. Melhor linguagem de programação já lançada até agora.

Silvestre. Me manda o seu programa pra eu dar uma olhada e fazer uns testes. Apesar de que eu estou usando menos o Keil, eu sempre deixei a otimização no nível default. Os programas funcionam.... eu nem me preocupo! :lol: 8) :lol:

maucsa@hotmail.com

[]'s

RETI.

MensagemEnviado: 11 Abr 2007 22:16
por Maurício
j.silvestre escreveu:...mas comigo está acontecendo algumas coisas estranhas...
j.silvestre


eheheheheh

Isso é porque vc ainda não usou o AVRStudio pro AVR.
Usa ele lá, e comprove que a frase "Eu era feliz e não sabia", é a mais pura verdade. :lol: :lol: :lol:

A vantagem é que é de greitis!! Isso já É uma grande vantagem !!! 8) :lol:

[]'s

RETI.

MensagemEnviado: 18 Abr 2007 13:32
por j.silvestre
Mauricio estou postando uma pequena rotina aqui.


-----------------------------------------------------------------------------------------

#include<REG935.H>
void prepara_temp(float val );

void main(void)
{

prepara_temp(123.4);

while(1){}
}








void prepara_temp(float val )
{

float a;
unsigned char b,dec,uni,dez,cent;
b= val;
a = b;

a= val - b;
a = a *10;
dec = a;
dec = dec + '0';
uni = b % 10;
uni = uni + '0';
dez = b /10;
dez = dez % 10;
dez = dez + '0';
if(b >=100)
{
cent = b / 100;
cent = cent + '0';
}
else
{
b = 0;
}

while(1){}

}

-------------------------------------------------------------------------------------

compile no keil usando o nivel 8 de optimization... e depois o nivel 3.


he..he..


j.silvestre

MensagemEnviado: 19 Abr 2007 04:51
por Maurício
j.silvestre.

Rodei o programa e rodou normal. O Keil não está estragando o código. Ele está fazendo a função pra qual ele foi programado, que é otimizar.
Experimente rodar esse programa no modo 0, e verifique o tamanho do código e o número de bytes ocupados por variáveis.

Variável que não vai ser utilizada, não precisa ser atendida. Não gera código, enfim, economiza uma memórinha. 8)
É assim que funciona.

[]'s

RETI.

MensagemEnviado: 19 Abr 2007 09:40
por j.silvestre
Humm...

na verdade a rotina original era esta :

#include<REG935.H>
void prepara_temp(float val );
unsigned char buffer[8];
void main(void)
{

prepara_temp(123.4);

while(1){}
}








void prepara_temp(float val )
{

float a;
unsigned char b,dec,uni,dez,cent;
b= val;
a = b;

a= val - b;
a = a *10;
dec = a;
dec = dec + '0';
uni = b % 10;
uni = uni + '0';
dez = b /10;
dez = dez % 10;
dez = dez + '0';
if(b >=100)
{
cent = b / 100;
cent = cent + '0';
}
else
{
b = 0;
}

buffer[0] = dec;
buffer[1] = uni;
buffer[2] = cent;
while(1){}

}

no code optimization 8 ele salva BUFFER como zero; já no código 3 salva as variaveis corretas.

testa ai...


j.silvestre