Перейти к содержанию
    

Привет всем. Подскажите, размер памяти, выделяемой под стек, в устройствах MSP430 всегда одинаков или все зависит от компилятора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, размер памяти, выделяемой под стек, в устройствах MSP430 всегда одинаков или все зависит от компилятора?

Размер как правило определяется в каждом проекте, за исключением случая когда стек аппаратный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Размер как правило определяется в каждом проекте, за исключением случая когда стек аппаратный.

 

Тогда два вопроса.

 

1. В каких устройствах MSP430 стек аппаратный?

 

2. Как может быть определен размер стека, если я, например, в своем проекте использую рекурсивную функцию? Заранее нельзя сказать сколько раз она будет вызвана и, соответственно, выделить под стек необходимое количество памяти.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. В каких устройствах MSP430 стек аппаратный?

ДУмаю, что в MSP430 аппаратный стек не использовался.

Такой стек использовался например в PIC-ах.

 

2. Как может быть определен размер стека, если я, например, в своем проекте использую рекурсивную функцию? Заранее нельзя сказать сколько раз она будет вызвана и, соответственно, выделить под стек необходимое количество памяти.

Глубина вызовов не может быть больше, чем размер стека - работать перестанет.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Глубина вызовов не может быть больше, чем размер стека - работать перестанет.Выбирите максимально возможное значение глубины вызовов и задайте стек в соответствии с ним.

 

Возможно мы не поняли друг друга. Я сам задаю размер стека?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно мы не поняли друг друга. Я сам задаю размер стека?

Да, задаёте сами.

 

Из 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет всем. Подскажите, размер памяти, выделяемой под стек, в устройствах MSP430 всегда одинаков или все зависит от компилятора?

Вот тут --

http://zhevak.wordpress.com/2012/11/22/раз...стека-в-msp430/

я написал о-очень длинный ответ. Такой длинный, что понял, что помещать его сюда -- лучше не надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я написал о-очень длинный ответ. Такой длинный, что понял, что помещать его сюда -- лучше не надо.

если выкинуть несколько бредовые рассуждения про avr, то вполне бы и сюда поместилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот тут --

http://zhevak.wordpress.com/2012/11/22/раз...стека-в-msp430/

я написал о-очень длинный ответ. Такой длинный, что понял, что помещать его сюда -- лучше не надо.

Спасибо, почитаю...
Изменено пользователем d7d1cd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В IAR есть какие-то настройки, в mspgcc по умолчанию стек растет навстречу статическим переменным, расположенным "с другого конца" ОЗУ до тех пор, пока не начнет затирать их. После этого дальнейший ход событий непредсказуем.

Рекурсия в мелкоконтроллерных проектах - неоправданная глупость, которая приводит к перерасходу стека и возможности краха.

Даже на "взрослых" компьютерах бесконтрольная рекурсия может закончиться аварийным завершением.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно мы не поняли друг друга. Я сам задаю размер стека?

Размер стека это абстрактная величина, определяемая программистом для компилятора. Потому, что в 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; //декремент счетчика вложенности прерываний
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#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, а не как глобальная?

Это подсчёт вложенности одного и того же прерывания? Не лучше ли на входе прерывания делать запрет вызова, а на выходе опять разрешать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем cntr_nested объявлена как static, а не как глобальная?
Чтобы зря не "засирать" namespace :)

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

Не лучше ли на входе прерывания делать запрет вызова, а на выходе опять разрешать?
Данный вопрос свидетельствует о том, что вы слабо знакомы с системой прерываний MSP430. При переходе по вектору прерывания сохраняется состояние регистра SR (на стеке), затем флаг GIE (Global Interrupt Enable - глобальное разрешение маскируемых прерываний), входящий в состав этого регистра, сбрасывается (точнее сбрасывается состояние всего статусного регистра SR) и таким образом вложенные прерывания автоматически запрещаются. Так что отдельно запрещать прерывания непосредственно в функции обработки прерывания не требуется. Если вам нужны вложенные прерывания, то в обработчике прерывания их можно разрешить (установив бит GIE). Естественно, что при выходе из прерывания состояние регистра SR (и бита GIE) восстанавливается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы зря не "засирать" namespace :)

Ну если так...то понятно.

 

Конечно. Ведь переменная имеет область видимости и изменяется только внутри данной конкретной функции обработки прерывания.

Мне как-то трудно представить, зачем допускать ситуацию, когда вложенность одного и того же прерывания больше 1. Разрешить работать другим прерываниям - понятно, а так - не очень.

 

Данный вопрос свидетельствует о том, что вы слабо знакомы с системой прерываний MSP430.

Я их даже не видел ни разу. :)

 

Если вам нужны вложенные прерывания, то в обработчике прерывания их можно разрешить (установив бит GIE).

Обычно так и делаю (на АВР правда, но какая разница). Но перед этим запрещаю тот обработчик, который выполняется в текущий момент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...