подскажите, насколько я понял это просто правило хорошего тона инициализировать регистры стэка? даже если например сам стэк использоваться не будет? (ну например не будут вызваны всякие call, ret и тд)

Комментарии: 37

  1. Alexander

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

    • Tiny

      да просто не будут использованы инструкции call, ret, push, pop, reti кстати насчет прерываний мысль, они через call вызываются? тогда да, не проинициализировав стэк будет плохо

      • Alexander

        Они вызываются аппаратным механизмом (реализующим out of order execution), но актуальный контекст при переходе по адресу из вектора обработчика сохраняется на стеке.

        • Tiny

          понял. спасибо. тогда получается надо всегда инициализировать стэк

          • Alexander

            Это практически ничего тебе стоить не будет.

            • Tiny

              а по дефолту прерывания все запрещены? надо сначала проинициализировать стэк а потом разрешить прерывания?

              • Ogurezzz

                Привет всем, у кого есть на примете хорошая статья, по работе с STM32 в Visual Studio Code? Или есть что-то более удобное под Linux?

                • Tiny

                  ну то есть не может быть ситуация когда я после инструкции 0x0000 пытаюсь инициализировать стэк а в это время вызывается прерывание которое использует неинициализированный стэк

                  • Alexander

                    Скорее всего не может. По логике после сброса бит разрешения обработки прерываний должен быть снят. Но это нужно уточнить в документации (там прописаны default value регистров)

                    • Tiny

                      хорошо. понял. посмотрю это

                  • Dmitriy

                    Всегда будет снят. Нужно заново инициализировать Если аппаратный сброс система прерывания отключена

                    • Tiny

                      ага. я уже у ДиХальта прочел этот момент) по умолчанию глобальный флажок и локальные флажки выключены ну это логично на самом деле, иначе может использоваться битый стэк

      • Dmitriy

        Механизм такой как калл. За исключением аппаратной загрузки вектора, запрета вложенных прерываний (зависит от камня) и возврата с автоматической установкой разрешения глобальных прерываний Многие камни имеют теневые регистры для аппаратного сохранения контекста, но обычно у старших моделей

        • Tiny

          а мне вот интересно. глобальный флажок разрешения прерываний находится в SREG. получается мк до выполнения нулевого адреса должен проициниализировать часть регистров? тот же SREG например

          • Dmitriy

            Нет, прерывания инициализирует пользователь. При аппаратном сброса флаг GIE сбрасываются сами

            • Tiny

              ну так по дефолту же глобальные прерывания запрещены. значит бит I в SREG должен где то быть установлен (или сброшен, не помню точное значение) до выполнения нулевой инструкции

              • Dmitriy

                Читай, СБРПСЫВАЕТСЯ АППАРАТНО. триггер ячейки sreg I сбрасывется в 0

                • Tiny

                  как то сложновато понять

                  • Dmitriy

                    До выполнения нулевой инструкции (правильно - вектора сброса) Что сложного... Триггер имеет аппаратный вход reset? Скажем так, вход reset напрямую подсоединен к сброса бита I

                    • Tiny

                      у чукчи сейчас крыша поедет

                      • Dmitriy

                        • Tiny

                          пока буду считать что он как-то хитрым образом устанавливается до выполнения нулевой инструкции)

                          • Dmitriy

                            Сбрасывается

                            • Tiny

                              хорошо) сбрасывается) не так выразился

                              • Dmitriy

                                Прерывания не могут автоматически работать после сброса, в том числе, что у тебя не проинициализирован стек тоже

                                • Tiny

                                  разумеется. это я знаю. флажок сброшен. прерывания не будут исполнены

                                  • Dmitriy

                                    Именно...

                                    • Tiny

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

                                      • Dmitriy

                                        Переферийные прерыаания тоже должны быть по идее сброшены, но тут нужно дш смотреть

                                        • Tiny

                                          дихальт пишет что мол все локальные прерывания запрещены по умолчанию

                                          • Dmitriy

                                            У многих камней векторы прерывания находятся в озу, и их таблицы тоде будут не проинициализированы Это логично

                                            • Tiny

                                              в озу под avr это flash память программы

                                              • Dmitriy

                                                Не не авр. Пропускай мимо.. Это зачастую по принстонской архитектуре

                                                • Tiny

                                                  я помню была когда то речь что на современном железе часть кода может исполняться в озу, и мол там были некоторое прерывания ( но я думал это не про avr)

                                                  • Dmitriy

                                                    Это например про x80, x86. Там принстон

                                                • Tiny

                                                  принстонская это фон неймоновская? каждый по разному называет

                                                  • Dmitriy

                                                    Да, Это одно и тоже... Я учил принстон

Не нашли ответ?

Вам также может быть интересно