Перейти к содержанию
    

VisualDSP 4.0 компилятор и оптимизация.

Обнаружил интересную вещь. К примеру, пишу код, инициализирующий какое-нить периферийное устройство или DMA. Там регистры, относящиеся к устройству, лежат рядышком. Из чего, вроде бы, следует, что компилятор при последовательных обращениях должен оптимизировать код - не загружать при каждом обращении полный адрес. Т.е. однажды загрузил базовый адрес и ко всем остальным переменным (регистрам) обращаться со смещением. Экономия кода (да и по скорости выигрыш), как грицца, кардинальный.

 

На деле выходит не так: допустим, есть пять присваиваний значений в регистры MDMA, и все пять раз при каждом присваивании грузится полный адрес, т.е. дополнительные две команды каждая по 32 бита. И так, и сяк, не дается - все равно генерит этот громздкий код. (Оптимизация включена максимальная по скорости.)

 

Ладно, думаю, обману. Создал тип структуры, соответствующей фрейму памяти, где эти регистры расположены. Далее в коде создаю указатель на такую структуру, присваиваю ему насильно базовый адрес блока регистров. Ну, думаю, теперь никуда не денется - явно код прямо написан с загрузкой адреса в указатель и обращением к членам структуры (со смещением, то есть). Но не тут-то было. Код после компиляции ровно такой же: компилятор "не поленился" вычислить абсолютные адреса в каждом случае и честно их прописывать в укзатель с последующим обращением непосредственно по адресу назначения.

 

Вот, думаю, засада! Что же это за оптимизирующий компилятор такой?! Тупит жестоко... Но чувствую, что что-то здесь не то - в первом случае еще можно списать на тупость, но во втором-то он намеренно делает эту "деоптимизацию". Взял попробовал создать объект этой структуры в обчной памяти - все ништяк, оптимизирует, как положено: базовый адрес и далее вперед по смещениям.

 

А вот когда лезешь в область MMRs, не канает. Ведь просек же и адрес, и код сгенерил соответствующий.

 

Вопрос: я чего-то не понимаю, может где-то сказано, что надо всегда грузить в регистр-указатель полный адрес и только потом обращаться? Не заметил никаких ограничений на способ доступа к MMRs. Вполне понимаю, что там не все так просто, что из-за конвейера там всякие побочные эффекты могут лезть, что надо при этом всякие csync'и и ssync'и юзать. Но про способ адресации ничего не нашел. Объясните непонятку, кто знает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит излишне перестраховываются или тупят, потому что в примерах на asm к киту обращение к регистрам MMR довольно вольное и без всяких ограничений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самое странное, что у них и в экзамплах на ассемблере MMR адресуются по-разному! в одном исходнике сплошняком относительная адресация, в другом везде только абсолютная. И еще - почему-то блекфиновский ассемблер не дает использовать относительную адресацию, если смещение написано не явно - цифрой, а вычисляется OFFSETом, может я чего не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит излишне перестраховываются или тупят, потому что в примерах на asm к киту обращение к регистрам MMR довольно вольное и без всяких ограничений.

Дык вот и я думаю, что какая разница для регистра, как получен адрес - путем полной загрузки литералов или путем модификации указателя. Но ведь факт! А к обычным объектам все нормально, никаких проблем. Отслеживает именно обращения в ту область памяти. Можно, конечно, обмануть - сделать функцию в другом файле и передавать туда указатель на структуру и параметры. Тут уж он никак не сообразит. :) Но гложет сомнение, что что-то не понимаю, что какой-то нюанс есть. В доке не нашел инчего, вот и спрашиваю.

 

А то, что на асме у них так и так попадается, так может это и ошибка - люди же писали. А примеры - на то и примеры, что ответсвенности за них никакой нет, поэтому особо никто там не приглядывался, работает как-нибудь, и ладно.

 

Может, думаю, в саппорт написать. Только если он у них там весь индусский (как у Альтеры), то скорее всего будет тухло. То ли дело у IAR'а саппорт... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А то, что на асме у них так и так попадается, так может это и ошибка - люди же писали. А примеры - на то и примеры, что ответсвенности за них никакой нет, поэтому особо никто там не приглядывался, работает как-нибудь, и ладно.

В коротких примерах Hardware Reference тоже такое применяют - это уже документ. Так что вероятнее всего их заморочка.

 

В поддержку я раз обращался на предмет глюка компилятора (после очередного апдайта стал генерился принципиально неправильный код), несмотря на нелициз.использование, этот их вопрос я проигнорировал, все приняли, перепросили полный пример, к следующему разу все исправили. Посмотрим как сейчас...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самое странное, что у них и в экзамплах на ассемблере MMR адресуются по-разному! в одном исходнике сплошняком относительная адресация, в другом везде только абсолютная. И еще - почему-то блекфиновский ассемблер не дает  использовать относительную адресацию, если смещение написано не явно - цифрой, а вычисляется OFFSETом, может я чего не так делаю?

Если я правильно понял то можно. Вот, например, пример программы в которой я проверял своё железо и который это использует. Правда помню что были какие-то заморочки, но я это успешно решил (давно это было почти год назад).

L.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...