реклама на сайте
подробности

 
 
> Размер стека
d7d1cd
сообщение Nov 21 2012, 13:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Привет всем. Подскажите, размер памяти, выделяемой под стек, в устройствах MSP430 всегда одинаков или все зависит от компилятора?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Nov 21 2012, 14:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Nov 21 2012, 15:43) *
Подскажите, размер памяти, выделяемой под стек, в устройствах MSP430 всегда одинаков или все зависит от компилятора?

Размер как правило определяется в каждом проекте, за исключением случая когда стек аппаратный.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 21 2012, 14:25
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(_Артём_ @ Nov 21 2012, 18:20) *
Размер как правило определяется в каждом проекте, за исключением случая когда стек аппаратный.


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

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

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

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 21 2012, 15:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Nov 21 2012, 16:25) *
1. В каких устройствах MSP430 стек аппаратный?

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

Цитата(d7d1cd @ Nov 21 2012, 16:25) *
2. Как может быть определен размер стека, если я, например, в своем проекте использую рекурсивную функцию? Заранее нельзя сказать сколько раз она будет вызвана и, соответственно, выделить под стек необходимое количество памяти.

Глубина вызовов не может быть больше, чем размер стека - работать перестанет.
Выбирите максимально возможное значение глубины вызовов и задайте стек в соответствии с ним.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Nov 21 2012, 16:22
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(_Артём_ @ Nov 21 2012, 19:33) *
Глубина вызовов не может быть больше, чем размер стека - работать перестанет.Выбирите максимально возможное значение глубины вызовов и задайте стек в соответствии с ним.


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

Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 22 2012, 15:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Nov 21 2012, 21:22) *
Возможно мы не поняли друг друга. Я сам задаю размер стека?

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

Сообщений в этой теме
- d7d1cd   Размер стека   Nov 21 2012, 13:43
|- - _Артём_   Цитата(d7d1cd @ Nov 21 2012, 18:22) Возмо...   Nov 21 2012, 16:56
|- - _Артём_   Цитата(rezident @ Nov 22 2012, 17:19) Код...   Nov 22 2012, 15:33
|- - rezident   Цитата(_Артём_ @ Nov 22 2012, 20:33) Заче...   Nov 22 2012, 19:46
|- - _Артём_   Цитата(rezident @ Nov 22 2012, 21:46) Что...   Nov 22 2012, 20:35
|- - rezident   Цитата(_Артём_ @ Nov 23 2012, 01:35) Мне ...   Nov 23 2012, 13:09
|- - Steve Key   Цитата(_Артём_ @ Nov 23 2012, 00:35) Мне ...   Dec 5 2012, 11:43
|- - zhevak   Реентерабебльность (от re-enter -- повторный вход)...   Dec 5 2012, 17:25
- - zhevak   Цитата(d7d1cd @ Nov 21 2012, 19:43) Приве...   Nov 21 2012, 18:53
|- - HHIMERA   А ещё лучше... его вообще не читать...   Nov 21 2012, 20:37
|- - _pv   Цитата(zhevak @ Nov 22 2012, 00:53) я нап...   Nov 21 2012, 22:52
|- - d7d1cd   Цитата(zhevak @ Nov 21 2012, 22:53) Вот т...   Nov 22 2012, 02:46
- - MrYuran   В IAR есть какие-то настройки, в mspgcc по умолчан...   Nov 22 2012, 05:35


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 10:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016