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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Keil. Stack usage overflow, в отладчике вспыхивает красным
ViKo
сообщение Jul 25 2016, 16:44
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Задал использовать проверку переполнения стека в отладочном назначении. И watermark. Вижу при отладке, подсвечивает красным на одной задаче Overflow. Догнал размер с 512 байтов до 4000, и все равно то же. При этом в процентах cur / max пишет: 1%, 6%. И пока малый стек был, тоже никогда до 100% не выдавало. И работает при этом. Кто из нас двинулся умом? Чувствую, дело не в переполнении стека.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 26 2016, 16:01
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Изучил в отладчике, где стеки задач создаются. Вижу, как создаются все стеки, кроме последней задачи. Много вариантов размеров перепробовал, но ничего не изменилось. Одна задача периодически подсвечивается красным и пишет Overflow, другая задача при воздействии органов управления тоже вспыхивает. Причем в функцию os_error не залетает! По поведению прибора тоже не скажешь, что сбоит. И настройки железа-отладчика менял.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 27 2016, 02:49
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ Jul 26 2016, 22:01) *
Изучил в отладчике, где стеки задач создаются. Вижу, как создаются все стеки, кроме последней задачи. Много вариантов размеров перепробовал, но ничего не изменилось.

Задавайте стеки статически и не будет чудес. Зачем их на куче делать-то??
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jul 27 2016, 05:45
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(ViKo @ Jul 26 2016, 21:01) *
Изучил в отладчике, где стеки задач создаются. Вижу, как создаются все стеки, кроме последней задачи.

A Keil-то знает об операционке?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 27 2016, 07:45
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



ОС Кейловская RTX с их же надстройкой CMSIS RTOS. Задаю стеки, как в документации, некоторые размером по умолчанию, некоторые своим. Кейл заполняет их шаблоном CC для контроля размера. По моим наблюдениям, они не портятся. Здесь что-то другое. Возможно, быстродействие компа катастрофически испорчено. Есть программы, которые, практически, не работают. Надо драйверы переустановить, OpenGL...
Еще попробую новый Кейл 5.20, типа, революционный.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 27 2016, 10:52
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ Jul 27 2016, 05:49) *
Задавайте стеки статически и не будет чудес. Зачем их на куче делать-то??

Ни на какой не на куче. Куча, вообще, девственно чиста, забита одними нулями. Основной стек, тот, что над кучей, используется слегка. Стеки задач создаются в отдельной области os_stack_mem. Но что-то не могу увидеть в ней всех задач. То есть, не вижу шаблона CC. Значит, его действительно что-то портит.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 27 2016, 12:20
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Посмотрите как данная фича во FreeRTOS реализована. Просто и красиво.
Есть несколько вариантов.
1. Куча забивается 55 при инициализации и ты смотришь глазами на сколько она занята.
2. При переключении задач планировщик смотрит значение указателя стека, на предмет "вылезания" ( думаю у вас этот случай). Теоретически может не проявляться. Так как надо чтобы совпали 2 события.
...
Вы можете всунуть аналогичную хрень в планировщик RTX и посмотреть.
Возможно у вас в задаче используется SP нестандартно местами, и самого "нарушения" нет?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 27 2016, 14:13
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Сделал все задачи с заданным пользователем стеком (не по умолчанию). Вижу все задачи в области os_stack_mem. Вижу, у всех задач к конце стека (младшие адреса) есть подложка из CC байтов. Достаточное количество, как минимум, половина от выделенного. Вижу, как меняются остальные байты при работе. Ничего необычного. И все равно одна задача иногда подсвечивается красным. Я уже и местами их менял, теперь она не последняя в этой области. Не помогает.
Складывается, что сама задача и портит свой же стек. Лично я со стеком не балуюсь, боже упаси. Во всяком случае, не намеревался.
И все так же смущает, что функция os_error не вызывается. При переполнении стека она должна вызываться, и там зависать.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 28 2016, 05:37
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ Jul 27 2016, 20:13) *
Складывается, что сама задача и портит свой же стек. Лично я со стеком не балуюсь, боже упаси. Во всяком случае, не намеревался.
И все так же смущает, что функция os_error не вызывается. При переполнении стека она должна вызываться, и там зависать.

Ну если Вы нашли адрес, где подозреваете, что портится содержимое стека, то поставьте бряк на это место под эмулятором и увидите кто туда пишет.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 28 2016, 06:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Ну я вот думаю.. Каким образом они видят, что что-то не то?
Я вижу только один вариант. Планировщик при переключении контекста анализирует указатель стека на предмет нахождения его в границах памяти выделенной для данной задачи.
Ну и если он вылез, то хук.
Надо посмотреть настройки этого хука.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 28 2016, 07:05
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Адрес не нашел, там много функций работает. Вся память задачи "кишит", до CC. CC стоят стабильно.
Я нашел, что событие (Event) для запуска задачи может устанавливаться из двух мест - прерывания и другой задачи, возможно с любым интервалом, вплоть до минимального. Может, это влияет. Буду рыть в ту сторону.
Интересно, а underflow возможен? И контроль его? Но тоже не вижу.

Не так. События устанавливаются, как угодно, но задача запускается по наличию обоих событий (WAIT_AND). Так что там никаких "гонок" быть не может.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 29 2016, 12:32
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Попробовал на другом компьютере, слабеньком ноутбуке. Поведение аналогичное.
Уменьшил размер стека ниже требуемого, для другой задачи попробовал, и для "злополучной". Как только выполнение доходит до такой задачи, пишется Overflow и так и остается. Процессор улетает в os_error. А если стек совсем безумно мал, то в HardFault.
Делаю вывод, что при большом стеке имею некое ложное срабатывание Overflow. Видимо, моя задача слишком напичкана функциями. Может, какой-то предел вложенности перескочил.
Поставлю другую версию Keil.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 29 2016, 13:51
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Поставил Keil 5.20. Теперь Overflow не высвечивается. А только числа cur / max периодически пропадают, пустыми ячейки становятся в таблице Stack usage. Это лучше, чем писать Overflow на красном фоне! rolleyes.gif Буду считать, у меня все нормально. Просто быстродействия компа не хватает, чтобы все посчитать и написать.

Кстати, ничего нового в версии 5.20 не увидел. Кроме начальной заставки. laughing.gif
P.S. Нашел новое. Можно включить новую версию компилятора (v6.4 вместо v5.06), которым компилировать не удастся, потому что находит полсотни ошибок. Прикрепленное изображение
Go to the top of the page
 
+Quote Post
pitt
сообщение Jul 30 2016, 13:05
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Цитата(ViKo @ Jul 29 2016, 09:51) *
P.S. Нашел новое. Можно включить новую версию компилятора (v6.4 вместо v5.06), которым компилировать не удастся, потому что находит полсотни ошибок. Прикрепленное изображение

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


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 30 2016, 14:39
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(pitt @ Jul 30 2016, 16:05) *
Учитесь писать чисто... Правильно написянный код может изредка дать несколько предупреждений. Так что есть замечательный повод для работы над ошибками.

Я не против совершенствования. В этом новом компиляторе выбираются разные стандарты, вплоть до С11 и С++14. Займусь в свободное от досуга время. biggrin.gif
Считайте, что полсотни ошибок на 20000 строк исходников - это и есть изредка несколько. rolleyes.gif
Не зря этот компилятор не включается по умолчанию.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th June 2025 - 21:04
Рейтинг@Mail.ru


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