Ассемблер (ASM) для AVR в вопросах и ответах
Demiurg, пока ARV изучает основы AVR чтобы Вам что-то ответить
, мне поясните, о каком срыве стека Вы говорите при выполнении команды RJMP PC-0x0000
- Реклама
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Z_h_e писал(а):...
ARV писал(а):avr-gcc автоматически генерирует последовательность cli; jmp PC - 0; только в одном месте: там, где происходит выход из main.
И???
ща буду спорить
если вы вдруг забыли, то порт 0x3e это SPH, а 0x3d - SPL.
как бы я вам дизасм и привел в качестве подтверждения своих слов. а ассемблер у меня занимает ровно ту нишу, которую и должен - помогает в особо тяжких случаях, а в остальных полагаюсь на Си. перерос я ассемблер...Demiurg писал(а):вы не ассемблерщик. Пусть даже и так, вы обязаны заглядывать в дизасм. Иначе как вы оцениваете работу МК в тяжелых случаях
за подсказку спасибо, но теперь подскажите по подсказке: в каком именно месте срывается стек при вызове main? напоминаю код:Demiurg писал(а):Подсказка. Main вызван, а стек сорван
Код: Выделить всё
00000026 <__ctors_end>:
26: 11 24 eor r1, r1
28: 1f be out 0x3f, r1 ; 63
2a: cf e5 ldi r28, 0x5F ; 95
2c: d4 e0 ldi r29, 0x04 ; 4
2e: de bf out 0x3e, r29 ; 62
30: cd bf out 0x3d, r28 ; 61
32: 14 d0 rcall .+40 ; 0x5c <main>
34: 19 c0 rjmp .+50 ; 0x68 <_exit>Z_h_e писал(а):пока ARV изучает основы AVR
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
В том-то и дело, что стек может сорвать в любой момент. Незапланированное прерывание может быть включено в любой момент. Это может быть ошибка программиста. Сбой по питанию. Именно по этой причине делается переход на такой кусок код. Отключается глобально прерывание и глухое зацикливание. Если watchdog не включен, мк наглухо зависнет. Если включен, то мк зависнет до сработки сторожевого таймера.ARV писал(а):...
- Реклама
- Сообщения: 211
- Зарегистрирован: Пт окт 21, 2011 14:39:31
akl
Demiurg
ARV
Z_h_e
Спасибо, что откликнулись. Нашёл ошибку... в железе ). Фьюз CKOPT не запрограммировал. В результате на макетке ловил помеху раз в несколько минут.
Demiurg
ARV
Z_h_e
Спасибо, что откликнулись. Нашёл ошибку... в железе ). Фьюз CKOPT не запрограммировал. В результате на макетке ловил помеху раз в несколько минут.
вы о чем вообще говорите? AVR систему исключений (exception) не поддерживает, и запланировать переход на какую-то заглушку в случае незапланированного "срыва стека" невозможно.Demiurg писал(а):Незапланированное прерывание может быть включено в любой момент. Это может быть ошибка программиста. Сбой по питанию. Именно по этой причине делается переход на такой кусок код.
я же говорю только о факте: avr-gcc генерирует кусочек кода с запретом прерываний и вечным циклом только в одном месте - после завершения main (туда же передается управление по стандартной функции exit). в качестве обработки необслуживаемых прерываний avr-gcc пересбрасывает программу. оба эти утверждения я сопроводил доказательствами в виде кусков листинга из-под avr-gcc.
ничего иного я не говорил.
если я вас не правильно понял - поясните, что вы имеете ввиду.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Demiurg, функция main имеет некую специфичность, из нее некуда выходить в контексте AVR. Сколько раз уже Вам сказали что компилятор компиллит заглушку. Эта заглушка к прерываниям (про которые Вы зачем то говорите) отношения никакого не имеет и никакими заглушками ошибки и тем более сбои МК не заткнуть.
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Это структура скомпилированной программы. Я сейчас занят. Так что пока изучите структуру. В принципе по картинке все понятно. Позже отпишусь.
Последний раз редактировалось Demiurg Чт авг 10, 2017 09:33:10, всего редактировалось 1 раз.
если мы говорим о структуре скомпилированной avr-gcc сишной программы, то картинка не [совсем] верна - я приводил выдержки листинга, доказывающие это: после main есть единственная заглушка, а вместо заглушек в неиспользуемых векторах на самом деле генерируется переход на нулевой вектор, т.е. в конечном итоге на reset.Demiurg писал(а):Это структура скомпилированной программы.
разумеется, в самописных программах на ассемблере можно реализовать и такую, и любую иную структуру. просто компилятор Си avr-gcc делает иначе.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Я изменил картинку. Обратите внимание. Прямоугольники Прерывание Заглушка Подпрограмма ничем не отличаются. Это все подпрограммы. И заглушка может быть в любом месте. Главное дотянуться командами rjmp и jmp.
Вы показываете картинку того, как в вашем представлении должна выглядеть программа?
Я вам говорю: из-под avr-gcc она выглядит не так!
В вашем представлении нет ничего криминального или плохого, но avr-gcc делает не по-вашему!
Я вам говорю: из-под avr-gcc она выглядит не так!
В вашем представлении нет ничего криминального или плохого, но avr-gcc делает не по-вашему!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Компилятор может вызывать main, вы знали об этом? То есть, в зависимости от программы, настроек компилятора, после сброса и блока инициализации может быть как переход на main так и вызов.
Так же можно настраивать переходы из незапланированных прерываний.
Так же можно настраивать переходы из незапланированных прерываний.
Demiurg, лично я не понимаю о чем Вы, возможно и другие тоже не понимают. До вмешательства модератора, предлагаю создать тему по компилятору GCC (или хотя бы уйти в Сишную ветку) и там продолжить обсуждение.
----------
А вот по теме, очень хотелось бы понять что Вы имели ввиду. Резюмирую:
FeCat выложил код с точкой зависания.
ARV, указал что эта точка может быть только выходом из функции main.
Оставив в стороне Ваши обвинения в некомпетенции, Вы заявили Main вызван, а стек сорван.. Объясните почему данный код срывает стек. Если можете конечно.
----------
А вот по теме, очень хотелось бы понять что Вы имели ввиду. Резюмирую:
FeCat выложил код с точкой зависания.
ARV, указал что эта точка может быть только выходом из функции main.
Оставив в стороне Ваши обвинения в некомпетенции, Вы заявили Main вызван, а стек сорван.. Объясните почему данный код срывает стек. Если можете конечно.
[uquote="Demiurg",url="/forum/viewtopic.php?p=3159547#p3159547"]Компилятор может вызывать main, вы знали об этом? То есть, в зависимости от программы, настроек компилятора, после сброса и блока инициализации может быть как переход на main так и вызов.
Так же можно настраивать переходы из незапланированных прерываний.[/uquote]
я вам говорю - небо синее, а вы мне - нет, трава зелёная
можно делать что угодно, но avr-gcc делает нечто конкретное, и я на 100% уверен, что знаю, что этот компилятор делает. остальное - домыслы.
Так же можно настраивать переходы из незапланированных прерываний.[/uquote]
я вам говорю - небо синее, а вы мне - нет, трава зелёная
можно делать что угодно, но avr-gcc делает нечто конкретное, и я на 100% уверен, что знаю, что этот компилятор делает. остальное - домыслы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
1 - Я давно не писал проекты в gcc. Поэтому, остались остатки впечатлений и разбора дизассемблера. В некоторых моментах был не прав. Признаю. Но! Я зацепился за "выход из main". И "расположенный за main кусок кода". Тот, кто писал и пишет проекты на асме, никогда так не скажет.
Берем первый момент. Выход из main. Компиляторы, в зависимости от условий, могут компилировать два метода. Переход на main, и вызов main. В последнем случае появился в обсуждении срыв стека.
Второй момент. cli и rjmp PC + 0 или PC - 0 (однокуйственно). Это совершенно отдельный кусок кода, который можно рассматривать как отдельную подпрограмму. И не важно, где этот кусок будет находиться. Потому как:
Смотрим на этот кусок кода:
Спор возник из-за того, кто как рассматривает программу. Со стороны си, и оперирование одними понятиями. И со стороны асма, соответственно, оперирование понятиями со стороны архитектуры МК и асма.
Теперь возьмем момент, откуда взялись прерывания и срыв стека. Из-за ошибки программиста, сбоя может возникнуть переход на векторы незапланированных прерываний. Здесь уже варианты, как лучше сделать. И компиляторы могут сделать по разному. Один из методов - переход на глобальное отключение прерываний и глухое зацикливание. Потому как именно такой способ защищает и от срыва стека.
Берем первый момент. Выход из main. Компиляторы, в зависимости от условий, могут компилировать два метода. Переход на main, и вызов main. В последнем случае появился в обсуждении срыв стека.
Второй момент. cli и rjmp PC + 0 или PC - 0 (однокуйственно). Это совершенно отдельный кусок кода, который можно рассматривать как отдельную подпрограмму. И не важно, где этот кусок будет находиться. Потому как:
Код: Выделить всё
main:
bla-bla
rjmp Main
cli
rjmp PC + 0
Код: Выделить всё
Label:
rjmp PC + 0
Теперь возьмем момент, откуда взялись прерывания и срыв стека. Из-за ошибки программиста, сбоя может возникнуть переход на векторы незапланированных прерываний. Здесь уже варианты, как лучше сделать. И компиляторы могут сделать по разному. Один из методов - переход на глобальное отключение прерываний и глухое зацикливание. Потому как именно такой способ защищает и от срыва стека.
не могу поручиться за компиляторы, но логика подсказывает, что если вызов функции компилятор подменяет на переход, то он уж как-то должен и выход из функции оформить так, чтобы никакого срыва стека не было. но в целом это рассуждения из разряда "есть ли жизнь на Марсе".Demiurg писал(а):Компиляторы, в зависимости от условий, могут компилировать два метода. Переход на main, и вызов main. В последнем случае появился в обсуждении срыв стека
будем считать, что разобрались
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Внес правку. Думаю, что написал все, хотел сказать.ARV писал(а):...
какие, с вашей точки зрения, этот метод дает преимущества перед тем, который применяет avr-gcc, а так же перед методом "а и хрен с ним!", т.е. когда программист вообще никак не отрабатывает "случайные" прерывания?Demiurg писал(а):Один из методов - переход на глобальное отключение прерываний и глухое зацикливание. Потому как именно такой способ защищает и от срыва стека.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1495
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Самый простой способ ставить reti на все незадействованные прерывания. Пусть даже и случилось прерывание, но и ничего не произойдет.ARV писал(а):...



