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