Перейти к содержанию
    

Найден баг в порте под Cortex-M3.

Собственно, сабж. Я в процессе оптимизаций PendSV_Handler() перестарался - соптимизировал доставание из стека регистра LR. А этого делать нельзя, ибо там хранится значение exc_return. И если вдруг os_context_switch_hook() попортит LR, то всё сразу накроется.

Баг нестрашный, в том смысле, что с ним прошивка либо работает нормально, либо совсем не работает. То есть, баг не плавающий. Но лучше исправить.

Для порта GCC я уже залил исправленный вариант в репозиторий.

В порте IAR баг тоже есть, надеюсь Андрей его скоро исправит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И если вдруг os_context_switch_hook() попортит LR,
Что-то сразу не соображу - как такое может случиться?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вызовет какую-то функцию, например. Скажем, из пользовательского хука.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вызовет какую-то функцию, например.
Как же он узнает, куда ему возвращаться?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Антон, не мог бы ты по подробнее объяснить суть внесенных изменений. Мое слабое знание ассемблера не позволяет понять в чем проблема в старом коде и как ее решает новый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рассказываю.

Когда возникает исключение, часть регистров автоматически запихивается в стек. В том числе адрес следующей инструкции для выполнения после возврата (это к вопросу Сергея про "Как же он узнает, куда ему возвращаться"). Кроме того, в регистр LR заносится специальное значение exc_return, в котором сохраняются флажки, описывающие используемый стек и режим привилегий прерываемого процесса. (В M4F там ещё есть флажок активности FPU). При возврате из исключения из этого exc_return восстанавливается режим работы процессора. (Возврат из исключения происходит при записи в PC значения exc_return. У него все старшие биты единички, и по этой маске процессор определяет, что нужно возвращаться).

Конкретно надо поменять вот что:

1. Добавить строчку POP {LR} после строчки BL os_context_switch_hook

2. Заменить строчку POP {PC} на BX LR

 

 

Блин! :cranky: Написал, и понял, что всё было правильно. Отбой воздушной тревоги:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рассказываю ...

 

Блин! :cranky: Написал, и понял, что всё было правильно. Отбой воздушной тревоги:)

"Не спеши выполнять. Отменят"

 

В догонку, но не в тему.

Был разговор, что надо бы пользователю дать возможность выбора системного таймера. И вроде бы ты такую возможность добавлял. А сейчас ее нету. Да и мелкая оптимизация с короткими/длинными вызовами куда-то делась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Надо будет заняться.

И вызовами тоже (они не пропали, я их не делал).

---

Добавление: я же даже пример с кастом-таймером сделал (Samples/CortexM3/GCC/STM32F2XX/2-Message).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...