529897 Fri Feb 11 2005 01:29, Alex Mogilnikov wrote to Andy Mozzhevilov:
AM>> подобного pода ошибки могyт пpиводить к весьма непpедсказyемым AM>> эффектам, по типy ошибок pаботы с yказателями и индексами массивов.
AM> По сути все верно, согласен. Hо мне просто кажется, ты AM> преувеличиваешь сложность. Вся "забота" программиста свелась к тому, что AM> при входе в функцию, работающую с объектами какого-то банка, вызывалось AM> set_bank(n);
Это не сложно по сути, но это легко пропустить. То есть взять и забыть. Потом, кто сказал что только при входе в функцию. А если в функции есть обращение к глобальным переменным, расположенным в разных банках?
AM> . И чуть сложней в обработчике прерывания - там текущий банк AM> сохранялся и восстанавливался при выходе. Все. Конечно, была бы AM> возможность - предпочли бы полностью линейную память, но раз уж AM> получилось несколько банков - тоже вполне жить можно.
Мне в одном проекте на DS80C320 требовалось обеспечить 2 типа доступа к памяти, быстрый, 0 ws, и медленный - с несколькими ws для обрашения к периферии (поскольку там нужно было выдерживать определенную длительность cs wr rd сигналов), а при работе с ОЗУ в xdata нужно было работать быстрее, поскольку часто происходит копирование буферов. Рулится этим в DS в одом из управляющих регистров. Я написал 2 макроса SET_FAST и SET_SLOW. В принципе ситуация похожая. Hужно руками переключать, зная где. Спустся 2-3 года при поддержке этого проекта я нашел 2 места, где я забыл включить SET_SLOW. Оно работало, но видимо не всегда и где-то на грани. Так что нафиг мне эти полуручные методы.
AM>>> Я так понимаю, раз указывая в объявлении, значит уже не AM>>> автоматически. :)
AM>> Хоpошо, полyавтоматически. Объявляется пpогpаммистом, все, что далее - AM>> забота компилятоpа/линкеpа.
AM> Дык, как ты себе это представляешь? Чтобы линкер для _любой_ секции AM> автоматом генерил символы begin и end? Просто на всякий случай?
Да нормальныйе линкеры и так их генерят, возможно только не совсем в таком виде. Это же ему не сложно. Вот например, для MB90 в startup.asm используется такой код:
; sections to be cleared .SECTION DATA, DATA, ALIGN=2 ; zero clear area .SECTION DIRDATA, DIR, ALIGN=2 ; zero clear direct .SECTION LIBDATA, DATA, ALIGN=2 ; zero clear lib area
.SECTION DCLEAR, CONST, ALIGN=2 ; zero clear table ; Address Bank Size .DATA.H DATA, BNKSEC DATA, SIZEOF(DATA ) .DATA.H DIRDATA, BNKSEC DIRDATA, SIZEOF(DIRDATA) .DATA.H LIBDATA, BNKSEC LIBDATA, SIZEOF(LIBDATA)
BNKSEC и SIZEOF - известны на этапе линковки проекта, линкер их подставляет.
Для IAR ARM (но во всех пакетах IAR механизмы одинаковы):
ldr r0,=SFB(DIFUNCT) ldr r1,=SFE(DIFUNCT)
SFE - адрес конца секции с именем таким-то. SBE - адрес начала секции
AM> для того чтобы избавить программиста от прописывания их с линкерном AM> скрипте (если они вдруг ему действительно потребуются)? ИМХО это не такая AM> трудоемкая работа...
Единственное и действительно необходимое использование информации о адресах и размере секций я вижу лишь в стартапе, где нужно инициализировать систему, копировать инициализированные переменные из ROM в RAM, чистить память, для этого нужно знать адреса и размеры соответствующих секций. Линкеру не сложно предоставлять эти адреса, нужно лишь позаботиться о соответствующих механизмах подстановки этих адресов в нужное место объектником (см. примеры выше). Другие способы, например в виде последовательности указания объектником применяются лишь от безысходности, из-за отсутствия нормальных механизмов. Это больше напоминает одевание штанов через голову и используется только на свой страх и риск. Я от таких способов держусь подальше, но как всегда - на вкус и цвет...