|
CortexM3 порты - пойман баг., И обезврежен :) |
|
|
|
Sep 23 2011, 04:28
|

фанат дивана
     
Группа: Свой
Сообщений: 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;
- Ну и мне немножко

--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Sep 23 2011, 12:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
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 :-) На такой и отлаживалось
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 23 2011, 15:24
|

фанат дивана
     
Группа: Свой
Сообщений: 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". И будет совсем красиво. Да, прозевал, спасибо
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|