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

 
 
 
Reply to this topicStart new topic
> Найден баг в порте под Cortex-M3.
AHTOXA
сообщение Nov 13 2012, 14:26
Сообщение #1


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

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



Собственно, сабж. Я в процессе оптимизаций PendSV_Handler() перестарался - соптимизировал доставание из стека регистра LR. А этого делать нельзя, ибо там хранится значение exc_return. И если вдруг os_context_switch_hook() попортит LR, то всё сразу накроется.
Баг нестрашный, в том смысле, что с ним прошивка либо работает нормально, либо совсем не работает. То есть, баг не плавающий. Но лучше исправить.
Для порта GCC я уже залил исправленный вариант в репозиторий.
В порте IAR баг тоже есть, надеюсь Андрей его скоро исправит.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 13 2012, 16:32
Сообщение #2


Гуру
******

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



QUOTE (AHTOXA @ Nov 13 2012, 16:26) *
И если вдруг os_context_switch_hook() попортит LR,
Что-то сразу не соображу - как такое может случиться?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 13 2012, 17:29
Сообщение #3


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

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



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 13 2012, 21:40
Сообщение #4


Гуру
******

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



QUOTE (AHTOXA @ Nov 13 2012, 19:29) *
Ну вызовет какую-то функцию, например.
Как же он узнает, куда ему возвращаться?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
shreck
сообщение Nov 14 2012, 02:27
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Антон, не мог бы ты по подробнее объяснить суть внесенных изменений. Мое слабое знание ассемблера не позволяет понять в чем проблема в старом коде и как ее решает новый.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 14 2012, 03:58
Сообщение #6


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

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



Рассказываю.
Когда возникает исключение, часть регистров автоматически запихивается в стек. В том числе адрес следующей инструкции для выполнения после возврата (это к вопросу Сергея про "Как же он узнает, куда ему возвращаться"). Кроме того, в регистр LR заносится специальное значение exc_return, в котором сохраняются флажки, описывающие используемый стек и режим привилегий прерываемого процесса. (В M4F там ещё есть флажок активности FPU). При возврате из исключения из этого exc_return восстанавливается режим работы процессора. (Возврат из исключения происходит при записи в PC значения exc_return. У него все старшие биты единички, и по этой маске процессор определяет, что нужно возвращаться).
Конкретно надо поменять вот что:
1. Добавить строчку POP {LR} после строчки BL os_context_switch_hook
2. Заменить строчку POP {PC} на BX LR


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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
shreck
сообщение Nov 14 2012, 04:40
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(AHTOXA @ Nov 14 2012, 10:58) *
Рассказываю ...

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

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

В догонку, но не в тему.
Был разговор, что надо бы пользователю дать возможность выбора системного таймера. И вроде бы ты такую возможность добавлял. А сейчас ее нету. Да и мелкая оптимизация с короткими/длинными вызовами куда-то делась.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 14 2012, 05:08
Сообщение #8


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

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



Таймер никуда не делся - есть weak функция __init_system_timer(), которую пользователь может переопределить под себя. У меня не совсем очевидно, как действовать при смене вектора системного таймера. Насколько я помню, мы хотели (и ты сделал) сделать какие-то дефайны для упрощения этого дела. Потом мы стали выяснять, куда правильнее поместить эти дефайны, а потом это как-то вылетело у меня из головы sm.gif
Надо будет заняться.
И вызовами тоже (они не пропали, я их не делал).
---
Добавление: я же даже пример с кастом-таймером сделал (Samples/CortexM3/GCC/STM32F2XX/2-Message).


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

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 12:47
Рейтинг@Mail.ru


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