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

 
 
> VisualDSP++ 4.0 и Blackfin - оптимизация кода, Странно работает оптимизация
DPL
сообщение Feb 26 2006, 07:32
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 88
Регистрация: 15-10-04
Из: Новочеркасск
Пользователь №: 886



Здравствуйте.
Осваивая Blackfin (532) и VisualDSP, столкнулся со странной проблемой. При отключенной оптимизации кода программа работает именно так, как ожидается. При включенной оптимизации (100% Speed) наблюдается частичная неработоспособность. Программа написана на С.
В результате анализа работы при помощи симулятора выяснилось, что неправильно работает подпрограмма обработки прерываний, в которой имеется несколько вложенных вызовов подпрограмм. В одну из них параметр передается в регистре R0. Из нее выполняется вызов другой п/п, которая к этому параметру никакого отношения не имеет. Она искажает R0, а затем искаженное значение используется в вызывающей программе.
На первый взгляд кажется, что неправильно работает оптимизатор: не учитывает использование регистров во вложенных подпрограммах. Но, возможно, я чего-то недочитал и есть способ вразумить оптимизатор?
Не знает ли кто способ решения описанной проблемы? Отключать оптимизацию не хочется, во многих местах от нее существенная польза.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
fontp
сообщение Feb 27 2006, 09:48
Сообщение #2


Эксперт
*****

Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183



Цитата(DPL @ Feb 26 2006, 10:32) *
Здравствуйте.
Осваивая Blackfin (532) и VisualDSP, столкнулся со странной проблемой. При отключенной оптимизации кода программа работает именно так, как ожидается. При включенной оптимизации (100% Speed) наблюдается частичная неработоспособность. Программа написана на С.
В результате анализа работы при помощи симулятора выяснилось, что неправильно работает подпрограмма обработки прерываний, в которой имеется несколько вложенных вызовов подпрограмм. В одну из них параметр передается в регистре R0. Из нее выполняется вызов другой п/п, которая к этому параметру никакого отношения не имеет. Она искажает R0, а затем искаженное значение используется в вызывающей программе.
На первый взгляд кажется, что неправильно работает оптимизатор: не учитывает использование регистров во вложенных подпрограммах. Но, возможно, я чего-то недочитал и есть способ вразумить оптимизатор?
Не знает ли кто способ решения описанной проблемы? Отключать оптимизацию не хочется, во многих местах от нее существенная польза.


Оптимизация зависит от той информации, которую оптимизатор считает известной. При работе с обработчиками прерываний и вообще с аппаратными ресурсами оптимизатор обычно отбрасывает код, относящийся к обработке значений в регистрах, поскольку он полагает, что всё что не модифицируется программой - никогда не модифицируется вообще. Чтобы запретить ему творить чудеса такие переменные должны использоваться с модификатором volatile. Volatile - это прямое указание компилятору не оптимизировать переменную. Даже если Вы считаете, что компилятор неправильно интерпретирует переменную и volatile не нужно, не нужно бороться с компилятором, этот модификатор всегда помогает преодолеть эти ошибки оптимизатора.

Ещё один источник ошибок - ассемблерные вставки, особенно находящиеся в инлайн функциях. Хотя по соглашению о передаче параметров на входе в процедуру находятся в регистрах данных (R0, R1, ...) но полагаться на это нельзя, а нужно использовать точные спецификации с формальными параметрами asm - %0, %1, .... Иначе включение оптимизации сразу делает код неработоспособным.
Режим автоматическтого inline при оптимизации тоже может творить чудеса. Я до конца так и не понял, что именно строго говоря он инлайнит автоматически. Процедуры с циклами типа FIR он инлайнит точно, в других случаях когда есть вложения инлайновых функций или много логических операторов он этого не делает, по своим соображениям, даже если явно указано inline

Кстати мне показалось, что оптимизатор в VDSP4 ведёт себя значительно более агрессивно чем в VDSP3.5, впрочем без особого эффекта на быстродействие, но иногда работающие в 3.5 с включенным оптимизатором программы работают в 4.0 только без оптимизатора

Сообщение отредактировал fontp - Feb 27 2006, 09:53
Go to the top of the page
 
+Quote Post



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

 


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


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