Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
алексей байдин
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 15
1

Симулятор уходит в дизассемблер

19.01.2019, 22:45. Просмотров 352. Ответов 7
Метки нет (Все метки)

Здравствуйте! Кто подскажет как настроить симулятор atmel studio 6? При пошаговой отладке уходит в дизассемблер на определённых функциях (Си++). Функция например такая: lcd_dat((pos_shift_simbol / 10) % 10 + 0x30); То есть мне надо отобразить pos_shift_simbol на LCD. Меняю уровни оптимизации и дебаггера, один фиг... Выход из положения - перед и после этой функции ставлю точки останова. Тогда пропускается, если точки останова прохожу по F5.
Мне нужно вообще чтоб не заходил в дизассемблер. Долгие циклы, задержек например, я прохожу брэкоинтами.

И вот эти настройки влияют ещё на симуляцию в Протеусе. Я блин 3 вечера убил, пока понял это... То есть оптимизацию в минимум, дебагер в максимум, тогда в LCD что-то отображается.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2019, 22:45
Ответы с готовыми решениями:

Дизассемблер AVR
Подскажите где можно почитать как выковырять прошивку из чипа и дизассемблировать ее. Желательно...

Дизассемблер? hex --> asm
Привет всем! Собственно,чем дизассемблировать? Есть hex-файл - программа написана на С, не...

Дизассемблер PIC
Есть прошивка на ПИК http://www.obddiag.net/adaptir/obdcan2ec.hex для PIC18F2455 или PIC18F2550,...

Atmega8535. Симулятор
Вообщем столкнулся с микроконтроллером ATmega8535 и нужно сэмулировать выполнение этого кода. Нашел...

Симулятор микроконтроллера 51 серии
Ребята, кто-нибудь работал в этой программе? Симулятор точнее очень древний....Как запустить...

7
Voland_
1685 / 1030 / 97
Регистрация: 04.01.2010
Сообщений: 3,474
19.01.2019, 23:53 2
Оптимизацию надо ставить действительно на минимум, ну а файлы исходников должны быть доступны дебаггеру, который подгружает *.elf программы. Ну и на всякий случай покажите декларацию функции pos_shift_simbol. Быть может вы используете static inline функцию?
0
алексей байдин
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 15
20.01.2019, 13:05  [ТС] 3
Файлы исходников доступны, как я понимаю. Компилируется без ошибок. У меня всего два файла, где написан код. Программа простенькая, пока только учусь. Пока изучаю алгоритмы, поэтому пишу без static inline и тому подобного. В файле lcd_8bit.h я получается никак не декларирую функцию LCD_DAT. Просто описал её или как это называется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void lcd_dat (unsigned char lcd)    //Програма записи данных в ЖКИ
{
    PORTC |= (1<<RS);
    PORTC |= (1<<E);
    PORT_LCD = lcd;
    pause(TIME);
    PORTC &= ~(1<<E);
//  pause(TIME);
    if (!write_2str)        // если выводим символы в 1-ую строчку 
      {
        if (shift_cursor_right)         // если сдвиг вправо
            {pos_shift_simbol = pos_shift_simbol++;}    // inc
        else                            
            {pos_shift_simbol = pos_shift_simbol--;}    // dec
      }   
}
В Майн-файле подключается #include "lcd_8bit.h". В Майне же вызывается lcd_dat((pos_shift_simbol / 10) % 10 + 0x30);
Или нужно её (функцию) определить как-то, чтоб из Майна вызывать как внешнюю? Так-то всё работает...
Мне НУЖНО ИМЕННО ОТКЛЮЧИТЬ ДИЗАССЕМБЛЕР, есть на это способ какой-нибудь?

Добавлено через 15 минут
Получается что, допустим я написал по моим меркам большую программу, где мне надо просмотреть изменение многих переменных с многими ветвлениями в программе , и вот я начал пошаговую отладку, просмотрел много чего, осталось немного, и вот под конец пошаговой отладки программа уходит в дизассемблер, что мне совсем не нужно... А далее всё с начала доходить до этого места...
0
Voland_
1685 / 1030 / 97
Регистрация: 04.01.2010
Сообщений: 3,474
20.01.2019, 15:40 4
Цитата Сообщение от алексей байдин Посмотреть сообщение
Мне НУЖНО ИМЕННО ОТКЛЮЧИТЬ ДИЗАССЕМБЛЕР, есть на это способ какой-нибудь?
Очевидно, вы плохо себе представляете как работает дебаггер в тандеме с МК. То что вы просите - сделать не получится, потому что дебаггер шагает по опкодам процессора в памяти, исходя из его PC (то есть текущей позиции памяти программ). Все остальное - что вы видите в виде интерактивного дебага - это дело рук привязки этих опкодов с реальными строками Си.

Цитата Сообщение от алексей байдин Посмотреть сообщение
Получается что, допустим я написал по моим меркам большую программу, где мне надо просмотреть изменение многих переменных с многими ветвлениями в программе , и вот я начал пошаговую отладку, просмотрел много чего, осталось немного, и вот под конец пошаговой отладки программа уходит в дизассемблер, что мне совсем не нужно... А далее всё с начала доходить до этого места...
Во многих случаях люди отлаживаются непосредственно на МК, но если алгоритм действительно сложный - вы можете его отладить в каком-нибудь ПК-совместимом дебаггере, а затем портировать на МК. В идеале код логики не должен быть привязан к платформе. То есть все что необходимо для портации он должен получать из внешнего файла wrapper'а.

Но... я думаю в вашем случае придется просто смириться с тем, что дебаггер отнюдь не идеален. Я вам скажу отчего это происходит. Скорее всего gcc-компилятор не создал для интересуемой функции информацию для дебага и/или не всунул ее в *.elf. Нужно посмотреть как именно эта функция попадает в *.elf - поищите ее имя в файле *.map (если он конечно генерируется вместе с "*.elf"). Поищите ее в файле "*.lss", выкинув в него дизассемблер вместе с кодом Си. Убедитесь, что для объектного файла где находится функция (если она в отдельном файле от main находится) - при компиляции выставляется ключ -"-dwarf-N" (подробности). Попробуйте поиграться с номером версии dwarf.

PS: игр с GCC очень много - сказать наверняка - что может быть неправильно в вашем случае не очень просто.
0
алексей байдин
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 15
20.01.2019, 16:43  [ТС] 5
Цитата Сообщение от Voland_ Посмотреть сообщение
Очевидно, вы плохо себе представляете как работает дебаггер в тандеме с МК. То что вы просите - сделать не получится, потому что дебаггер шагает по опкодам процессора в памяти, исходя из его PC (то есть текущей позиции памяти программ). Все остальное - что вы видите в виде интерактивного дебага - это дело рук привязки этих опкодов с реальными строками Си.
Немного не понял смысл вашей идеи сказанного. Попытаюсь пояснить. Дебаггер, чтоб говорить об одинаковом, я правильно понимаю, в Атмел Студио нажимаю F11 и пошёл проверять программу по шагам? Ассемблер я изучал, писал для себя программки на нём. Си начал изучать относительно недавно, но понимаю, что любая команда Си раскладывается на несколько команд ассемблера, что наблюдается в дизассемблере. Но вот Вы пишете, что то, что я хочу сделать не получится... Вопрос: что из того, что дебаггер шагает по опкодам, почему нельзя вычислить мою функцию lcd_dat((pos_shift_simbol / 10) % 10 + 0x30); просто, без ассемблера, там вроде заумного, как мне кажется, ничего нет? Если исходя из его PC (то есть текущей позиции памяти программ), ведь другие функции тоже есть такой же сложности, вложенности, например:
C++
1
2
3
4
5
if(((PINB&inputState[j]) == 0))
            {
                press = true;         // фиксируем момент нажатия
                temp = key_tab[i][j];  // записываем код клавиши
            }
так ведь проходит без дизассемблера...
Это я пофилосовствовал, буду пробовать разбираться с ниженаписанным Вами. Там конечно мне незнакомы "внешний файл wrapper" "-dwarf-N" и всё такое...
0
ValeryS
Модератор
7444 / 5636 / 716
Регистрация: 14.02.2011
Сообщений: 19,188
Завершенные тесты: 1
20.01.2019, 20:04 6
Цитата Сообщение от алексей байдин Посмотреть сообщение
{pos_shift_simbol = pos_shift_simbol++;}* * // inc
UB по моему
пишется просто
C
1
 pos_shift_simbol++;
так же и
C
1
pos_shift_simbol--;    // dec
0
алексей байдин
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 15
20.01.2019, 21:36  [ТС] 7
Ну да ), это я упустил. Учусь пока
0
Voland_
1685 / 1030 / 97
Регистрация: 04.01.2010
Сообщений: 3,474
20.01.2019, 22:23 8
Цитата Сообщение от алексей байдин Посмотреть сообщение
Немного не понял смысл вашей идеи сказанного.
окей, попробую упростить заумное объяснение . Идея в том, что дебаггер пытается уследить за тем, чем занимается МК, и пытается найти это место в коде. Это не так-то и просто, учитывая ограниченные возможности МК.
А то о чем вы говорите (дебаг) - можно сделать на обычном ПК. Потому что Си должен выполнять те же действия, в итоге, не обращая никакого внимания на платформу, на которой он выполняется.
0
20.01.2019, 22:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2019, 22:23

Симулятор логических элементов по Мортону
Здравствуйте, ни как не могу разобраться в программе, помогите пожалуйста. Начну по порядку, в...

симулятор не пишет биты в регистр GIFR
Доброго дня уважаемые! отлаживая в симуляторе AVR Studyo 4.19 свою первую программу. Cталкнулся...

Симулятор и аналог HapSim для PICов
Здравствуйте! Ранее работал, экспериментировал с AVR в основном. Вот довелось и с сабжевыми...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru