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

IAR XLINK

При написании загрузчика под LPC2000 приблизился к отведенной ему границе в 8K

При этом именно приблизился, поскольку, как видно из MAP файла остается еще 0x156 байт в заполняющем сегменте. Содержимое бинарника соответствует листингу :-) - свободное место есть.

Если убрать CHECKSUM, то бинарник естественно получается менее 8K на 0x154 байта.

Segment     Space     Start     End     Size     Kind     Align 
INTVEC         00000000 - 0000004F     50     Common     2 
ICODE         00000050 - 000001E3     194     Relative     2 
DIFUNCT         000001E4         Relative     2 
CODE         000001E4 - 000019AB     17C8     Relative     2 
INITTAB         000019AC - 000019B7     C     Relative     2 
DATA_ID         000019B8         Predefined     0 
DATA_C         000019B8 - 00001EA7     4F0     Relative     2 
?FILL1         00001EA8 - 00001FFD     156     Relative     0 
CHECKSUM         00001FFE - 00001FFF     2     Relative     0

Однако, если теперь добавить хоть один байт, линекр сразу вылетает с воплем:

Error[e16]: Segment CHECKSUM (size: 0x2 align: 0) is too long for segment definition. At least 0x2 more bytes....

Линкер свеженький:

IAR Universal Linker V4.60C/386

 

У кого есть мысли, что это такое????

 

XCL файл:

//***************************************************************************
// XLINK command file template for EWARM/ICCARM
//***************************************************************************

-carm

//***************************************************************************
// Read-only segments mapped to ROM.
//***************************************************************************
// Boootloader use 8K.
-DROMSTART=0
-DROMEND=1FFF

//***************************************************************************
// Address range for reset and exception
// vectors (INTVEC).
// The vector area is 32 bytes, 
// an additional 32 bytes is allocated for the
// constant table used by ldr PC in cstartup.s79.
//***************************************************************************

// 3F-> Changed to 4F for 4 external entry points
-Z(CODE)INTVEC=0-4F

//***************************************************************************
// Startup code and exception routines (ICODE).
//***************************************************************************

-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
-Z(CODE)SWITAB=ROMSTART-ROMEND

//***************************************************************************
// Code segments may be placed anywhere.
//***************************************************************************

-Z(CODE)CODE=ROMSTART-ROMEND

//***************************************************************************
// Original ROM location for __ramfunc code copied
// to and executed from RAM.
//***************************************************************************

-Z(CONST)CODE_ID=ROMSTART-ROMEND

//***************************************************************************
// Various constants and initializers.
//***************************************************************************
-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
// For CheckSUMM
-Z(CODE)CHECKSUM#ROMSTART-ROMEND        // to end of ROM block

//***************************************************************************
// Read/write segments mapped to RAM.
//***************************************************************************
-DRAMSTART=40000000
-DRAMEND=40001FFF         //  Use 8K for compability

//***************************************************************************
// Data segments.
//***************************************************************************

-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND

//***************************************************************************
// __ramfunc code copied to and executed from RAM.
//***************************************************************************
-Z(DATA)CODE_I=RAMSTART-RAMEND

//***************************************************************************
// ICCARM produces code for __ramfunc functions in
// CODE_I segments. The -Q XLINK command line
// option redirects XLINK to emit the code in the
// CODE_ID segment instead, but to keep symbol and
// debug information associated with the CODE_I
// segment, where the code will execute.
//***************************************************************************
//
-QCODE_I=CODE_ID

//***************************************************************************
// Stack and heap segments.
//***************************************************************************
-D_CSTACK_SIZE=4         // Dummy System/User Stack Size (Not Used!)
-D_SVC_STACK_SIZE=200     // Supervisor Mode (Main Work Mode)
-D_IRQ_STACK_SIZE=100
-D_FIR_STACK_SIZE=20            

-D_XXX_STACK_SIZE=20    // 32bytes Shared Stack for Abort/Undefined Instruction    and IAP Buffer    -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND      // System/User
-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND            // Supervisor
-Z(DATA)FIR_STACK+_FIR_STACK_SIZE=RAMSTART-RAMEND     // FIR
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND    // IRQ
-Z(DATA)XXX_STACK+_XXX_STACK_SIZE=RAMEND            // Shared - Abort/Undefined and IAP
                                                                                                  //buffer

// Calculate CRC ------------------------------------------------------------
-H75
-J2,crc16,,,,1,0

// Additional HEX File generation...-----------------------------------------
-Ointel-extended,(CODE)=.hex

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


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

Ради эксперимента попытайтесь увеличить ROMEND и посмотрите результат.

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


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

Ради эксперимента попытайтесь увеличить ROMEND и посмотрите результат.

Естественно пробовал :-(, естественно, если увеличивать, то получается. Причем файл

(при убранном CRC и заполнении) получается много менее 8K. А при оставленном CRC оставшееся

пространство + размер увеличения забит заполнителем.

Вот такой бред.

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


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

Тогда попробуйте в строке генерации crc указать диапазон:

-J2,crc16,,,,1,0=(CODE)ROMSTART-ROMEND

и выкиньте заполнитель.

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


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

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

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

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

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

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

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

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

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

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