Цитата(Mecon @ Aug 30 2006, 13:13)

Да тут вы правы. Слишком большой код генерится. Мало того, сейчас снова начали обнаруживаться странности при заливке: решил написать переключение на основной кварц... После этого, брейкпоинты снова перестали отлавливаться, при чём даже до входа в функцию переключения на основной кварц. Одним словом - шаманство. Сейчас решил поставить IAR - попробовать - может с ним будет меньше проблем.
Руслан вы сказали, что работаете в IAR с at91rm9200. Помогите мне разобраться: как настроить среду так, чтобы программу можно было заливать в SRAM, а то у меня что то не получается: в Project->Options->Linker настроил собственный linker command file. SRAM поделил на две части: под RAM отвёл адреса 200000-201FFF, под ROM - адреса 202000-203FFF. Тем не менее после сохранения файла настройки для ROM оказываются прежними - как по умолчанию. А при заходе в отладку точка входа располагается с нулевого адреса. Что я делаю не так?
xcl
Код
//*************************************************************************
// XLINK command file template for EWARM/ICCARM
//
// Usage: xlink -f lnkarm <your_object_file(s)>
// -s <program start label> <C/C++ runtime library>
//
// $Revision: 1.2 $
//*************************************************************************
// The flash loader is loaded into the 2M external RAM avaiable on the
-DMEMSTART=0x00000000
-DMEMEND=0x000003FFF
//*************************************************************************
// In this file it is assumed that the system has the following
// memory layout:
//
// Exception vectors [0x000000--0x00001F] RAM or ROM
// ROMSTART--ROMEND [0x008000--0x0FFFFF] ROM (or other non-volatile memory)
// RAMSTART--RAMEND [0x100000--0x7FFFFF] RAM (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.
//*************************************************************************
-DROMSTART=MEMSTART
-DROMEND=MEMEND
//************************************************
// 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=MEMSTART:+40
//************************************************
// 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
-Z(CONST)CHECKSUM=ROMSTART-ROMEND
//*************************************************************************
// Read/write segments mapped to RAM.
//*************************************************************************
-DRAMSTART=(MEMSTART+40)
-DRAMEND=MEMEND
//************************************************
// 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=500
-D_SVC_STACK_SIZE=100
-D_IRQ_STACK_SIZE=100
-D_HEAP_SIZE=500
-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
// -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE,HEAP+_HEAP_SIZE=RAMSTART-RAMEND
-Z(NEAR)BUF_START=RAMSTART-RAMEND
-Z(NEAR)BUF_END=RAMEND
//*************************************************************************
// 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
mac
Код
execUserPreload()
{
setup();
// init_PLL();
// Test and set Remap
__writeMemory32(0xAAAAAAAA,0x00000000,"Memory");
if(__readMemory32(0x00000000,"Memory") != 0xAAAAAAAA)
{
__writeMemory32(0x01,0xFFFFFF00,"Memory"); // MC_RCR: toggle remap bit
}
// init_SDRAM ();
__message("Target init macro complete");
}
setup()
{
__var i,clk;
__writeMemory32(0x1, 0xFFFFFC00, "Memory"); // PMC_SCER: PCK = 1
__writeMemory32(0x0000FF01, 0xFFFFFC20, "Memory"); // PMC_MOR: MOSCEN = 1, enable main clock
while(((clk = __readMemory32(0xFFFFFC24, "Memory")) & 0x00010000) == 0); // Read PMC_MCFR to determine Fosc
clk = (clk & 0x0000FFFF) * 32768 / 16; // * 244 / 5;
__writeMemory32(0x1, 0xFFFFFC30, "Memory"); // PMC_MCKR: CSS = 1, PRES = 0, MDIV = 0
}
смотрим внимательно даташит, IAR User Guide и примеры в поставке IAR ТАМ ЕСТ ВСЁ.