IAR ignorando linha de código

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

IAR ignorando linha de código

Mensagempor Andredeos » 21 Fev 2008 19:24

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.
Andredeos
Bit
 
Mensagens: 49
Registrado em: 09 Set 2007 10:56

Mensagempor Kremer » 22 Fev 2008 08:49

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
Avatar do usuário
Kremer
Nibble
 
Mensagens: 82
Registrado em: 25 Jul 2007 17:15
Localização: Florianópolis

Mensagempor Fábio Pereira » 22 Fev 2008 09:13

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+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor Andredeos » 22 Fev 2008 09:25

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.
Andredeos
Bit
 
Mensagens: 49
Registrado em: 09 Set 2007 10:56

Mensagempor xultz » 22 Fev 2008 10:21

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é? :)
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba


Voltar para ARM

Quem está online

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

x