Данные в стеках задач uOS и решение (?) проблемы остановок uOS

29 views
Skip to first unread message

aleksej...@gmail.com

unread,
Apr 16, 2018, 2:40:30 PM4/16/18
to uOS embedded
Доброго времени суток!

В результате длительного копания в исходных кодах uOS и содержимом ОЗУ процессора удалось выяснить, что все четыре варианта внешнего проявления остановки uOS, обнаруженные и описанные в предыдущих темах А. Федосовым и А. Рывкиным, имеют общую природу - нештатную перезапись произвольных областей ОЗУ, в том числе указателей очереди задач, т.е. списка item структуры task_t. Участок кода, переписывающий что не следует, найти не удавалось - вплоть до звонков в техподдержку Элвиса. Тут-то и выяснилось, что надо держать включенными опции компилятора -Wa --mc24r2 и -fno-delayed-branch. Объем кода вырос на 23 - 25 % (в разных проектах) за счет появившихся инструкций nop после инструкций загрузки слов lw и некоторых инструкций ветвлений. После включения этих опций проект, стабильно падавший каждые три-четыре минуты, стабильно оттарахтел 77 с половиной часов без сбоев. Собственно, сейчас (три недели спустя) падения проектов прекратились, однако же это не доказывает, что проблема решена полностью.

Причина - нюансы работы конвейера процессорного ядра 1892ВМ10Я, толком не описанные в документации. В частности, опция --mc24r2 не фигурирует нигде. Если ошибаюсь - поправьте.

А вопрос-то в другом. Пока копался, изучил структуру стека задачи. Точнее, стек правильнее называть файлом. При создании задачи в начале стека размещается структура task_t, затем следует свободное место (заполненное словами 0xaaaaaaaa), затем идет контекст, в котором сохраняются регистры процессора и сопроцессоров, и в конце - фрейм для вызова функции, реализующей задачу. Так вот, судя по содержимому ОЗУ - фрейм используется только для первого вызова функции. А локальные переменные задачи размещаются в регистрах процессора, а если не умещаются (в задаче был тестовый массив длиной 75 байт) - размещаются на месте фрейма. Собственно, вопрос сведущим: где именно размещаются локальные переменные задачи?

Заранее спасибо!

Александр Литягин

unread,
Apr 16, 2018, 3:02:27 PM4/16/18
to uOS embedded
Алексей, спасибо за этот тривиальный результат. опции компилятора, переоткрытые Вами, настраиваются при создании нового проекта элвисовой студией. Вы видимо захотпли все сделать не мастером проекта, а с нуля?
что же до задачи и фрейма - судя по тому что Вы написали, нехватает Вам малость познаний в асемблере. стоит погуглить фреймы вызова функций.

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


пн, 16 апр. 2018 г., 21:40 <aleksej...@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на группу "uOS embedded".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес uos-embedded...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес uos-em...@googlegroups.com.
Чтобы зайти в группу, перейдите по ссылке https://groups.google.com/group/uos-embedded.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages