|
Размер стека |
|
|
|
 |
Ответов
|
Nov 21 2012, 14:25
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(_Артём_ @ Nov 21 2012, 18:20)  Размер как правило определяется в каждом проекте, за исключением случая когда стек аппаратный. Тогда два вопроса. 1. В каких устройствах MSP430 стек аппаратный? 2. Как может быть определен размер стека, если я, например, в своем проекте использую рекурсивную функцию? Заранее нельзя сказать сколько раз она будет вызвана и, соответственно, выделить под стек необходимое количество памяти.
|
|
|
|
|
Nov 21 2012, 15:33
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(d7d1cd @ Nov 21 2012, 16:25)  1. В каких устройствах MSP430 стек аппаратный? ДУмаю, что в MSP430 аппаратный стек не использовался. Такой стек использовался например в PIC-ах. Цитата(d7d1cd @ Nov 21 2012, 16:25)  2. Как может быть определен размер стека, если я, например, в своем проекте использую рекурсивную функцию? Заранее нельзя сказать сколько раз она будет вызвана и, соответственно, выделить под стек необходимое количество памяти. Глубина вызовов не может быть больше, чем размер стека - работать перестанет. Выбирите максимально возможное значение глубины вызовов и задайте стек в соответствии с ним.
|
|
|
|
|
Nov 21 2012, 16:22
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(_Артём_ @ Nov 21 2012, 19:33)  Глубина вызовов не может быть больше, чем размер стека - работать перестанет.Выбирите максимально возможное значение глубины вызовов и задайте стек в соответствии с ним. Возможно мы не поняли друг друга. Я сам задаю размер стека?
|
|
|
|
|
Nov 22 2012, 15:19
|
Гуру
     
Группа: Свой
Сообщений: 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; //декремент счетчика вложенности прерываний }
|
|
|
|
|
Nov 22 2012, 19:46
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(_Артём_ @ Nov 22 2012, 20:33)  Зачем cntr_nested объявлена как static, а не как глобальная? Чтобы зря не "засирать" namespace  Цитата(_Артём_ @ Nov 22 2012, 20:33)  Это подсчёт вложенности одного и того же прерывания? Конечно. Ведь переменная имеет область видимости и изменяется только внутри данной конкретной функции обработки прерывания. Цитата(_Артём_ @ Nov 22 2012, 20:33)  Не лучше ли на входе прерывания делать запрет вызова, а на выходе опять разрешать? Данный вопрос свидетельствует о том, что вы слабо знакомы с системой прерываний MSP430. При переходе по вектору прерывания сохраняется состояние регистра SR (на стеке), затем флаг GIE (Global Interrupt Enable - глобальное разрешение маскируемых прерываний), входящий в состав этого регистра, сбрасывается (точнее сбрасывается состояние всего статусного регистра SR) и таким образом вложенные прерывания автоматически запрещаются. Так что отдельно запрещать прерывания непосредственно в функции обработки прерывания не требуется. Если вам нужны вложенные прерывания, то в обработчике прерывания их можно разрешить (установив бит GIE). Естественно, что при выходе из прерывания состояние регистра SR (и бита GIE) восстанавливается.
|
|
|
|
|
Nov 22 2012, 20:35
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(rezident @ Nov 22 2012, 21:46)  Чтобы зря не "засирать" namespace  Ну если так...то понятно. Цитата(rezident @ Nov 22 2012, 21:46)  Конечно. Ведь переменная имеет область видимости и изменяется только внутри данной конкретной функции обработки прерывания. Мне как-то трудно представить, зачем допускать ситуацию, когда вложенность одного и того же прерывания больше 1. Разрешить работать другим прерываниям - понятно, а так - не очень. Цитата(rezident @ Nov 22 2012, 21:46)  Данный вопрос свидетельствует о том, что вы слабо знакомы с системой прерываний MSP430. Я их даже не видел ни разу.  Цитата(rezident @ Nov 22 2012, 21:46)  Если вам нужны вложенные прерывания, то в обработчике прерывания их можно разрешить (установив бит GIE). Обычно так и делаю (на АВР правда, но какая разница). Но перед этим запрещаю тот обработчик, который выполняется в текущий момент.
|
|
|
|
|
Dec 5 2012, 11:43
|

Группа: Новичок
Сообщений: 2
Регистрация: 6-05-09
Пользователь №: 48 738

|
Цитата(_Артём_ @ Nov 23 2012, 00:35)  Мне как-то трудно представить, зачем допускать ситуацию, когда вложенность одного и того же прерывания больше 1. Это называется "реэнтерабельность" прерываний, т. е., способность входить в прерывание, пока оно не закончено, и не разрушить программу, видимо, иногда нужная штука...
|
|
|
|
|
Dec 5 2012, 17:25
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Реентерабебльность (от re-enter -- повторный вход) -- это, конечно, хорошо! Но всему должна быть мера.
Реентерабельность обычных функций (не обработчиков прерываний) -- это нормальное явление. Хотя оно и требует к себе повышенного внимания. То есть вполне допустимо, если вы понимаете, что вы делаете, и что на самом деле у вас в системе происходит.
Реентерабельность прерываний -- это уже из области работы со взрывчаткой. Тут, в отличие от простых функций, внимание этому вопросу нужно уделять максимальное. Если вы профи, то, если что, вы наверняка разберетесь со странным поведением системы. Но если вы только-только, то геммор на несколько дней вам обеспечен без гарантии того, что вам вообще удастся обуздать ситуацию.
Вообще реентерабельность прерываний подразумевает то, что прерывания разбиты на несколько уровней -- по приоритетам. Более приоритетные прерывания имеют право прерывать работу обработчиков прерываний с более низким приоритетом. (Блин, ну и тавтология. Сам поражаюсь!) Реентерабельность прерываний -- это вынужденная мера. Это нужно делать только тогда, когда другими способами не удается разрулить работу системы (девайса). По возможности нужно избегать реентерабельности прерываний.
Если реентерабельность прерываний одного уровня -- очень и очень сомнительна (это явно не от великого ума), то реентерабелность одного прерывания -- это мега-зло!
Применение уровней прерываний и создание реентерабельности может быть оправдано только в двух случаях. Первый -- программа на столько небольшая, что логика работы ее прозрачна и осязаема. Ну, например, моргание светодиодами. Второй случай -- это когда система достаточно большая и сложная, но должна отвечать жестким требованиям по скорости отклика на события. Это в основном системы реального времени с заранее оговоренной скоростью реакции.
Во всех остальных случаях, следует придерживаться следующей логики. Из нескольких, одновременно возникших в системе событий мы должны создать очередь, и последовательно их обработать. Например, одновременно пришедшие события от клавиатуры, мышки и RS485, могут быть обработаны в ЛЮБОМ порядке относительно друг друга. Собственно, порядок их обработки может быть легко измениться, если какое-то событие возникнет на мгновение раньше другого. Невозможно учесть абсолютно все жизненные ситуации, поэтому проще считать, что
"мы будем бороться с проблемами в порядке их возникновения" (с) не помню чье высказывание
Вообще это очень большая тема и конкретное решение по реентерабельности прерываний нужно рассматривать не абстрактно, а применительно и конкретно.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
Сообщений в этой теме
d7d1cd Размер стека Nov 21 2012, 13:43    _Артём_ Цитата(d7d1cd @ Nov 21 2012, 18:22) Возмо... Nov 21 2012, 16:56        rezident Цитата(_Артём_ @ Nov 23 2012, 01:35) Мне ... Nov 23 2012, 13:09 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|