Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR XLINK
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
zltigo
При написании загрузчика под 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
IgorKossak
Ради эксперимента попытайтесь увеличить ROMEND и посмотрите результат.
zltigo
Цитата(IgorKossak @ Oct 24 2006, 19:49) *
Ради эксперимента попытайтесь увеличить ROMEND и посмотрите результат.

Естественно пробовал :-(, естественно, если увеличивать, то получается. Причем файл
(при убранном CRC и заполнении) получается много менее 8K. А при оставленном CRC оставшееся
пространство + размер увеличения забит заполнителем.
Вот такой бред.
IgorKossak
Тогда попробуйте в строке генерации crc указать диапазон:
Код
-J2,crc16,,,,1,0=(CODE)ROMSTART-ROMEND

и выкиньте заполнитель.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.