number007cool 发表于 2011-8-31 13:25:08

在IAR中,假如程序存放的起始地址不是0,而是一个值0x1010000,那么xcl文件里面的相关参

以前程序是放在flash的0地址处,xcl文件的配置如下:
//**********************************************************************
// XLINK template command file to be used with the ICCARM C/C++ Compiler
//
// Usage:xlink-f lnkarm<your_object_file(s)>
//                -s <program start label><C/C++ runtime library>
//
// $Revision: 1.3 $
//
//**********************************************************************

//*************************************************************************
// In this file it is assumed that the system has the following
// memory layout:
//
//   Exception vectors RAM or ROM
//   ROMSTART--ROMENDROM (or other non-volatile memory)
//   RAMSTART--RAMENDRAM (or other read/write memory)
//
// -------------
// Code segments - may be placed anywhere in memory.
// -------------
//
//   INTVEC   -- Exception vector table.
//   SWITAB   -- Software interrupt vector table.
//   ICODE      -- Startup (cstartup) and exception code.
//   DIFUNCT    -- Dynamic initialization vectors used by C++.
//   CODE       -- Compiler generated code.
//   CODE_I   -- Compiler generated code declared __ramfunc (executes in RAM)
//   CODE_ID    -- Initializer for CODE_I (ROM).
//
// -------------
// Data segments - may be placed anywhere in memory.
// -------------
//
//   CSTACK   -- The stack used by C/C++ programs (system and user mode).
//   IRQ_STACK-- The stack used by IRQ service routines.
//   SVC_STACK-- The stack used in supervisor mode
//               (Define other exception stacks as needed for
//               FIQ, ABT, UND).
//   HEAP       -- The heap used by malloc and free in C and new and
//               delete in C++.
//   INITTAB    -- Table containing addresses and sizes of segments that
//               need to be initialized at startup (by cstartup).
//   CHECKSUM   -- The linker places checksum byte(s) in this segment,
//               when the -J linker command line option is used.
//   DATA_y   -- Data objects.
//
// Where _y can be one of:
//
//   _AN      -- Holds uninitialized located objects, i.e. objects with
//               an absolute location given by the @ operator or the
//               #pragma location directive. Since these segments
//               contain objects which already have a fixed address,
//               they should not be mentioned in this linker command
//               file.
//   _C         -- Constants (ROM).
//   _I         -- Initialized data (RAM).
//   _ID      -- The original content of _I (copied to _I by cstartup) (ROM).
//   _N         -- Uninitialized data (RAM).
//   _Z         -- Zero initialized data (RAM).
//
// Note:Be sure to use end values for the defined address ranges.
//      Otherwise, the linker may allocate space outside the
//      intended memory range.
//*************************************************************************

//************************************************
// Inform the linker about the CPU family used.
//************************************************

-carm

//*************************************************************************
// Segment placement - General information
//
// All numbers in the segment placement command lines below are interpreted
// as hexadecimal unless they are immediately preceded by a '.', which
// denotes decimal notation.
//
// When specifying the segment placement using the -P instead of the -Z
// option, the linker is free to split each segment into its segment parts
// and randomly place these parts within the given ranges in order to
// achieve a more efficient memory usage. One disadvantage, however, is
// that it is not possible to find the start or end address (using
// the assembler operators .sfb./.sfe.) of a segment which has been split
// and reformed.
//
// When generating an output file which is to be used for programming
// external ROM/Flash devices, the -M linker option is very useful
// (see xlink.pdf for details).
//*************************************************************************


//*************************************************************************
// Read-only segments mapped to ROM.
//*************************************************************************

//************************************************
// 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.
//************************************************

-Z(CODE)INTVEC=0-3F

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

-Z(CODE)ICODE,DIFUNCT=0-30000
-Z(CODE)SWITAB=0-30000

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

-Z(CODE)CODE=0-30000

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

-Z(CONST)CODE_ID=0-30000

//************************************************
// Various constants and initializers.
//************************************************

-Z(CONST)INITTAB,DATA_C,DATA_ID=0-30000
-Z(CONST)CHECKSUM=0-30000

//*************************************************************************
// Read/write segments mapped to RAM.
//*************************************************************************

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

-Z(DATA)DATA_I,DATA_Z,DATA_N=0-30000

//************************************************
// __ramfunc code copied to and executed from RAM.
//************************************************

-Z(DATA)CODE_I=0-30000

//************************************************
// 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.
//*************************************************************************

//-Z(DATA)CSTACK+2000=17000-1FFFFF
//-Z(DATA)IRQ_STACK+100=17000-1FFFFF
-Z(DATA)HEAP+8000=0-30000

//**********************************************************************
// Output user defined segments
//**********************************************************************



//*************************************************************************
// ELF/DWARF support.
//
// Uncomment the line "-Felf" below to generate ELF/DWARF output.
// Available format specifiers are:
//
//   "-yn": Suppress DWARF debug output
//   "-yp": Multiple ELF program sections
//   "-yas": Format suitable for debuggers from ARM Ltd (also sets -p flag)
//
// "-Felf" and the format specifiers can also be supplied directly as
// command line options, or selected from the Xlink Output tab in the
// IAR Embedded Workbench.
//*************************************************************************

// -Felf

程序存放在以地址0x1010000开始的地方,那么怎样配置xcl文件才能够与这么一个地址相匹配?
应该对上面的xcl文件做一个怎样的修改?

yuhui 发表于 2011-8-31 15:22:12

把所有的0-30000改成1010000-xxxxxxxx,-Z(CODE)INTVEC=0-3F 改成 -Z(CODE)INTVEC=1010000-101003F

number007cool 发表于 2011-8-31 16:13:37

恢复【1楼】 yuhui

------------------------------------------------------------
我是这样做的,我在弄IAP。但是程序跳转到0x1010000后总是会跑飞掉。
页: [1]
查看完整版本: 在IAR中,假如程序存放的起始地址不是0,而是一个值0x1010000,那么xcl文件里面的相关参