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

 
 
> 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
shreck
сообщение Jan 23 2007, 14:32
Сообщение #5


Местный
***

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



Вот теперь все стало на свои места. Спасибо за ответы.

Кстати, насчет пролога:
Цитата(dxp @ Jan 23 2007, 18:11) *
На MSP430, кстати, очень маленький пролог - всего 4 регистра, т.ч. получается все достаточно неплохо...

как правило я это и наблюдаю, но были случаи когда сохранялись 7 регистров.

Да и еще вопросик. Если прерывание содержит оператор return где-нибудь в середине тела обработчика прерывания, например в инструкции if, то компилятор генерит предупреждение "Warning[Ta020]: Register SP updated while data is placed on the stack, code will probably not execute as expected
". Как бы, то есть, где бы правильно его подавить?
Если тело обработчика линейно- есть один опрератор return в конце- то предупреждения нет. По-видимому, предупреждение подавляется в коде ос (где-то я это видел).
Go to the top of the page
 
+Quote Post



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

 


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


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