aboutsummaryrefslogtreecommitdiffstats
path: root/src/stm32lib/examples/NVIC/VectorTable_Relocation/linker/HiTOP/STM32F10x_offset.lsl
blob: 164cf727e4670580061cc206131d6d0ae718eef2 (plain)
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
128
129
130
131
132
// define rom size
#define __ROM_SIZE               512k
#define __ROM_ADDR               0x08002000
// define ram size
#define __RAM_SIZE               64k
#define __RAM_ADDR               0x20000000

#define __NR_OF_VECTORS          42
#define __VECTOR_TABLE_SIZE      (__NR_OF_VECTORS * 4)
#define __VECTOR_TABLE_ROM_ADDR  0x08002000
#define _Vectors                 0x08002000

#define _ENTRYADDR               (0x08002001 + __VECTOR_TABLE_SIZE + 80) /* xB0 */ 

#define _START                   max(_ENTRYADDR, 0x08002165)

#define __RESET                  0x08002004

#define __STACK                  0x400
#define __STACKADDR              (__RAM_ADDR + __RAM_SIZE - __STACK)
#define __HEAP                   2k

#define __TABLE_RAM_SIZE         20
#define __TABLE_RAM_ADDR         (__STACKADDR - __STACK - __TABLE_RAM_SIZE)


#define __MEMORY

#define __PROCESSOR_MODE         0x10            /* User mode */
#define __IRQ_BIT                0x80            /* IRQ interrupts disabled */
#define __FIQ_BIT                0x40            /* FIQ interrupts disabled */
#define __APPLICATION_MODE       (__PROCESSOR_MODE | __IRQ_BIT | __FIQ_BIT)


architecture ARM
{
   endianness
   {
      little;
      big;
   }
   space linear
   {
      id = 1;
      mau = 8;
      align = 4;
      map (size = 4G, dest = bus:local_bus);

      copytable
      (
         align = 4,
         copy_unit = 1,
         dest = linear
      );
      start_address
      (
         // It is not strictly necessary to define a run_addr for _START
         // because hardware starts execution at address 0x0 which should
         // be the vector table with a jump to the relocatable _START, but
         // an absolute address can prevent the branch to be out-of-range.
         // Or _START may be the entry point at reset and the reset handler
         // copies the vector table to address 0x0 after some ROM/RAM memory
         // re-mapping. In that case _START should be at a fixed address
         // in ROM, specifically the alias of address 0x0 before memory
         // re-mapping.
         run_addr = _START,
         symbol = "_START"
      );

      stack "stack"
      (

         align = 4,
         min_size = __STACK,
         grows = high_to_low
      );
      heap "heap"
      (
         align = 4,
         min_size=__HEAP
      );
      section_layout
      {
         "_lc_ub_vector_table" = __VECTOR_TABLE_ROM_ADDR;
         "_lc_ue_vector_table" = __VECTOR_TABLE_ROM_ADDR + __VECTOR_TABLE_SIZE + 8;
//         "_lc_ub_table" = __TABLE_RAM_ADDR;
//         "_lc_ue_table" = __TABLE_RAM_ADDR + __TABLE_RAM_SIZE;
         "_lc_ub_vector_table_copy" := "_lc_ub_vector_table";
         "_lc_ue_vector_table_copy" := "_lc_ue_vector_table";

         group ( ordered, run_addr=__VECTOR_TABLE_ROM_ADDR )
         {
            select ".text.vector";
            
         }
         
#ifdef __HEAPADDR
         group ( ordered, run_addr=__HEAPADDR )
         {
            select "heap";
         }
#endif
         group ( ordered, run_addr=__STACKADDR)
         {
            select "stack";
         }
      }
   }
   bus local_bus
      {
         mau = 8;
         width = 32;
      }
}
///////////////////////////////////////////////////////////////////


memory flash
{
    mau = 8;
    type = rom;
    size = __ROM_SIZE;
    map ( size = __ROM_SIZE, dest_offset = __ROM_ADDR, dest = bus:ARM:local_bus );
}

memory sram
{
    mau = 8;
    type = ram;
    size = __RAM_SIZE;
    map ( size = __RAM_SIZE, dest_offset = __RAM_ADDR, dest = bus:ARM:local_bus );
}