Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CortexM3 порты - пойман баг.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
AHTOXA
Собственно субж.
Описание бага:
В коде функции os_start() взводился флаг PendSV и разрешались прерывания. Тут же происходило прерывание PendSV, и из него вызывалась функция os_context_switch_hook(), в которой происходило обращение к ProcessTable[SchedProcPriority]. Однако этот момент переменная SchedProcPriority ещё не была проинициализирована. Она инициализируется только в TKernel::sched_isr().
Похоже, что нам везло просто, и SchedProcPriority был нулевым. (Таким образом первое переключение было на Idle-процесс).
Кроме того, поскольку первое прерывание происходило на Main Stack, то первое автоматическое сохранение контекста производилось на Main Stack, и от него бесполезно отъедалось 32 байта.

В настоящий момент всё исправлено (в репозитории, в ветке pre-v400). Бонусы - минус три команды из обработчика прерывания переключения контекста (~2.7мкс в 1-EventFlag), сэкономлено 32 байта стека.

Благодарности:
  • Сергею Борщу за то, что затеял оптимизацию, в процессе которой всё и обнаружилось, и за предложенный вариант исправления;
  • Андрею Чуйкину - за быстрое исправление порта для IAR;
  • Ну и мне немножкоsm.gif
IgorKossak
Спасибо всем троим. Однако, возникают смутные сомнения насчёт актуальности этого бага в предыдущей версии ОС. Не следует ли исследовать детально этот вопрос? Ибо уже выпущено весьма немалое количество устройств и надеяться на простую удачу не хотелось бы.
ReAl
Ну толи по bss-ности, толи по тому, что для целых конструктор по умолчанию занулять должен -- «должно бы» быть нулевым всегда.

Хотя, конечно, эх... Иногда такое находишь у себя...

p.s. О, я смотрю, там CM0-порт открылся. Будет что попробовать на честно выдуренной платке lpcxpresso :-)
Пора бы и мне «расчехлить каталоги».
Лето закончилось! (это такая команда)
Сергей Борщ
QUOTE (AHTOXA @ Sep 23 2011, 07:28) *
В настоящий момент всё исправлено (в репозитории, в ветке pre-v400).
Осталось удалить оставшуюся "за бортом" конструкцию loop: b loop ( в обоих портах) и в gcc - порте объявление ".global ContextRestore". И будет совсем красиво.

QUOTE (ReAl @ Sep 23 2011, 15:35) *
p.s. О, я смотрю, там CM0-порт открылся. Будет что попробовать на честно выдуренной платке lpcxpresso :-)
На такой и отлаживалось sm.gif
AHTOXA
Цитата(IgorKossak @ Sep 23 2011, 18:12) *
Однако, возникают смутные сомнения насчёт актуальности этого бага в предыдущей версии ОС.

В третьей версии баг также присутствует. Думаю его исправить и там, не оставлять же теперь.
Что касается выпущенных устройств, то беспокоиться не о чем. TKernel - объект, объекты помещаются в bss, bss в стартапе обнуляется, так что всё будет работать. Не совсем изящно, но железобетонно.
Цитата(Сергей Борщ @ Sep 23 2011, 18:41) *
Осталось удалить оставшуюся "за бортом" конструкцию loop: b loop ( в обоих портах) и в gcc - порте объявление ".global ContextRestore". И будет совсем красиво.

Да, прозевал, спасибоsm.gif
AHTOXA
Исправил также в версии 3.10 (в настоящий момент это trunk) (для GCC).
ReAl
А кстати, когда мы уже 3.10 в tags отправим а 4.00 в trunk ?
Сергей Борщ
Вероятно, когда я добъю четвертый пример и доку по SAM7/GCC
ReAl
На всякий случай «официально заявляю», что задерживать выход релиза ожиданием доки к вновь добавленному порту STM8 не стоит.

Я вообще не хотел вбрасывать этот порт в репозиторий до выхода релиза 4.00 — чтобы ни себя, ни релиз не связывать.
Но и отдельную ветку создавать не хотел.
Т.е. я-то потихоньку что-то делать буду, но кусок отпуска вот сегодня утром закончился.
Что успел, то за предыдущую неделю сделал. Теперь — капельный подзаряд.
dxp
Ждём портов ARM7 и выпускаем релиз. Остальное как созреет, так в последующие релизы попадёт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.