Проскакивает инструкции в отладчике AVR Studio.

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср дек 12, 2012 20:08:08

Сообщение gessor »

Не могу понять, почему компилятор пропускает некоторые команды в зацикливании while(1) в основном цикле программы. Вот текст на Си в процессе отладки:
СпойлерИзображение
При пошаговом выполнении программы, после желтой строчки компилятор сначала прыгает на n++ и только потом на sei().
Это видно в дизассемблере, что компилятор засунул команды именно в таком порядке:
СпойлерИзображение
Пробовал пересоздавать проект, закомментировать разные строчки, в том числе n++. Но в цикл while(1) он все равно заходит как-то в середину, а не с первой строчки.

Есть еще ряд проблем. Например, компилятор не сбрасывает флаг прерывания и поэтому его приходится сбрасывать вручную в основном цикле. Иначе прерывание выполняется один раз, а потом таймер считает, а флаг висит.

И в основном цикле, когда программа заходит в функцию задержки _delay_ms() внутри нее сбрасывается флаг глобального разрешения прерываний. Из-за чего опять все работает через одно место.
Контактная информация:
Реклама
Мучитель микросхем
Сообщения: 453
Зарегистрирован: Ср июн 08, 2011 20:25:20

Сообщение bob1 »

все правильно работает. компилятор оптимизировал код. sei у вас написано до установки портов и в начале цикла. логика работы не изменилась!!! хотите чтоб скакало по вашему коду....выключайте оптимизацию!!!
Контактная информация:
Реклама
Встал на лапы
Сообщения: 115
Зарегистрирован: Ср дек 12, 2012 20:08:08

Сообщение gessor »

Черт побери, вы гений! Но это не отменяет двух других проблем тогда.

Завтра на работе посмотрю где эта оптимизация. Но днем тоже была проблема когда лазил в настройки и думал в чем может быть проблема.
СпойлерИзображение
Toolchains почему-то указан 32-бит. Когда выбирал 8 бит и сохранял, значение не менялось и потом в этой вкладке все равно было 32 бита. Это принципиально или нет?
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

gessor может в этом проблема?
Вложения
Безымянный.jpg
(45.15 КБ) 526 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 121
Зарегистрирован: Пт сен 04, 2015 13:10:49
Откуда: г. Ижевск

Сообщение artemik32 »

Почему у меня компилятор игнорирует условие if в конце программы, оптимизация на минимуме, если её отключить совсем, то размер кода вырастает в 20 раз и программа не влазит на флэш память МК. Работаю в AVR Studio 6.2. Подскажите куда грести, если кто сталкивался.
Вложения
прога.GIF
(72.9 КБ) 609 скачиваний
Истина где-то рядом...
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

очевидно, потому что результат проверки условия предсказуем заранее и известен еще на этапе компиляции.
вангую, что всегда выполняется PORTD &= ~(1<<0); - верно?

P.S. вообще-то код принято в соответствующий тег оформлять и сворачивать в спойлер при необходимости, а не картинкой
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

artemik32 может из-за этого
СпойлерИзображение
Встал на лапы
Аватара пользователя
Сообщения: 121
Зарегистрирован: Пт сен 04, 2015 13:10:49
Откуда: г. Ижевск

Сообщение artemik32 »

Это из книги Прокопенко, я по ней и делаю. Я проверяю младший бит переменной knopki и если он равен 1 - подаю на пин PORTD - 1, если равен 0, то - 0. А как тег оформлять - текст вставлять вместо картинки?
Истина где-то рядом...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Так я угадал, что вместо проверки всегда сразу выводится 0 в порт?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

там таких ошибок нету =) да и циклов таких =) это что в цикле 8 раз проверка кнопки О_о
на 303 странице там телефонная клавиатура, если у вас дофига кнопок.
Встал на лапы
Аватара пользователя
Сообщения: 121
Зарегистрирован: Пт сен 04, 2015 13:10:49
Откуда: г. Ижевск

Сообщение artemik32 »

ARV писал(а):Так я угадал, что вместо проверки всегда сразу выводится 0 в порт?
Да, верно.
yaotzin писал(а):там таких ошибок нету =) да и циклов таких =) это что в цикле 8 раз проверка кнопки О_о
Да, я написал как в книге, и теперь работает как надо - немного лишнего написал - перестраховался.
Истина где-то рядом...
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

artemik32 ааа понял, написали как в книге и теперь заработало =)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

А разве не интересно, как я угадал? Или уже сами разобрались, где именно была проблемка?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

ARVпотому что он один раз условие проверил а потом второй раз его проверяет =) да и проверка по 8 раз в цикле или нажалась кнопка это жесть.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

увы, причина не в том. проверка стопицот раз условия - это неоптимальность алгоритма, но если проверка корректная, это не ошибка. ошибка в другом: имелось непонимание того, как работает то, что написано.

вот на этой картинке http://radiokot.ru/forum/download/file.php?id=242657 показан кусочек кода - обратите внимание на место, где выделено красным: оператор knopki = knopki << 1; сдвигает влево содержимое переменной, а справа дополняет НУЛЯМИ. поэтому после первого же сдвига в младшем бите будет 0 - хоть миллиард раз потом проверяй, этот бит будет ВСЕГДА равен 0. поэтому следующий оператор проверки ВСЕГДА пойдет по одной ветке, компилятор это видит и вообще может выкинуть все последующие использования knopki, особенно если учесть, что сдвиги делаются в цикле 8 раз, т.е. после выхода из цикла переменная knopki ВСЕГДА будет обнулена.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

ARV
вообще если уж на то пошло там после else скобок блока кода нету. {}
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

yaotzin, вы что, мое сообщение не внимательно прочли? к чему ваши слова, что они меняют?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Сообщение yaotzin »

ARV всё верно вы написали, я просто еще скобок заметил что нет :)))
Ответить

Вернуться в «AVR»