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

 
 
> scmRTOS v3.00 Первые непонятки., Порт для MSP430
shreck
сообщение Jan 23 2007, 12:39
Сообщение #1


Местный
***

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



В этой версии оси появилось такое вообщем-то нужное средство как переключение стека во время выполнения isr на стек прерываний. Решил попробовать эту фичу. Объявил объект TISRW_SS в обработчике, залил в проц. На первый взгляд вроде бы все работает. Но... Посмотрел листинг обработчика и впал в некоторое недоумение. Перед переключением стека выполняется сохранение некоторых регистров в "старый" стек, чего в данном случае, насколько я понимаю, быть не должно. Ладно. Изменил макрос OS_INTERRUPT на __raw __interrupt. Сохранение регистров перед переключением стека соответственно исчезло, но программа работать перестала.

Вопрос к тем, кто глубоко копал эту ось. Описанное выше это нормально или это ошибка в коде или что-то еще? Может кто прокомментировать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Jan 23 2007, 13:17
Сообщение #2


Гуру
******

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



Цитата(shreck @ Jan 23 2007, 11:39) *
В этой версии оси появилось такое вообщем-то нужное средство как переключение стека во время выполнения isr на стек прерываний. Решил попробовать эту фичу. Объявил объект TISRW_SS в обработчике, залил в проц. На первый взгляд вроде бы все работает. Но... Посмотрел листинг обработчика и впал в некоторое недоумение. Перед переключением стека выполняется сохранение некоторых регистров в "старый" стек, чего в данном случае, насколько я понимаю, быть не должно. Ладно. Изменил макрос OS_INTERRUPT на __raw __interrupt. Сохранение регистров перед переключением стека соответственно исчезло, но программа работать перестала.

Вопрос к тем, кто глубоко копал эту ось. Описанное выше это нормально или это ошибка в коде или что-то еще? Может кто прокомментировать?
Это нормально. Это небольшая плата за независимость от компилятора и от трюков с __raw и связанных с этим сложностей в версии 2.0


--------------------
На любой вопрос даю любой ответ
"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
сообщение Jan 23 2007, 13:38
Сообщение #3


Местный
***

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



[quote name='Сергей Борщ' date='Jan 23 2007, 17:17' post='200364']
[/quote]Это нормально. Это небольшая плата за независимость от компилятора и от трюков с __raw и связанных с этим сложностей в версии 2.0
[/quote]



Не понял. Нормально что? Сохранение регистров в стек пользовательского процесса перед переключением на стек прерывания при входе в isr? Так ведь переключение на стек прерывания и задуманно для того, чтобы не сохранять регистры в стек текущего процесса. Разве не так?
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 23 2007, 14:11
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(shreck @ Jan 23 2007, 16:38) *
Не понял. Нормально что? Сохранение регистров в стек пользовательского процесса перед переключением на стек прерывания при входе в isr? Так ведь переключение на стек прерывания и задуманно для того, чтобы не сохранять регистры в стек текущего процесса. Разве не так?

Сохранение регистров сразу в стек прерываний реально возможно только в процессорах с аппаратным переключением на стек прерываний. В MSP430, к сожалению, такой возможности нет. Переключение на стек прерываний выполняется программно и, конечно, уже после пролога, сгенеренного компилятором. Смысл переходить на стек прерываний есть только в случае вложенных прерываний и/или если прерывание потребляет много стека. Если прерывание вложенные не разрешает и стек значительно не потребляет, то и использовать переключение на стек прерываний не целесообразно.

А всякие финты с __raw, как уже сказали, в v3 убраны, т.к. как показала практика в этом кроется чуть ли не 90% причин неработоспособности программы. Тут требуется очень аккуратное использование (включая руление опциями компилятора) и отслеживание вручную результатов компиляции, т.к. поведение очень компиляторозависимое. Теперь код на входе в прерывание хоть и не такой оптимальный, зато вполне безопасный и не зависит от "причуд" компилятора. smile.gif

На MSP430, кстати, очень маленький пролог - всего 4 регистра, т.ч. получается все достаточно неплохо. В в AVR картина намного печальнее. sad.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 22:57
Рейтинг@Mail.ru


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