AHTOXA 15 13 ноября, 2012 Опубликовано 13 ноября, 2012 · Жалоба Собственно, сабж. Я в процессе оптимизаций PendSV_Handler() перестарался - соптимизировал доставание из стека регистра LR. А этого делать нельзя, ибо там хранится значение exc_return. И если вдруг os_context_switch_hook() попортит LR, то всё сразу накроется. Баг нестрашный, в том смысле, что с ним прошивка либо работает нормально, либо совсем не работает. То есть, баг не плавающий. Но лучше исправить. Для порта GCC я уже залил исправленный вариант в репозиторий. В порте IAR баг тоже есть, надеюсь Андрей его скоро исправит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 13 ноября, 2012 Опубликовано 13 ноября, 2012 · Жалоба И если вдруг os_context_switch_hook() попортит LR,Что-то сразу не соображу - как такое может случиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 13 ноября, 2012 Опубликовано 13 ноября, 2012 · Жалоба Ну вызовет какую-то функцию, например. Скажем, из пользовательского хука. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 13 ноября, 2012 Опубликовано 13 ноября, 2012 · Жалоба Ну вызовет какую-то функцию, например.Как же он узнает, куда ему возвращаться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ashr 0 14 ноября, 2012 Опубликовано 14 ноября, 2012 · Жалоба Антон, не мог бы ты по подробнее объяснить суть внесенных изменений. Мое слабое знание ассемблера не позволяет понять в чем проблема в старом коде и как ее решает новый. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 14 ноября, 2012 Опубликовано 14 ноября, 2012 · Жалоба Рассказываю. Когда возникает исключение, часть регистров автоматически запихивается в стек. В том числе адрес следующей инструкции для выполнения после возврата (это к вопросу Сергея про "Как же он узнает, куда ему возвращаться"). Кроме того, в регистр LR заносится специальное значение exc_return, в котором сохраняются флажки, описывающие используемый стек и режим привилегий прерываемого процесса. (В M4F там ещё есть флажок активности FPU). При возврате из исключения из этого exc_return восстанавливается режим работы процессора. (Возврат из исключения происходит при записи в PC значения exc_return. У него все старшие биты единички, и по этой маске процессор определяет, что нужно возвращаться). Конкретно надо поменять вот что: 1. Добавить строчку POP {LR} после строчки BL os_context_switch_hook 2. Заменить строчку POP {PC} на BX LR Блин! :cranky: Написал, и понял, что всё было правильно. Отбой воздушной тревоги:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ashr 0 14 ноября, 2012 Опубликовано 14 ноября, 2012 · Жалоба Рассказываю ... Блин! :cranky: Написал, и понял, что всё было правильно. Отбой воздушной тревоги:) "Не спеши выполнять. Отменят" В догонку, но не в тему. Был разговор, что надо бы пользователю дать возможность выбора системного таймера. И вроде бы ты такую возможность добавлял. А сейчас ее нету. Да и мелкая оптимизация с короткими/длинными вызовами куда-то делась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 14 ноября, 2012 Опубликовано 14 ноября, 2012 · Жалоба Таймер никуда не делся - есть weak функция __init_system_timer(), которую пользователь может переопределить под себя. У меня не совсем очевидно, как действовать при смене вектора системного таймера. Насколько я помню, мы хотели (и ты сделал) сделать какие-то дефайны для упрощения этого дела. Потом мы стали выяснять, куда правильнее поместить эти дефайны, а потом это как-то вылетело у меня из головы :) Надо будет заняться. И вызовами тоже (они не пропали, я их не делал). --- Добавление: я же даже пример с кастом-таймером сделал (Samples/CortexM3/GCC/STM32F2XX/2-Message). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться