Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Страницы: 1, 2
SM
Сделайте еще одну секцию с кодом, с другим именем, и вынесете в нее часть кода. На сколько я знаю, нельзя одну секцию разделить на два диапазона адресов, должно быть две разные секции.
d7d1cd
Цитата(SM @ Jan 6 2014, 19:30) *
Сделайте еще одну секцию с кодом, с другим именем, и вынесете в нее часть кода. На сколько я знаю, нельзя одну секцию разделить на два диапазона адресов, должно быть две разные секции.

Я понимаю, что можно так сделать. Но ведь хочется эту работу возложить на линкер. Тем более было тут сообщение уважаемого rezidenta:
Цитата
Вам просто нужно для сегмента CODE указать несколько диапазонов адресов, перечислив их через запятую. Вот там я пояснял как правильно отредактировать XCL-файл.
SM
Цитата(d7d1cd @ Jan 6 2014, 19:46) *
Я понимаю, что можно так сделать. Но ведь хочется эту работу возложить на линкер.


Вообще, обычно линкеры не могут сами разбивать секцию на части, потому что не знают, как это корректно делать, в каком месте. Возможно, конечно, у IAR есть подсекции функций, или еще какие то механизмы для указания линкеру, как ему можно разбить секцию, но я этих механизмов в рамках IAR-а не знаю. В любом случае, требуются какие то директивы/указания, в каком месте секции можно разрывать - линкер сам этого не знает, и поэтому ругается.
d7d1cd
Цитата(SM @ Jan 6 2014, 20:57) *
Вообще, обычно линкеры не могут сами разбивать секцию на части, потому что не знают, как это корректно делать, в каком месте. Возможно, конечно, у IAR есть подсекции функций, или еще какие то механизмы для указания линкеру, как ему можно разбить секцию, но я этих механизмов в рамках IAR-а не знаю. В любом случае, требуются какие то директивы/указания, в каком месте секции можно разрывать - линкер сам этого не знает, и поэтому ругается.

Тогда для чего придуманы флаги для директивы RSEG (REORDER, SORT)? Про NOROOT знаю для чего: если данный код не используется, то линкер не вставляет его в готовую прошивку.
SM
Цитата(d7d1cd @ Jan 6 2014, 21:16) *
Тогда для чего придуманы флаги для директивы RSEG (REORDER, SORT)? Про NOROOT знаю для чего: если данный код не используется, то линкер не вставляет его в готовую прошивку.


Я так подозреваю, что все это касается частей одной секции, располагающейся в разных объектных модулях - потому что куски одноименной секции точно можно перемешивать в порядке размещения, если они были скомпилированы из разных отдельных исходных файлов. Но именно подозреваю. Да и NOROOT тоже - о неиспользуемости кода линкер может судить только по одному принципу - что в модуле нет ни точки входа, и ни одного использованного PUBLIC-символа. Но, именно, в секции модуля, которая внутри каждого модуля едина.

PS повторюсь, я не слышал, чтобы у IAR был механизм подсекций для процедур/функций - именно поэтому, вроде, на сколько я помню, секция внутри каждого модуля едина (для того и придумана, чтобы код/данные можно было прерывать, перемежать, в т.ч. в макросах, а потом все стало едиными цельными и гарантировано последовательными кусками), а вот куски секции, собираемые из разных модулей, линкер может менять местами, сортировать, выкидывать, и т.д.
d7d1cd
Итак, у меня снова возник вопрос по системе программирования.
Как известно, чтобы разместить код или переменную в определенной области памяти, необходимо в настройках линкера или в XCL-файле определить сегмент. А возможно ли это сделать прямо в файле с программой?
rezident
Цитата(d7d1cd @ Feb 27 2014, 20:30) *
А возможно ли это сделать прямо в файле с программой?

Сделать что "это"? Переменные вы и так обязаны объявлять в своей программе.
d7d1cd
Цитата(rezident @ Feb 27 2014, 19:38) *
Сделать что "это"? Переменные вы и так обязаны объявлять в своей программе.

Я пишу на ассемблере. Чтобы разместить код функции по определенному адресу, я пишу:
Код
RSEG    MySegment
Mul16u16uTo32u:                            
        ...
        RET

А в файле XCL или в опциях линкера и прописываю:
Код
-Z(CODE)MySegment=1200-1300

Так вот: нельзя ли обойтись без файла XCL и опций линкера и описание сегмента расположить в файле, где расположен код функции.
_Артём_
Цитата(d7d1cd @ Feb 27 2014, 20:09) *
[code]RSEG MySegment
Так вот: нельзя ли обойтись без файла XCL и опций линкера и описание сегмента расположить в файле, где расположен код функции.

Может и можно - посмотрите в документации есть ли у IAR директива ASEG или аналогичная.
d7d1cd
Цитата(_Артём_ @ Feb 27 2014, 20:54) *
Может и можно - посмотрите в документации есть ли у IAR директива ASEG или аналогичная.

ASEG есть. И ASEGN есть. Какую директиву использовать? Не особо я силен в англицком. Подскажите в чем отличие этих директив друг от друга и от директивы RSEG? Вот их описание в документации:
CODE
Beginning an absolute segment
Use ASEG to set the absolute mode of assembly, which is the default at the beginning of
a module.
If the parameter is omitted, the start address of the first segment is 0, and subsequent
segments continue after the last address of the previous segment.
Note: If a move of an immediate value to an absolute address, for example
mov #0x1234, 0x300
is made in a relocatable or absolute segment, the offset is calculated as if the code begun
at address 0x0000. The assembler does not take into account the placement of the
segment.

Beginning a named absolute segment
Use ASEGN to start a named absolute segment located at the address address.
This directive has the advantage of allowing you to specify the memory type of the
segment.

Beginning a relocatable segment
Use RSEG to start a new segment. The assembler maintains separate location counters
(initially set to zero) for all segments, which makes it possible to switch segments and
mode anytime without having to save the current program location counter.
Up to 65536 unique, relocatable segments can be defined in a single module.

Beginning a common segment
Use COMMON to place data in memory at the same location as COMMON segments from
other modules that have the same name. In other words, all
COMMON segments of the
same name start at the same location in memory and overlay each other.
Obviously, the
COMMON segment type should not be used for overlaid executable code.
A typical application would be when you want several different routines to share a
reusable, common area of memory for data.
It can be practical to have the interrupt vector table in a
COMMON segment, thereby
allowing access from several routines.
The final size of the
COMMON segment is determined by the size of largest occurrence of
this segment. The location in memory is determined by the XLINK
-Z command; see
the IAR Linker and Library Tools Reference Guide.
Use the
align parameter in any of the above directives to align the segment start
address.
_Артём_
Цитата(d7d1cd @ Feb 27 2014, 20:56) *
ASEG есть точно. Как ей правильно пользоваться?

Ну вы спросили - вы же msp программируете, у меня и компилятора под них нет.
В AVR так(для примера):
Код
ASEG INTVEC
ORG 0h

Для msp наверное что-то похожее, подробнее смотрите в Assembler Reference.
P.S. Cо скриптом как-то правильнее...
d7d1cd
Вроде разобрался как использовать директиву ASEG:
Код
ASEG     0x1240; Указываю для функции Proc адрес начала 0х1240
Proc:
         CLR         R12
         CALL        #Proc2
         MOV         R14, R12
         RET

Все вроде хорошо, но в XCL файле я мог указать диапазон адресов для сегмента. А здесь так видимо нельзя сделать. Или я не прав?

P.S. Со скриптом - это с использованием XCL файла и директивы RSEG?
d7d1cd
При создании проекта на ассемблере я вижу, что есть подключенный файл multiplier.xcl. Я понимаю, что он нужен для использования аппаратного умножителя. Вопрос: как это осуществить?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.