Статус:
Offline
Реєстрація: 18.10.2009
Повідом.: 1259
Реєстрація: 18.10.2009
Повідом.: 1259
- 🟡 21:35 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
- #4581
В прерывания проваливается и все четко отрабатывает. Релюхой щелкать то слишком, диодиком помигаю. Так вот мигаю этим диодиком в прерывании в части, что генерирует секунды - мигает. Мигаю в минутной части, прямо рядом с выдачей минутного флага для основного цикла - мигает. Мигаю в основном цикле в части ожидающей того самого флага - и нифига не происходит. Смотрю листинг, явного криминала нет - rjump в начало основного цикла, загрузка переменной, "и", brne+2, rjump куданибудь Неужель прийдется самому выполнять работу компилятора разбирая весь асм
Я худею с этой студии. Ставлю разные уровни оптимизации, и оно работает по разному. При чем понять где написано то, что делает, невозможно.
Бля, я уже головой еду.
В прерываниях все нормально отрабатывает. Если поставить мигалочку в прерывании рядом с выдачей флага для главного цикла - мигает. Если мигалочку поставить в главном цикле под флагом, то нихера не мигает. То есть логично предположить, что прерывание устанавливает иную переменную от той, что проверяется в качестве флага основным циклом. Собственно из-за этого я все в кучу скинул, чтобы исключить возможность такой проблемы. Но нифига.
Вот листинг.
Конечно читать это не интересно, потому приведу ключевые моменты.
1 - начало основного цикла. Загрузка переменной по адресу 0x019B и стандартное if-ветвление.
2 - выдача флага. Как видно устанавливается та же самая переменная по адресу 0x019B.
3 - ну и самый конец основного цикла, где видно, что он чудесно прыгает на начало, коим собственно проверка этого проблемного флага и является.
Как все это может быть? То, что не пашет, я имею ввиду.
Ахуеть ребята. Никак кроме этой картинки охарактеризовать ЭТО я не могу.
Волшебное слово volatile решило проблему. Просматривая листинг я заметил в коде знакомый адрес, по которому эта падла компилятор писала другую переменную. Заюзав поиск я нашел еще кучку записей по тому же адесу всяких других переменных.
Было это уже в нулячем проекте, который я заново создал и закидал нужными файлами. Изначально там все цивильно собрано, а не в куче, как то, что я показывал. Переменные объявляются в отдельном файле как extern, который инклюдится везде, опять же в отдельном файле все создаются и инициируются, инклюдится в один из сишных файлов. Но не ясно как-то выходит - пускай в файле, где переменные создаются, компилятор повыкидывал неиспользуемые, но при сборке то линкер бы не нашел екстерны и должен был бы забить тревогу.
К тому же не работало оно и скинутое в одну кучу, как я показал выше.
Ничего не менял нигде - только волшебных слов добавил.
А CVAVR нормально пропалил екстерны, потом видимо перекомпилировал все с учетом того, чтобы экстерны оставить.

Я худею с этой студии. Ставлю разные уровни оптимизации, и оно работает по разному. При чем понять где написано то, что делает, невозможно.
Бля, я уже головой еду.
В прерываниях все нормально отрабатывает. Если поставить мигалочку в прерывании рядом с выдачей флага для главного цикла - мигает. Если мигалочку поставить в главном цикле под флагом, то нихера не мигает. То есть логично предположить, что прерывание устанавливает иную переменную от той, что проверяется в качестве флага основным циклом. Собственно из-за этого я все в кучу скинул, чтобы исключить возможность такой проблемы. Но нифига.
Вот листинг.
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
Конечно читать это не интересно, потому приведу ключевые моменты.
1 - начало основного цикла. Загрузка переменной по адресу 0x019B и стандартное if-ветвление.
Код:
while(1)
{
if(bMinuteFlag)
10e: 80 91 9b 01 lds r24, 0x019B
112: 88 23 and r24, r24
114: 09 f4 brne .+2 ; 0x118 <main+0x72>
116: 89 c0 rjmp .+274 ; 0x22a <main+0x184>
2 - выдача флага. Как видно устанавливается та же самая переменная по адресу 0x019B.
Код:
bMinuteFlag = true;
2ee: 91 e0 ldi r25, 0x01 ; 1
2f0: 90 93 9b 01 sts 0x019B, r25
3 - ну и самый конец основного цикла, где видно, что он чудесно прыгает на начало, коим собственно проверка этого проблемного флага и является.
Код:
228: 72 cf rjmp .-284 ; 0x10e <main+0x68>
Как все это может быть? То, что не пашет, я имею ввиду.
Ахуеть ребята. Никак кроме этой картинки охарактеризовать ЭТО я не могу.
Волшебное слово volatile решило проблему. Просматривая листинг я заметил в коде знакомый адрес, по которому эта падла компилятор писала другую переменную. Заюзав поиск я нашел еще кучку записей по тому же адесу всяких других переменных.
Было это уже в нулячем проекте, который я заново создал и закидал нужными файлами. Изначально там все цивильно собрано, а не в куче, как то, что я показывал. Переменные объявляются в отдельном файле как extern, который инклюдится везде, опять же в отдельном файле все создаются и инициируются, инклюдится в один из сишных файлов. Но не ясно как-то выходит - пускай в файле, где переменные создаются, компилятор повыкидывал неиспользуемые, но при сборке то линкер бы не нашел екстерны и должен был бы забить тревогу.
К тому же не работало оно и скинутое в одну кучу, как я показал выше.
Ничего не менял нигде - только волшебных слов добавил.
А CVAVR нормально пропалил екстерны, потом видимо перекомпилировал все с учетом того, чтобы экстерны оставить.
Останнє редагування: