это в раздел глюков компилятора имхо
есть у меня такие конструкции, во время отладки не боюсь массово лепить:
Код: Выделить всё
else {
if (TWI_DEBUG) {
if (TWI_ACK_CHECK(TWSR) == 1) {
usart_string_write ("DBG: ACK was received");
}
else
{
usart_string_write ("DBG: ACK flag unknown");
}
}
}
и таких еще штук 6 сверху
так вот, при выполнении где-то третьей такой штуки, я выводил уникальнусю строку, например
usart_string_write ("DBG: AC-K was received");
а когда дело доходило до последующих блоков, где-то через 2, то вместо ожидаемого "DBG: ACK was received" я получал "AC-K was received"
т.е. он откусывал "DBG: " и строку из предыдущего кода выводил, ну совсем бред какой-то.
методом тыка установил, что если использовать вместо непосредственного вызова функции usart_string_write во так:
Код: Выделить всё
sprintf (buffer, "DBG: ACK flag unknown");
usart_string_write (buffer);
то глюк исчезал.
по опциям компилятора потыкался, зависимость никакую не нашел. Может кто сможет объяснить?
я прикрепил файлы кода, в 3 варианте есть строка
sprintf (buffer, "DBG: 2ACK flag unknown: %XX", temp_int);
а вот вывод в консоль:
->> Begin of cycle ->>
DBG: status TWINT is: 0, waiting 1
DBG: TWSR is: 8
DBG: Sending address A4 to TWI bus
DBG: TWSR is: 18
DBG: ACK was received
DBG: 2ACK flag unknown: 1X
DBG: Sending address A2 to TWI bus
DBG: TWSR is: 28
ACK flag unknown: %XX
DBG: Sending address CC to TWI bus
DBG: TWSR is: 28
DBG: ACK flag unknown
<<- End of cycle <<-
а вот с 4 вариантом:
->> Begin of cycle ->>===================!!!
DBG: status TWINT is: 0, waiting 1
DBG: TWSR is: 8
DBG: Sending address A4 to TWI bus
DBG: TWSR is: 18
DBG: ACK was received
----DBG: A2CK flag unknown: 1X
DBG: Sending address A2 to TWI bus
DBG: TWSR is: 28
DBG: ACK was received
DBG: Sending address CC to TWI bus
DBG: TWSR is: 28
DBG: ACK was received
<<- End of cycle <<-
Если это компилятор так отжигает, то бежать надо куда-то..
SII писал(а):во-вторых, без ассемблера многие вещи так и останутся непонятными (а если ещё и компилятор сгенерит неверный код, то попробуй это обнаружь);
Вот вот вот!!!
Да... и еще существенное замечание.
Перед глючными строчками (вместо которых фигня выводилась) пробовал ставить delay_ms(50000), ну не заметить остановку программы на это время нельзя, так вот, программа не останавливалась, т.е. блок кода в блоке else не выполнялся. Словно все повторения схожих конструкций были заменены первой.





