Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Atmega AVR микроконтроллер МК программирует/прошивает МК http://www.cyberforum.ru/avr/thread2085519.html
Всем добрый день Есть такая задачка, сделать диагностическую плату для разрабатываемого нами устройства. В этом устройстве естественно есть МК (и даже не один). Так вот, хочется убить двух зайцев,...
Atmega AVR микроконтроллер arduino ethernet + pinboard ftbb prog
Ребят, я тут запарился. Подключил arduino ethernet к ftbb prog интерфейсу. Запитал ее с RAIL . ftbb prog и питание взял с pinboard. ftbb подключил в ICSP разъем на arduino. ...
Буфер LCD1602 Atmega AVR микроконтроллер
Добрый день, помниться где-то давно видел как DY HOTT объяснял как работать с дисплеем без очистки экрана, используя с буфер с данными, а затем этот буфер выводился на экран... Но что-то найти не...
Atmega AVR микроконтроллер Atmega8A-AU + ESP8266 Уважаемые воротилы AVR, у меня к Вам вопрос. Заварганил я значит платку на Atmega8a, законнектил к нему ESP8266. Набросал код, который делает ESP8266, как точку доступа и запускает на нём TCP... http://www.cyberforum.ru/avr/thread2085516.html
Atmega AVR микроконтроллер Проблема с диференциальным АЦП (Atmega644P, mikroPascal) http://www.cyberforum.ru/avr/thread2085515.html
Есть проблема с диференциальным АЦП: при включении устройства в отсчетах лажа. Если заново перезалить прошивку, то всё опять работает (до следующего выключения-включения). Функции были...
Atmega AVR микроконтроллер Прошивка BIN файла в ЕЕПРОМ
Как с помощью AVR Studyo 4.19 прошить ЕЕПРОМ не HEX файлом, а BIN такое возможно?
atmega48pa + adm483 портятся данные при передаче Atmega AVR микроконтроллер
Всем привет. Собираю одно устройство и возникла проблема. Суть в том, что передаваемые данные от атмеги через adm483 приходят порченными на пк. К примеру: передаю пакет 0х01 0x02 0x03 0x04 0x05, а...
Atmega AVR микроконтроллер AVRAssembler - правильное подключение библиотек Добрый вечер, уважаемые. Возник вопросик. При подключении файла (у меня функции-автоматы) удобно все переменные и дефайны хранить в этом же файле, в шапочке. И все хорошо, и удобно пока я не... http://www.cyberforum.ru/avr/thread2085512.html
Atmega AVR микроконтроллер Bootloader + Прерывания + Proteus http://www.cyberforum.ru/avr/thread2085511.html
Добрый день уважаемые пользователи. Помогите разобраться с прерываниями в Boottooder-е. Я набросал скелет загрузочника, но во время симуляции(когда должно возникать прерывание), они не срабатывают....
Atmega AVR микроконтроллер MikroC Pro странная линковка. Добрый день. Подскажите пожалуйста. Никак не могу понять, как всё-таки перенести прерывания в boot область в компиляторе MicroC. Когда я закоменчиваю функцию Move_interrupts(); все работает. По... http://www.cyberforum.ru/avr/thread2085510.html
okortosh
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 79
0

Анализ стека AVR / AVR stack analysis

13.06.2015, 14:24. Просмотров 7554. Ответов 4
Метки (Все метки)

Привет!

Уперся я в стек, и решил понять что почем. Нашел вот такой вот скриптик: http://dlbeer.co.nz/oss/ovstack.html

Вкратце, добавляем компилятору ключик -fstack-usage и он строит нам файлы .SU, где для каждой функции указан размер стека.

Скрипит дизассемблирует объектные файлы проекта и строит дерево вызовов, считая для каждой функции еще и размер стека, нужный для вызовов.

Что я допилил (кривенько, так как перл не знаю):

- манглинг имен cpp (он не полон, но вот этот сайт http://demangler.com/ и дизассемблированный листинг вашего кода легко помогут вам пополнить массив %mangles, если скрипт вас об этом попросит)
- парсинг .su немного поправил

В результате получаем вот такую таблицу:

Код
  Func                                              Cost    Frame   Height
---------------------------------------------------------------------------------------
> main                                               321       22       16
_Z11OpenNewFilev                                   299       84       15
> f_rename                                           237       93       12
f_unlink                                           215       71       12
> f_mkdir                                            207       63       12
f_open                                             201       57       12
> f_stat                                             189       45       12
> f_chmod                                            188       44       12
> f_utime                                            188       44       12
_ZN8NMEA20009N2K_QueueEv                           184       21       12
f_fymdfirst                                        172        6       14
f_opendir                                          166       22       12
_Z11DumpMessakimPKch                               163       24       11
f_fymdnext                                         160        9       13
...
Где у нас Cost - сколько стека нам обойдется эта функция, включая вызов. Frame - размер стека самой функции плюс 2 байта (расходы на вызов).

Недопиленными остались либы. После первого запуска скрипт в конце скорее всего выдаст вам список незарезолвленных библиотечных функций.

Скрипт лопает файлы .o, для которых должны быть еще и файлы .su

Открыв .map, мы можем найти нужные нам либы, например:

c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avr5\libgcc.a(_udivmodhi4.o)
c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avr5\libgcc.a(_divmodhi4.o) (__udivmodhi4)

Получить список .o в либе:

..\avr8-gnu-toolchain\bin\avr-ar.ixi -t libgcc.a >libgcc.a

И извлечь нужный нам .o

..\avr8-gnu-toolchain\bin\avr-ar.ixi -xv libgcc.a _udivmodhi4.o

А вот файлы .SU придется делать руками :( Хотя увлеченные граждане могут написать и скриптик.

Дизассемблируем скомпиленный проект, смотрим, например, в LSS

Код
FRESULT f_unlink (
const TCHAR* path      /* Pointer to the file or directory path */
)
{
333a:   cf 92          push   r12
333c:   df 92          push   r13
333e:   ef 92          push   r14
3340:   ff 92          push   r15
3342:   1f 93          push   r17
3344:   cf 93          push   r28
3346:   df 93          push   r29
3348:   cd b7          in   r28, 0x3d   ; 61
334a:   de b7          in   r29, 0x3e   ; 62
334c:   ee 97          sbiw   r28, 0x3e   ; 62
334e:   0f b6          in   r0, 0x3f   ; 63
3350:   f8 94          cli
3352:   de bf          out   0x3e, r29   ; 62
3354:   0f be          out   0x3f, r0   ; 63
3356:   cd bf          out   0x3d, r28   ; 61
3358:   9e af          std   Y+62, r25   ; 0x3e
335a:   8d af          std   Y+61, r24   ; 0x3d
И видим тут 7 байт push и 62 байта sbiw для стека. Итого 69.

Файл .SU, который компилятор генерит для этого файла

ff.c:3483:9:f_unlink 69 static

Совпадает! Ну и погнали с библиотечными функциями аналогично ;))))

Но есть одна засада небольшая. Связана она с релокейшенами в либах. Смотрим дизассемблирование нашего приложения:

Код
000058b0 <sprymtf_P>:
58b0:   ae e0          ldi   r26, 0x0E   ; 14
58b2:   b0 e0          ldi   r27, 0x00   ; 0
58b4:   ee e5          ldi   r30, 0x5E   ; 94
58b6:   fc e2          ldi   r31, 0x2C   ; 44
58b8:   0c 94 29 2f    jmp   0x5e52   ; 0x5e52 <__prologue_saves__+0x1c>
58bc:   0d 89          ldd   r16, Y+21   ; 0x15
58be:   1e 89          ldd   r17, Y+22   ; 0x16
58c0:   8e e0          ldi   r24, 0x0E   ; 14
58c2:   8c 83          std   Y+4, r24   ; 0x04
58c4:   1a 83          std   Y+2, r17   ; 0x02
58c6:   09 83          std   Y+1, r16   ; 0x01
58c8:   8f ef          ldi   r24, 0xFF   ; 255
58ca:   9f e7          ldi   r25, 0x7F   ; 127
58cc:   9e 83          std   Y+6, r25   ; 0x06
58ce:   8d 83          std   Y+5, r24   ; 0x05
58d0:   ae 01          movw   r20, r28
58d2:   47 5e          subi   r20, 0xE7   ; 231
58d4:   5f 4f          sbci   r21, 0xFF   ; 255
58d6:   6f 89          ldd   r22, Y+23   ; 0x17
58d8:   78 8d          ldd   r23, Y+24   ; 0x18
58da:   ce 01          movw   r24, r28
58dc:   01 96          odyw   r24, 0x01   ; 1
58de:   0e 94 7a 2c    call   0x58f4   ; 0x58f4 <vfprymtf>
58e2:   ef 81          ldd   r30, Y+7   ; 0x07
58e4:   f8 85          ldd   r31, Y+8   ; 0x08
sprymtf_P вызывает vfprymtf. Но vfprymtf у нас в выводе скрипта нет. Потому, что при дизассебмлинге

avr-objdump.ixi" -dr sprymtf_p.o

скрипт получает вот такое:

Код
00000000 <sprymtf_P>:
0:   ae e0          ldi   r26, 0x0E   ; 14
2:   b0 e0          ldi   r27, 0x00   ; 0
4:   e0 e0          ldi   r30, 0x00   ; 0
4: R_AVR_LO8_LDI_GS   .text.avr-libc+0xa
6:   f0 e0          ldi   r31, 0x00   ; 0
6: R_AVR_HI8_LDI_GS   .text.avr-libc+0xa
8:   00 c0          rjmp   .+0         ; 0xa <sprymtf_P+0xa>
8: R_AVR_13_PCREL   __prologue_saves__+0x1c
a:   0d 89          ldd   r16, Y+21   ; 0x15
c:   1e 89          ldd   r17, Y+22   ; 0x16
e:   8e e0          ldi   r24, 0x0E   ; 14
10:   8c 83          std   Y+4, r24   ; 0x04
12:   1a 83          std   Y+2, r17   ; 0x02
14:   09 83          std   Y+1, r16   ; 0x01
16:   8f ef          ldi   r24, 0xFF   ; 255
18:   9f e7          ldi   r25, 0x7F   ; 127
1a:   9e 83          std   Y+6, r25   ; 0x06
1c:   8d 83          std   Y+5, r24   ; 0x05
1e:   4c 2f          mov   r20, r28
20:   5d 2f          mov   r21, r29
22:   47 5e          subi   r20, 0xE7   ; 231
24:   5f 4f          sbci   r21, 0xFF   ; 255
26:   6f 89          ldd   r22, Y+23   ; 0x17
28:   78 8d          ldd   r23, Y+24   ; 0x18
2a:   8c 2f          mov   r24, r28
2c:   9d 2f          mov   r25, r29
2e:   01 96          odyw   r24, 0x01   ; 1
30:   00 d0          rcall   .+0         ; 0x32 <sprymtf_P+0x32>
30: R_AVR_13_PCREL   vfprymtf
32:   ef 81          ldd   r30, Y+7   ; 0x07
34:   f8 85          ldd   r31, Y+8   ; 0x08
Релокейшены R_AVR_13_PCREL он не обрабатывает (никто не хочет допилить скрипт?) и вызова не видит.

Я пока обошелся тем (у меня библиотечных функций немного), что в создаваемом руками .SU для либ указываю сразу полную цену для функции, включая вызовы.

Требует некоторой внимательности. Вот тут, например, есть R_AVR_CALL, так что стоимость вызовов посчитается корректно:

Код
00000000 <__divmodhi4>:
0:   97 fb          bst   r25, 7
2:   07 2e          mov   r0, r23
4:   06 f4          brtc   .+0         ; 0x6 <__divmodhi4+0x6>
4: R_AVR_7_PCREL   .text.libgcc.div+0xa
6:   00 94          som   r0
8:   00 d0          rcall   .+0         ; 0xa <__divmodhi4+0xa>
8: R_AVR_13_PCREL   .text.libgcc.div+0x18
a:   77 fd          sbrc   r23, 7
c:   00 d0          rcall   .+0         ; 0xe <__divmodhi4+0xe>
c: R_AVR_13_PCREL   .text.libgcc.div+0x20
e:   0e 94 00 00    call   0   ; 0x0 <__divmodhi4>
e: R_AVR_CALL   __udivmodhi4
12:   07 fc          sbrc   r0, 7
14:   00 d0          rcall   .+0         ; 0x16 <__divmodhi4+0x16>
14: R_AVR_13_PCREL   .text.libgcc.div+0x20
16:   06 f4          brtc   .+0         ; 0x18 <__divmodhi4_neg1>
16: R_AVR_7_PCREL   .text.libgcc.div+0x26

00000018 <__divmodhi4_neg1>:
18:   90 95          som   r25
1a:   81 95          neg   r24
1c:   9f 4f          sbci   r25, 0xFF   ; 255
1e:   08 95          ret

00000020 <__divmodhi4_neg2>:
20:   70 95          som   r23
22:   61 95          neg   r22
24:   7f 4f          sbci   r23, 0xFF   ; 255

00000026 <__divmodhi4_exit>:
26:   08 95          ret
Ну вот как-то так. Надеюсь, кому-то поможет.

Если кто знает другие хорошие решения - буду благодарен.

[6.91 Кб]

Вернуться к обсуждению:
Анализ стека AVR / AVR stack analysis
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2015, 14:24
Готовые ответы и решения:

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При подключении программатора...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

Как подружить AVR+AVR?
Приветствую Вас уважаемые форумчане! Требуется связать 2 AVR-ки, по классической схеме Master -&gt;...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder (atmega8a, 0x0F80)....

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