2016-10-12 2 views
0

Я бы предположил, что этот вопрос зависит от операционной системы или платформы.Имеет ли каждая функция и ISR свой собственный размер стека

Это произошло, когда я писал код C++ в Windows, используя аудио-библиотеки портов.

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

Я не здесь, чтобы спросить о каких-либо специфических для порта аудио, но мне было интересно, почему возникает проблема с пространством стека, если в ISR написано больше кода, чем в основной функции.

Я хочу назвать несколько различных функций из обратного вызова. Если этот обратный вызов действительно вызывается из ISR, вызывает больше функций из ISR-проблемы?

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

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

Большое спасибо заранее.

+0

Рискну догадку и сказать, что эта проблема может быть, что вы могли бы получить много ЗРМС до окончания каждого отдельного обратного вызова, то есть вы» d выделять пространство стека для всех из них, что может вызвать переполнение стека – UnholySheep

ответ

1

Если этот обратный вызов действительно вызван из ISR, вызывает больше функций из ISR-проблемы?

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

Как я называю каждую функцию, это позволит мне дополнительное пространство стека, потому что каждая функция имеет свой максимальный размер стека?

Нет, обычно нет. ISR вполне может быть вызван со своим собственным пространством стека, отдельно от того, с какой программой, с которой он связан, но это особый случай. Обычно функции используют тот же стек, что и их вызывающие, но у ISR есть абонентов в обычном смысле.

Я всегда думал, что функции и ISR могут использовать столько стекового пространства стека, сколько им нравится до полного выделенного стека. Значит ли это основная функция имеет большую часть стека, чем другие [?]

ISR можно использовать так же, как он любит из стека отведенного ему. Это пространство часто отделено от основного стека ассоциированной программы, что может быть полезно для предотвращения вмешательства в состояние основной программы при запуске ISR и имеет важное значение, когда ISR является асинхронным. Когда отдельный, стек ISR часто намного меньше.

Размер стека процесса (основного) зависит от системы, а иногда и от исполняемого файла; он разделяется между main и всеми функциями, вызываемыми прямо или косвенно от main. В однопоточных программах, mainделают имеет доступ к большему количеству стека, чем любая другой функция f, но основная причина этого является main и (обычно) каждая функция в цепочке вызовов от main к f занимает пространство стека, что f не может использовать ,

+0

Спасибо за это – Engineer999

0

Честно говоря, я бы не стал доверять «другому форуму».

В документации ничего не говорится об использовании слишком большого количества пространство в стеке. Он говорит о слишком большом количестве кода, и в контексте обратных вызовов ISR это означает, что слишком много стоит в ISR.

ISR (включая обратные вызовы) выполняется с заблокированными прерываниями. Теперь прерывания не накапливаются; контроллер может только сказать, ожидает ли прерывание. Если ISR занимает слишком много времени для выполнения, прерывания, возникающие во время его выполнения, теряются.

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

+0

Спасибо. Всегда ли ISR выполняется с заблокированными прерываниями? – Engineer999

1

Мне было интересно, почему возникла проблема с пространством стека, если больше кода написано в ISR, чем в основной функции.

Стековое пространство, вероятно, не является основной задачей для ISR. ISR должен быть как можно более простым и быстрым, чтобы свести к минимуму задержку, поэтому не нуждается в больших столах. Если вам нужно выполнять какую-либо нетривиальную обработку, ваш ISR должен запустить задачу для запуска в регулярном потоке позже для завершения задания (иногда называемого верхней половиной и нижней половиной). Этого можно достичь с помощью переменной состояния, семафора или очереди сообщений (чтобы назвать несколько механизмов IPC). Поэтому, если ISR использует много стека, это может свидетельствовать о том, что он пытается слишком много обрабатывать во время критического периода времени.

Кроме того, многие системы (например, RTOS) требуют объявления размера стека для потоков и ISR.

Я хочу назвать несколько различных функций из обратного вызова. Если этот обратный вызов действительно вызывается из ISR, вызывает больше функций из ISR-проблемы?

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

Также - остерегайтесь условий гонки! Тщательное использование мьютексов необходимо для защиты общего состояния.

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

Нет - функция не имеет собственного размера стека - нитки. Для ISR это зависит от ОС. Вызов каждой функции будет потреблять больше пространства стека (на основе уровня вложенности вызовов).

Я всегда думал, что функции и ISR могут использовать столько стекового пространства стека, сколько им нравится до полного выделенного стека.

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

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

Нет, так как стек соответствует нитью. Функция main будет находиться в нижней части стека вызовов приложения, но может потреблять небольшой или большой стек, зависящий только от его локальных переменных.

Некоторые хорошее чтение:

+0

Спасибо за это. В случае микроконтроллера с одним потоком и без ОС, что определяет размер стека для каждого ISR? – Engineer999

+0

Проще говоря - доступная оперативная память, минус текстовые команды (статические данные) и данные (прикладные двоичные) сегменты и куча. Это зависит от языка и компилятора, но обычно куча растет со дна, и стек растет. В этой статье есть хорошая диаграмма: https://www.quora.com/What-is-the-logical-explanation-for-stacks-typically-growing-downward-and-heaps-growing-upward – gavinb

Смежные вопросы