d7d1cd 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Привет всем. Подскажите, размер памяти, выделяемой под стек, в устройствах MSP430 всегда одинаков или все зависит от компилятора? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Подскажите, размер памяти, выделяемой под стек, в устройствах MSP430 всегда одинаков или все зависит от компилятора? Размер как правило определяется в каждом проекте, за исключением случая когда стек аппаратный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Размер как правило определяется в каждом проекте, за исключением случая когда стек аппаратный. Тогда два вопроса. 1. В каких устройствах MSP430 стек аппаратный? 2. Как может быть определен размер стека, если я, например, в своем проекте использую рекурсивную функцию? Заранее нельзя сказать сколько раз она будет вызвана и, соответственно, выделить под стек необходимое количество памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба 1. В каких устройствах MSP430 стек аппаратный? ДУмаю, что в MSP430 аппаратный стек не использовался. Такой стек использовался например в PIC-ах. 2. Как может быть определен размер стека, если я, например, в своем проекте использую рекурсивную функцию? Заранее нельзя сказать сколько раз она будет вызвана и, соответственно, выделить под стек необходимое количество памяти. Глубина вызовов не может быть больше, чем размер стека - работать перестанет. Выбирите максимально возможное значение глубины вызовов и задайте стек в соответствии с ним. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Глубина вызовов не может быть больше, чем размер стека - работать перестанет.Выбирите максимально возможное значение глубины вызовов и задайте стек в соответствии с ним. Возможно мы не поняли друг друга. Я сам задаю размер стека? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Возможно мы не поняли друг друга. Я сам задаю размер стека? Да, задаёте сами. Из slau049c.pdf: Software Initialization After a system reset, user software must initialize the MSP430 for the application requirements. The following must occur: - Initialize the SP, typically to the top of RAM. - Initialize the watchdog to the requirements of the application. - Configure peripheral modules to the requirements of the application. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhevak 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Привет всем. Подскажите, размер памяти, выделяемой под стек, в устройствах MSP430 всегда одинаков или все зависит от компилятора? Вот тут -- http://zhevak.wordpress.com/2012/11/22/раз...стека-в-msp430/ я написал о-очень длинный ответ. Такой длинный, что понял, что помещать его сюда -- лучше не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба А ещё лучше... его вообще не читать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба я написал о-очень длинный ответ. Такой длинный, что понял, что помещать его сюда -- лучше не надо. если выкинуть несколько бредовые рассуждения про avr, то вполне бы и сюда поместилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 22 ноября, 2012 Опубликовано 22 ноября, 2012 (изменено) · Жалоба Вот тут -- http://zhevak.wordpress.com/2012/11/22/раз...стека-в-msp430/ я написал о-очень длинный ответ. Такой длинный, что понял, что помещать его сюда -- лучше не надо. Спасибо, почитаю... Изменено 22 ноября, 2012 пользователем d7d1cd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 22 ноября, 2012 Опубликовано 22 ноября, 2012 · Жалоба В IAR есть какие-то настройки, в mspgcc по умолчанию стек растет навстречу статическим переменным, расположенным "с другого конца" ОЗУ до тех пор, пока не начнет затирать их. После этого дальнейший ход событий непредсказуем. Рекурсия в мелкоконтроллерных проектах - неоправданная глупость, которая приводит к перерасходу стека и возможности краха. Даже на "взрослых" компьютерах бесконтрольная рекурсия может закончиться аварийным завершением. Большинство рекурсивных алгоритмов можно преобразовать в обычный вид. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 22 ноября, 2012 Опубликовано 22 ноября, 2012 · Жалоба Возможно мы не поняли друг друга. Я сам задаю размер стека? Размер стека это абстрактная величина, определяемая программистом для компилятора. Потому, что в MSP430 аппаратный лишь сам указатель стека. Размер стека никак аппаратно не задается и не контролируется. "Наползание" стека на область статических/глобальных данных это самая трудновыявляемая ошибка в программировании. Компилятор может немного помочь в определении этого момента, но не всегда и с вероятностью, сильно отличающейся от 100%. Тем более он этого не может, когда идут рекурсивные вызовы в прерываниях, которые компилятор спрогнозировать вообще не в силах. Используйте программные ухищрения, типа счетчика рекурсии. #define MAX_NESTED_VALUE 5 //максимальное значение уровня вложенности прерываний #pragma vector=TIMERB0_VECTOR #pragma type_attribute=__interrupt void TIMERB0_ISR(void) { static unsigned int cntr_nested=0; cntr_nested++; //инкремент счетчика вложенности прерываний if (cntr_nested < MAX_NESTED_VALUE) //проверяем уровень вложенности, если он меньше допустимого, то выполняем какие-то действия { ... //выполняем какие-то действия, необходимые до вложенных прерываний __enable_interrupt(); //разрешаем прерывания, в т.ч. вложенные ... //выполняем какие-то действия } --cntr_nested; //декремент счетчика вложенности прерываний } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 22 ноября, 2012 Опубликовано 22 ноября, 2012 · Жалоба #define MAX_NESTED_VALUE 5 //максимальное значение уровня вложенности прерываний #pragma vector=TIMERB0_VECTOR #pragma type_attribute=__interrupt void TIMERB0_ISR(void) { static unsigned int cntr_nested=0; cntr_nested++; //инкремент счетчика вложенности прерываний if (cntr_nested < MAX_NESTED_VALUE) //проверяем уровень вложенности, если он меньше допустимого, то выполняем какие-то действия { ... //выполняем какие-то действия, необходимые до вложенных прерываний __enable_interrupt(); //разрешаем прерывания, в т.ч. вложенные ... //выполняем какие-то действия } --cntr_nested; //декремент счетчика вложенности прерываний } Зачем cntr_nested объявлена как static, а не как глобальная? Это подсчёт вложенности одного и того же прерывания? Не лучше ли на входе прерывания делать запрет вызова, а на выходе опять разрешать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 22 ноября, 2012 Опубликовано 22 ноября, 2012 · Жалоба Зачем cntr_nested объявлена как static, а не как глобальная?Чтобы зря не "засирать" namespace :) Это подсчёт вложенности одного и того же прерывания?Конечно. Ведь переменная имеет область видимости и изменяется только внутри данной конкретной функции обработки прерывания. Не лучше ли на входе прерывания делать запрет вызова, а на выходе опять разрешать?Данный вопрос свидетельствует о том, что вы слабо знакомы с системой прерываний MSP430. При переходе по вектору прерывания сохраняется состояние регистра SR (на стеке), затем флаг GIE (Global Interrupt Enable - глобальное разрешение маскируемых прерываний), входящий в состав этого регистра, сбрасывается (точнее сбрасывается состояние всего статусного регистра SR) и таким образом вложенные прерывания автоматически запрещаются. Так что отдельно запрещать прерывания непосредственно в функции обработки прерывания не требуется. Если вам нужны вложенные прерывания, то в обработчике прерывания их можно разрешить (установив бит GIE). Естественно, что при выходе из прерывания состояние регистра SR (и бита GIE) восстанавливается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 22 ноября, 2012 Опубликовано 22 ноября, 2012 · Жалоба Чтобы зря не "засирать" namespace :) Ну если так...то понятно. Конечно. Ведь переменная имеет область видимости и изменяется только внутри данной конкретной функции обработки прерывания. Мне как-то трудно представить, зачем допускать ситуацию, когда вложенность одного и того же прерывания больше 1. Разрешить работать другим прерываниям - понятно, а так - не очень. Данный вопрос свидетельствует о том, что вы слабо знакомы с системой прерываний MSP430. Я их даже не видел ни разу. :) Если вам нужны вложенные прерывания, то в обработчике прерывания их можно разрешить (установив бит GIE). Обычно так и делаю (на АВР правда, но какая разница). Но перед этим запрещаю тот обработчик, который выполняется в текущий момент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться