При этом именно приблизился, поскольку, как видно из 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
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
// 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