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

RSEG(-z)

Хочу использовать для подпрограм перемещаемые сегменты что б не заморачиваться на размещение самому их по памяти самому и не отвлекаться на случаи перекрытия сегментов. Подскажите как правельно это сделать. Советы типа:"Читай юзергвайд" не пишите, т.к. пишу сюда только в крайнем случае, когда уже ничего не помогает.

 

 

тут пример написанного кода подпрограммы:

 

 

NAME M1E1_add_M2E2

 

RSEG M1E1_add_M2E2

 

M1E1_add_M2E2:

 

NOP

 

END

 

ерор:

Fatal Error[e72]: Segment M1E1_add_M2E2 must be defined in a segment definition option (-Z, -b or -P)

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


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

ерор:

Fatal Error[e72]: Segment M1E1_add_M2E2 must be defined in a segment definition option (-Z, -b or -P)

Вы сегмент-то завели свой собственный, а по каким адресам его размещать, не указали. Вам нужно в линкерном скрипте (я так понял, что речь идет об IAR'е), .xcl файл, указать, в какие адреса этот сегмент помещать. Откройте любой .xcl файл и посмотрите, как там сделано. Сделайте по аналогии. Там буквально в одну строку это делается.

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


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

// ---------------------------------------------------------

// All memory 0 - 0xFFFFF

// ---------------------------------------------------------

// ---------------------------------------------------------

// M1E1_add_M2E2

 

-P(CODE)M1E1_add_M2E2=3100-FFBF,10000-1FFFF

 

// ---------------------------------------------------------

// Code

 

-P(CODE)CODE=3100-FFBF,10000-1FFFF

 

// ---------------------------------------------------------

 

ВРОДЕ ДОБАВИЛ, ТАК ИЛИ НЕТ??

ВЫДАЕТ ОШИБКУ

Wed May 13 15:53:44 2009: Error (col 1): Unknown or ambiguous symbol. main

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


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

ВРОДЕ ДОБАВИЛ, ТАК ИЛИ НЕТ??

ВЫДАЕТ ОШИБКУ

Wed May 13 15:53:44 2009: Error (col 1): Unknown or ambiguous symbol. main

Попробуйте сделать так:

 

-P(CODE)CODE=3100-FFBF,10000-1FFFF

-P(CODE)M1E1_add_M2E2=3100-FFBF,10000-1FFFF

 

Дело в том, что main находится в том же сегменте, вы изначально указали свой сегмент, вот стартап на него и переходит

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


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

сделал, полезли ошибки

Error[e18]: Range error,

Address out of range. Valid range is 0 to 65535 (0xFFFF).

File: K:\IAR Systems\E'Board\Библиотека подпрограмм\asm.s43, Line: 19

Source: CALL M1E1_add_M2E2

 

Where $ = main + 0xA [0x310E]

in module "main" (K:\IAR Systems\E'Board\Библиотека подпрограмм\Debug\Obj\asm.r43),

offset 0xE in segment part 2, segment CODE

What: __XMS430F5438__ [0x10000]

Allowed range: 0x0 - 0xFFFF

Operand: __XMS430F5438__ [0x10000]

in module main (K:\IAR Systems\E'Board\Библиотека подпрограмм\Debug\Obj\asm.r43),

Offset 0x0 in segment part 0, segment M1E1_add_M2E2

Error while running Linker

 

В яре есть возможность объявлять кусок кода, автоматически распологаемого в памяти без кройки линковки?? к примеру как это сделано в фитоновском редакторе?

Изменено пользователем Fynjy86

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


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

В яре есть возможность объявлять кусок кода, автоматически распологаемого в памяти без кройки линковки?? к примеру как это сделано в фитоновском редакторе?

 

Вот пример, как я размещаю сегменты в памяти. Они размещаются один за другим это в MSP серии F2xxx

 

-P(CODE)CODE,ISR_FUNC,DATA16_C,MYSEG=8000-FFBD

 

т.е. размещать разрешено как угодно, главное, чтоб было установлено выравнивание адреса

 

===

#pragma segment="NAME" [align]

 

align - Specifies an alignment for the segment part. The value must be a constant integer expression to the power of two.

 

Description

Use this pragma directive to define a segment name that can be used by the segment operators __segment_begin and __segment_end. All segment declarations for a specific segment must have the same memory type attribute and alignment.

===

 

я это делаю так:

 

#pragma segment="MYSEG" 2

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


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

вроде работает, огромное спасибо всем

 

 

в симуляторе работает, а вот в железе не будет.

дело в том, что прагма создаёт сегмент с адреса 00000h, а не с 3100h, что означает, что сегмент лежит в служебной части памяти.

вопрос остаётся открытым!

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


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

Одно непонятно, а зачем Вам вся эта суета с объявлением сегментов, чем собственно не устраивает сегмент с именем CODE, куда IAR сваливает код по умолчанию?

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


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

в симуляторе работает, а вот в железе не будет.

дело в том, что прагма создаёт сегмент с адреса 00000h, а не с 3100h, что означает, что сегмент лежит в служебной части памяти.

вопрос остаётся открытым!

"Pragma" только объявляет сегмент, а далее компилятор объединяет весь код, определённый под указанным сегментом...

 

#pragma segment="MYSEG" 2

void FUNK_1() @ "MYSEG"

{ ... }

void FUNK_2() @ "MYSEG"

{ ... }

void FUNK_3() @ "MYSEG"

{ ... }

 

В процессе линковки, линковщик размещает данные сегменты согласно указанным в файле с расширением .xcl

Важно знать карту памяти данного МК, чтоб правильно указать границы, как уже приводил пример выше

-P(CODE)CODE,ISR_FUNC,DATA16_C,MYSEG=8000-FFBD

Отсюда видно, что сегмент "MYSEG" размещён в пространстве адресов 0x8000 - 0xFFBD....

Можно сделать размещение более наглядным

-P(CODE)CODE=8000-9000

-P(CODE)ISR_FUNC,DATA16_C=9100-B000

-P(CODE)MYSEG=C000-FFBD

Только в данном случае мы должны быть уверены, что код указанных сегментов вместится в указанные рамки.

 

Для более полного понимания, какие данные размещаются и в каких сегментах воспользуйтесь

EW430_CompilerReference.pdf

 

Segment reference, стр. 241

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


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

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

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

Изменено пользователем Fynjy86

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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