dxp 56 13 октября, 2005 Опубликовано 13 октября, 2005 · Жалоба Обнаружил интересную вещь. К примеру, пишу код, инициализирующий какое-нить периферийное устройство или DMA. Там регистры, относящиеся к устройству, лежат рядышком. Из чего, вроде бы, следует, что компилятор при последовательных обращениях должен оптимизировать код - не загружать при каждом обращении полный адрес. Т.е. однажды загрузил базовый адрес и ко всем остальным переменным (регистрам) обращаться со смещением. Экономия кода (да и по скорости выигрыш), как грицца, кардинальный. На деле выходит не так: допустим, есть пять присваиваний значений в регистры MDMA, и все пять раз при каждом присваивании грузится полный адрес, т.е. дополнительные две команды каждая по 32 бита. И так, и сяк, не дается - все равно генерит этот громздкий код. (Оптимизация включена максимальная по скорости.) Ладно, думаю, обману. Создал тип структуры, соответствующей фрейму памяти, где эти регистры расположены. Далее в коде создаю указатель на такую структуру, присваиваю ему насильно базовый адрес блока регистров. Ну, думаю, теперь никуда не денется - явно код прямо написан с загрузкой адреса в указатель и обращением к членам структуры (со смещением, то есть). Но не тут-то было. Код после компиляции ровно такой же: компилятор "не поленился" вычислить абсолютные адреса в каждом случае и честно их прописывать в укзатель с последующим обращением непосредственно по адресу назначения. Вот, думаю, засада! Что же это за оптимизирующий компилятор такой?! Тупит жестоко... Но чувствую, что что-то здесь не то - в первом случае еще можно списать на тупость, но во втором-то он намеренно делает эту "деоптимизацию". Взял попробовал создать объект этой структуры в обчной памяти - все ништяк, оптимизирует, как положено: базовый адрес и далее вперед по смещениям. А вот когда лезешь в область MMRs, не канает. Ведь просек же и адрес, и код сгенерил соответствующий. Вопрос: я чего-то не понимаю, может где-то сказано, что надо всегда грузить в регистр-указатель полный адрес и только потом обращаться? Не заметил никаких ограничений на способ доступа к MMRs. Вполне понимаю, что там не все так просто, что из-за конвейера там всякие побочные эффекты могут лезть, что надо при этом всякие csync'и и ssync'и юзать. Но про способ адресации ничего не нашел. Объясните непонятку, кто знает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmf 0 13 октября, 2005 Опубликовано 13 октября, 2005 · Жалоба Значит излишне перестраховываются или тупят, потому что в примерах на asm к киту обращение к регистрам MMR довольно вольное и без всяких ограничений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pathfinder 0 13 октября, 2005 Опубликовано 13 октября, 2005 · Жалоба Самое странное, что у них и в экзамплах на ассемблере MMR адресуются по-разному! в одном исходнике сплошняком относительная адресация, в другом везде только абсолютная. И еще - почему-то блекфиновский ассемблер не дает использовать относительную адресацию, если смещение написано не явно - цифрой, а вычисляется OFFSETом, может я чего не так делаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 56 14 октября, 2005 Опубликовано 14 октября, 2005 · Жалоба Значит излишне перестраховываются или тупят, потому что в примерах на asm к киту обращение к регистрам MMR довольно вольное и без всяких ограничений. <{POST_SNAPBACK}> Дык вот и я думаю, что какая разница для регистра, как получен адрес - путем полной загрузки литералов или путем модификации указателя. Но ведь факт! А к обычным объектам все нормально, никаких проблем. Отслеживает именно обращения в ту область памяти. Можно, конечно, обмануть - сделать функцию в другом файле и передавать туда указатель на структуру и параметры. Тут уж он никак не сообразит. :) Но гложет сомнение, что что-то не понимаю, что какой-то нюанс есть. В доке не нашел инчего, вот и спрашиваю. А то, что на асме у них так и так попадается, так может это и ошибка - люди же писали. А примеры - на то и примеры, что ответсвенности за них никакой нет, поэтому особо никто там не приглядывался, работает как-нибудь, и ладно. Может, думаю, в саппорт написать. Только если он у них там весь индусский (как у Альтеры), то скорее всего будет тухло. То ли дело у IAR'а саппорт... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmf 0 14 октября, 2005 Опубликовано 14 октября, 2005 · Жалоба А то, что на асме у них так и так попадается, так может это и ошибка - люди же писали. А примеры - на то и примеры, что ответсвенности за них никакой нет, поэтому особо никто там не приглядывался, работает как-нибудь, и ладно. В коротких примерах Hardware Reference тоже такое применяют - это уже документ. Так что вероятнее всего их заморочка. В поддержку я раз обращался на предмет глюка компилятора (после очередного апдайта стал генерился принципиально неправильный код), несмотря на нелициз.использование, этот их вопрос я проигнорировал, все приняли, перепросили полный пример, к следующему разу все исправили. Посмотрим как сейчас... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dinam 1 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Самое странное, что у них и в экзамплах на ассемблере MMR адресуются по-разному! в одном исходнике сплошняком относительная адресация, в другом везде только абсолютная. И еще - почему-то блекфиновский ассемблер не дает использовать относительную адресацию, если смещение написано не явно - цифрой, а вычисляется OFFSETом, может я чего не так делаю? <{POST_SNAPBACK}> Если я правильно понял то можно. Вот, например, пример программы в которой я проверял своё железо и который это использует. Правда помню что были какие-то заморочки, но я это успешно решил (давно это было почти год назад). L.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться