|
Проблемы с оптимизацией в WinAVR |
|
|
|
Nov 1 2009, 09:54
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(Skaf @ Nov 1 2009, 09:46)  С тех пор как мои проекты стали немного сложнее Hello World испытываю проблемы с программированием на WinAVR. И при чем здесь оптимизатор ? Цитата(Skaf @ Nov 1 2009, 09:46)  чтобы иметь возможность писать программы нормально. Учиться, учиться и учиться (с)
|
|
|
|
|
Nov 1 2009, 10:02
|

Местный
  
Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940

|
Код struct StatusStruct { volatile unsigned char RXbusy; volatile unsigned char TXbusy; unsigned char RXbuffer[15]; unsigned char TXbuffer[15]; unsigned char DataForSend[15]; unsigned char RXdataSize; unsigned char TXdataSize; unsigned char RXcurrentByte; unsigned char TXcurrentByte;
unsigned char ADCrawData[20];
unsigned char ConversionChannel; unsigned char ConversionType; // 1 - All; 2 - One
unsigned char DataForSendSize; unsigned char DataCurrentSendByte;
} Status;
...... .....
ISR(USART_RXC_vect){
unsigned char Rbyte, ByteCount;
volatile unsigned char a;
Rbyte = UDR; if (Status.RXcurrentByte < 15){ Status.RXbuffer[Status.RXcurrentByte] = Rbyte; Status.RXcurrentByte++;
a = Status.RXbuffer[Status.RXcurrentByte-2];
if ((Rbyte == 0xBC) && (a==0xBB)){ ByteCount = Status.RXcurrentByte-1; Status.RXcurrentByte = 0; DecodeFrame(ByteCount); } } else { Status.RXcurrentByte = 0; } } Во-первых в Wach про переменную a сказано Location not valid. Пока она не была volatile при отладке он просто перескакивал через строку a = Status.RXbuffer[Status.RXcurrentByte-1]; А сейчас не перескакивает, но толку мало. в а все равно ничего не появляется и if ((Rbyte == 0xBC) && (a==0xBB)){ всегда дает ложь. Причем реально данные в Status.RXbuffer[Status.RXcurrentByte] = Rbyte; записываются. Это видно в окошке Memory (Data) данные там действительно появляются. структура Status объявлена глобально.
Сообщение отредактировал Skaf - Nov 1 2009, 10:02
|
|
|
|
|
Nov 1 2009, 10:29
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Skaf @ Nov 1 2009, 15:02)  Во-первых в Wach про переменную a сказано Location not valid. Правильно сказано. Изначально Status.RXcurrentByte == 0. Вы приняли первый символ, записали его в буфер, увеличили Status.RXcurrentByte (стало 1). А потом читаете a = Status.RXbuffer[Status.RXcurrentByte-2]; Цитата Пока она не была volatile при отладке он просто перескакивал через строку Кто "он"?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 1 2009, 10:46
|

Местный
  
Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940

|
Цитата Правильно сказано. Изначально Status.RXcurrentByte == 0. Вы приняли первый символ, записали его в буфер, увеличили Status.RXcurrentByte (стало 1). А потом читаете a = Status.RXbuffer[Status.RXcurrentByte-2]; Это на первой итерации. Приходит несколько байтов и необходимо знать какой байт пришел предыдущим, чтобы обнаружить последовательность окончания пакета. На второй итерации, например, выражение a = Status.RXbuffer[Status.RXcurrentByte-2] уже имеет смысл. Код Кто "он"? Отладчик
|
|
|
|
|
Nov 1 2009, 11:17
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Skaf @ Nov 1 2009, 15:46)  Это на первой итерации. Вы считаете нормальным писать программы, которые работают правильно лишь на некоторых итерациях? И при чём тут оптимизатор? Цитата На второй итерации, например, выражение a = Status.RXbuffer[Status.RXcurrentByte-2] уже имеет смысл. Ну на второй итерации "он" наверное и не пишет про "Location not valid". Цитата Отладчик Какой отладчик? Вам помощь нужна или так, поболтать заглянули?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 1 2009, 12:39
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Skaf Как уже сказали необходимо исключить ситуации типа этой: Status.RXbuffer[Status.RXcurrentByte-2] - и не важно, что на каком-то из шагов это корректно. Во вторых, вы всё же неправильно понимаете назначение слова volatile. Переменной a в обработчике ни к чему быть как volatile. А вот всем переменным структуры, учавствующих в обработчике, очень может пригодиться быть volatile. Изучите этот вопрос подробно. Больше полагайтесь на элегатные,короткие алгоритмы, а не на отладчик  .
|
|
|
|
|
Nov 1 2009, 14:35
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Skaf @ Nov 1 2009, 13:02)  ... Не изобретайте велосипед - на прием/передачу заведите кольцевые буферы. В прерывании по RX, имхо, кроме записи принятого байта в буфер, модификации указателя головы буфера и, может быть, взведения флажка приёма новых данных ничего делать не стОит. Цитата структура Status похожа на сборную солянку.
|
|
|
|
|
Nov 1 2009, 23:06
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Кстати, да. Watch будет показывать всё и вся только когда выключена ВСЯ оптимизация и в проект включена Debug Info. Верно и то, что для нормальной работы оптимизации желательно выключить Debug info ибо это только мешает оптимизации. Более того, во время серьёзной оптимизации код может быть достаточно серьёзно перетасован/упрощен/прочее. Перескоки через строку не являются чем-то необычным. Просто после оптимизации этой строки больше нет  Нужно смотреть на результат цикла/функции. И вот если результат поменялся после включения оптимизации - тогда уже смотреть что там должно быть volatile, чтобы результат был правильным. Ну и конечно нужно писать нормальный код - тут хоть с оптимизатором, хоть без него..... added: да, код ужасен  Переписать ВСЁ начисто! Кстати говоря я раньше тоже писал типа Код if(){ bla_bla_bla(); foo(); } Но практика показала, что Код if() { bla_bla_bla(); foo(); } на много лучше. Советую привыкать сразу  Все эти мелочи помогают потом самому же разобраться что куда.
--------------------
The truth is out there...
|
|
|
|
|
Nov 2 2009, 07:13
|

Местный
  
Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940

|
Цитата Но практика показала, что Эта привычка с Perl'а осталась )
Сообщение отредактировал Skaf - Nov 2 2009, 07:13
|
|
|
|
|
Nov 2 2009, 09:53
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(XVR @ Nov 2 2009, 12:40)  Отключите оптимизации и включите отладочнцю информацию (-Oo -g). И при этом не иметь ни малейшего понятия, сколько времени будет выполняться код. И вообще - отлаживать одно - а получать на выходе совсем другое - это как минимум нетехнологично Цитата Отладка оптимизированного кода - это занятие не для начинающих  Контрольные примеры надо составлять и без нужды не лезть за пошаговой отладкой.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|