avr: use the correct RAM start address
Previously, the RAM was set to start at address 0. This is incorrect: on AVR, the first few addresses are taken up by memory-mapped I/O. The reason this didn't lead to problems (yet) was because the stack was usually big enough to avoid real problems.
Этот коммит содержится в:
родитель
63cfb09e9e
коммит
5bace979ea
2 изменённых файлов: 38 добавлений и 9 удалений
|
@ -2,7 +2,7 @@
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
FLASH_TEXT (rw) : ORIGIN = 0, LENGTH = __flash_size - _bootloader_size
|
FLASH_TEXT (rw) : ORIGIN = 0, LENGTH = __flash_size - _bootloader_size
|
||||||
RAM (xrw) : ORIGIN = 0, LENGTH = __ram_size
|
RAM (xrw) : ORIGIN = __ram_start, LENGTH = __ram_size
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
|
|
|
@ -25,6 +25,7 @@ type AVRToolsDeviceFile struct {
|
||||||
Size string `xml:"size,attr"`
|
Size string `xml:"size,attr"`
|
||||||
MemorySegments []struct {
|
MemorySegments []struct {
|
||||||
Name string `xml:"name,attr"`
|
Name string `xml:"name,attr"`
|
||||||
|
Start string `xml:"start,attr"`
|
||||||
Size string `xml:"size,attr"`
|
Size string `xml:"size,attr"`
|
||||||
} `xml:"memory-segment"`
|
} `xml:"memory-segment"`
|
||||||
} `xml:"address-spaces>address-space"`
|
} `xml:"address-spaces>address-space"`
|
||||||
|
@ -57,9 +58,26 @@ type Device struct {
|
||||||
peripherals []*Peripheral
|
peripherals []*Peripheral
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AddressSpace is the Go version of an XML element like the following:
|
||||||
|
//
|
||||||
|
// <address-space endianness="little" name="data" id="data" start="0x0000" size="0x0900">
|
||||||
|
//
|
||||||
|
// It describes one address space in an AVR microcontroller. One address space
|
||||||
|
// may have multiple memory segments.
|
||||||
type AddressSpace struct {
|
type AddressSpace struct {
|
||||||
Size string
|
Size string
|
||||||
Segments map[string]int
|
Segments map[string]MemorySegment
|
||||||
|
}
|
||||||
|
|
||||||
|
// MemorySegment is the Go version of an XML element like the following:
|
||||||
|
//
|
||||||
|
// <memory-segment name="IRAM" start="0x0100" size="0x0800" type="ram" external="false"/>
|
||||||
|
//
|
||||||
|
// It describes a single contiguous area of memory in a particular address space
|
||||||
|
// (see AddressSpace).
|
||||||
|
type MemorySegment struct {
|
||||||
|
start int64
|
||||||
|
size int64
|
||||||
}
|
}
|
||||||
|
|
||||||
type Interrupt struct {
|
type Interrupt struct {
|
||||||
|
@ -115,14 +133,21 @@ func readATDF(path string) (*Device, error) {
|
||||||
for _, el := range device.AddressSpaces {
|
for _, el := range device.AddressSpaces {
|
||||||
memorySizes[el.Name] = &AddressSpace{
|
memorySizes[el.Name] = &AddressSpace{
|
||||||
Size: el.Size,
|
Size: el.Size,
|
||||||
Segments: make(map[string]int),
|
Segments: make(map[string]MemorySegment),
|
||||||
}
|
}
|
||||||
for _, segmentEl := range el.MemorySegments {
|
for _, segmentEl := range el.MemorySegments {
|
||||||
|
start, err := strconv.ParseInt(segmentEl.Start, 0, 32)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
size, err := strconv.ParseInt(segmentEl.Size, 0, 32)
|
size, err := strconv.ParseInt(segmentEl.Size, 0, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
memorySizes[el.Name].Segments[segmentEl.Name] = int(size)
|
memorySizes[el.Name].Segments[segmentEl.Name] = MemorySegment{
|
||||||
|
start: start,
|
||||||
|
size: size,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,10 +230,12 @@ func readATDF(path string) (*Device, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ramSize := 0 // for devices with no RAM
|
ramStart := int64(0)
|
||||||
|
ramSize := int64(0) // for devices with no RAM
|
||||||
for _, ramSegmentName := range []string{"IRAM", "INTERNAL_SRAM", "SRAM"} {
|
for _, ramSegmentName := range []string{"IRAM", "INTERNAL_SRAM", "SRAM"} {
|
||||||
if segment, ok := memorySizes["data"].Segments[ramSegmentName]; ok {
|
if segment, ok := memorySizes["data"].Segments[ramSegmentName]; ok {
|
||||||
ramSize = segment
|
ramStart = segment.start
|
||||||
|
ramSize = segment.size
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,6 +254,7 @@ func readATDF(path string) (*Device, error) {
|
||||||
"arch": device.Architecture,
|
"arch": device.Architecture,
|
||||||
"family": device.Family,
|
"family": device.Family,
|
||||||
"flashSize": int(flashSize),
|
"flashSize": int(flashSize),
|
||||||
|
"ramStart": ramStart,
|
||||||
"ramSize": ramSize,
|
"ramSize": ramSize,
|
||||||
"numInterrupts": len(device.Interrupts),
|
"numInterrupts": len(device.Interrupts),
|
||||||
},
|
},
|
||||||
|
@ -429,6 +457,7 @@ func writeLD(outdir string, device *Device) error {
|
||||||
/* Generated by gen-device-avr.go from {{.file}}, see {{.descriptorSource}} */
|
/* Generated by gen-device-avr.go from {{.file}}, see {{.descriptorSource}} */
|
||||||
|
|
||||||
__flash_size = 0x{{printf "%x" .flashSize}};
|
__flash_size = 0x{{printf "%x" .flashSize}};
|
||||||
|
__ram_start = 0x{{printf "%x" .ramStart}};
|
||||||
__ram_size = 0x{{printf "%x" .ramSize}};
|
__ram_size = 0x{{printf "%x" .ramSize}};
|
||||||
__num_isrs = {{.numInterrupts}};
|
__num_isrs = {{.numInterrupts}};
|
||||||
`))
|
`))
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче