Hi mtconnol,
To do this, you need to do several steps:
- Modify the link file.
Since we want to copy the application into internal SRAM, we must reserve some RAM for this.
Therefore the DATA segments is after this area.
|
C/C++ Source code
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
//*************************************************************************
// XLINK command file for AT91SAM9261 using an external NOR flash
//
// Usage: xlink -f lnkarm <your_object_file(s)>
// -s <program start label> <C/C++ runtime library>
//
//*************************************************************************
//*************************************************************************
-carm
//
// These settings are used for link the application.
//
-DROMSTART=00000000
-DROMEND=00028000
//
// Define the internal SRAM.
//
-DIRAM_START=00300000
-DIRAM_SIZE=28000
-DIRAM_END=(IRAM_START+IRAM_SIZE-1)
//
// Define the external SDRAM.
//
-DSDRAMSTART=20000000
-DSDRAM_SIZE=4000000
-DSDRAMEND=(SDRAMSTART+SDRAM_SIZE-1)
//
// These defines are used for copying the code from ROM to RAM.
// We reserve 1/2 of the SRAM for this. (80kByte)
//
-DRAMCODE_START=IRAM_START
-DRAMCODE_SIZE=14000
-DRAMCODE_END=(RAMCODE_START+RAMCODE_SIZE-1)
//
// Read/Write segments are after the reserved "RAMCode segement".
// You can alternatively use the external SDRAM for this.
// This will look like this:
// -DRAMSTART=SDRAMSTART
// -DRAMEND=SDRAMEND
//
-DRAMSTART=(RAMCODE_END+1)
-DRAMEND=IRAM_END
//*************************************************************************
// 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)PROGRAM_START=ROMSTART-ROMEND
-Z(CODE)INTVEC=ROMSTART-ROMEND
//*************************************************************************
// Startup code and exception routines (ICODE).
//*************************************************************************
-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
-Z(CODE)SWITAB=ROMSTART-ROMEND
-Z(CODE)RAMCODE=RAMCODE_START-RAMCODE_END
//*************************************************************************
// Code segments may be placed anywhere.
//*************************************************************************
-Z(CODE)CODE=ROMSTART-ROMEND
//*************************************************************************
// Various constants and initializers.
//*************************************************************************
-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
-Z(CONST)CHECKSUM=ROMSTART-ROMEND
-Z(CONST)PROGRAM_END
//*************************************************************************
// 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
-Z(CONST)CODE_ID=ROMSTART-ROMEND
-QCODE_I=CODE_ID
//*************************************************************************
// ICCARM produces code for __ramfunc functions in
// CODE_I segments. The -Q XLINK command line
// option redirects XLINK to emit the code in the
// debug information associated with the CODE_I
// segment, where the code will execute.
//*************************************************************************
//*************************************************************************
// Stack and heap segments.
//*************************************************************************
-D_CSTACK_SIZE=(100*4)
-D_IRQ_STACK_SIZE=(8*8*4) // 8 nesting levels, 8 registers saved, 4 bytes each
// System and IRQ stack should reside in internal RAM if possible
-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-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
|
- Copy your embOS application into internal SRAM.
We can do that in __low_level_init().
Add following lines to your __low_level_init() after PLL initialization:
|
C/C++ Source code
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{
#define MATRIX_MCFG (*(volatile unsigned long *)(0xFFFFEE00))
#pragma segment="RAMCODE"
#pragma segment="PROGRAM_START"
#pragma segment="PROGRAM_END"
void * pSrc = __sfb("RAMCODE");
void * pDest = __sfb("PROGRAM_START");
OS_U32 Size = (int)((OS_U8 *)__sfb("PROGRAM_START") - (OS_U8 *)__sfb("PROGRAM_END"));
//
// Copy ROM to internal SRAM
//
memcpy(pDest, pSrc, Size);
//
// Remap internal SRAM to 0
//
MATRIX_MCFG = 0x03;
}
|
Let me know if this solves your problem.
Souhail