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

 
 
> CortexM3 порты - пойман баг., И обезврежен :)
AHTOXA
сообщение Sep 23 2011, 04:28
Сообщение #1


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Собственно субж.
Описание бага:
В коде функции 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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Sep 23 2011, 15:24
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(IgorKossak @ Sep 23 2011, 18:12) *
Однако, возникают смутные сомнения насчёт актуальности этого бага в предыдущей версии ОС.

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

Да, прозевал, спасибоsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 8 2011, 07:50
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Исправил также в версии 3.10 (в настоящий момент это trunk) (для GCC).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 05:17
Рейтинг@Mail.ru


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