Неиспользуемые пробелы в стеке задач программы Embedded C - PullRequest
0 голосов
/ 06 февраля 2019

В разработке встроенного C, работающей с ОСРВ с несколькими задачами, где каждая задача имеет свой собственный стек, почему в стеке может быть неиспользуемый разрыв между используемыми разделами?

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

Например:

Stack top
-----------------
unused area
-----------
used area 2
-----------
unused area
-----------
used area 1
-----------------
Stack bottom

Почему бынормальное использование стека оставляют пробел вместо непрерывных данных?

Любые предложения приветствуются, спасибо

Обновление

Чтобы ответить на вопросы, один пробел96 байт было замечено в одном стеке, где общий размер стека составляет 0x400 байт.

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

Моя другая (касающаяся) мысль была поврежденным указателем стека, но это кажется маловероятным, поскольку программное обеспечение работает без проблем.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я не совсем уверен, что понимаю вас.Промежутки между стеками могут возникать из-за того, что компоновщик вставляет порог безопасности «сверху» (то есть в направлении увеличения стека) каждого стека, чтобы защитить от ситуации, когда стек задач полностью используется подпрограммами задач и прерываниемПроисходит - в неуправляемой ситуации прерывание, фактически все возможные прерывания, которые разрешены протоколом приоритета вашего ЦП, могут добавить поверх каждой задачи максимальное использование стека.В управляемой ситуации (большинство RTOS управляют обработкой прерываний или, по крайней мере, могут быть настроены для этого), по крайней мере небольшая часть для записи прерываний будет временно находиться в стеке задач, пока векторизация ОС не будет перемещена в системный стек, который будет обрабатыватьукладка текущего и всех ISR с более высоким приоритетом.Таким образом, также в схеме управляемых прерываний должен быть запас безопасности сверху каждого стека.

0 голосов
/ 11 февраля 2019

Шаблон подписи - это метод определения использования стека, но не идеальный механизм - если в переменную ничего не записывается, шаблон не будет изменен.

«Неиспользованный» - вводящий в заблуждение термин;скорее не изменено является лучшим описанием.

Это обычно происходит в случаях, когда буферы могут использоваться не полностью.Например, если вы сказали:

char string_buff[128] ;

sprintf( string_buf, "%s", "hello" ) ;

будут записаны только 6 символов string_buff, которые будут отображаться как неиспользуемый пробел размером 122 байта.

Если код был изменен таким образом:

char string_buff[128] = {0} ;

sprintf( string_buf, "%s", "hello" ) ;

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

...