Página 1 de 1

IAR ignorando linha de código

MensagemEnviado: 21 Fev 2008 19:24
por Andredeos
Olá, estou programando um LPC2148, utilizando o IAR. Em um determinado ponto do programa eu utilizo:

if(IO1PIN & 0x4C000000)
{
M1 = (signed char) - 0.681 * trw[1] - 1.048 * trw[2] + trw[3];
M2 = (signed char) 0.884 * trw[1] - 0.884 * trw[2] + trw[3];
M3 = (signed char) 0.884 * trw[1] + 0.884 * trw[2] + trw[3];
M4 = (signed char) - 0.681 * trw[1] + 1.048 * trw[2] + trw[3];
// tem mais codigo irrelevante abaixo

}

Qd o if é verdadeiro, ele entra e executa, porem pulando a primeira linha, mas passa normal nas outras, isso foi conferido no debug.

Se alguem já viu alguma coisa assim e puder ajudar.

Obrigado.

MensagemEnviado: 22 Fev 2008 08:49
por Kremer
Mesmo que não seja possível colocar um breakpoint na primeira linha, ou mesmo se fazendo single step de a impressão de que a linha não foi executada, não faz sentido a mesma ser ignorada.
Pelo jeito que você falou, fica a impressão de que M1 não é preenchido com algum novo valor. Confirma isso?

SDS

MensagemEnviado: 22 Fev 2008 09:13
por Fábio Pereira
Isso pode ser apenas otimização do compilador: caso a variável não seja utilizada pelo restante do programa o compilador evita gerar código.

Isto pode ser facilmente contornado declarando a variável como volatile. Variáveis volatile não são otimizadas pois o compilador considera que as mesmas podem ser alteradas pelo hardware, independentemente do código gerado.

T+

MensagemEnviado: 22 Fev 2008 09:25
por Andredeos
Ela é declarada, iniciada e utilizada por codigo identico ao das outras variáveis.
Acho que é o que o Fabio disse, qd eu alterei as configurações de otimização de high para low, ele gerou a linha. Vou tentar declarar como volatile pra ver se funciona.

Obrigado pelas respostas.

MensagemEnviado: 22 Fev 2008 10:21
por xultz
vou contar uma coisa que me ocorreu, só que com gcc.
Eu precisava de uma rotina que recebia dados de um TMP05 e calcula em graus Celsius com uma casa de precisao. No datasheet tem a formula, eu recebia os valores em duas variaveis de 16 bits. Porem, para não usar cálculo de ponto flutuante, eu multiplicava por 10 e na hora de imprimir no display, enfiava uma vírgula. Esbocei o algoritmo no papel, programei, porém na hora de testar, ao invés de pegar os dados do sensor, eu coloquei dois valores fixos que eu sabia qual deveria ser o resultado, para vê-lo impresso na tela. Compilei, testei, tudo certo. Daí tirei os valores fixos e peguei os valores do sensor, mandei compilar, e dava erro de linkagem. Voltei ao anterior, tudo ok. E isso que a rotina recebia os valores do sensor, depois realterava para valores fixos e calculava. Depois de muito fuçar, eu descobri que faltava um ítem ao comando de linkagem para a biblioteca padrão do gcc, que fazia cálculo de divisão. E por que antes ele linkava? Porque o gcc calculava na mão o valor em graus Celsius (já que os valores eram fixos) e só atribuía às variáveis finais o resultado, sem compilar o algoritmo. Sacanagem né? :)