Skip to content

Commit 5b42e28

Browse files
authored
Merge pull request #8607 from aashishc1988/ram_rom_fetch
Fetch ram/rom start/size
2 parents ab1a723 + 329c553 commit 5b42e28

File tree

5 files changed

+207
-41
lines changed

5 files changed

+207
-41
lines changed

TESTS/mbed_platform/stats_sys/main.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,48 @@ void test_sys_info()
4545
TEST_ASSERT_EQUAL(GCC_ARM, stats.compiler_id);
4646
#endif
4747
TEST_ASSERT_NOT_EQUAL(0, stats.compiler_version);
48+
49+
// RAM / ROM sizes should not be zero and should match the define
50+
#if defined(MBED_ROM_START) && defined(MBED_ROM_SIZE)
51+
TEST_ASSERT_NOT_EQUAL(0, stats.rom_size[0]);
52+
TEST_ASSERT_EQUAL(MBED_ROM_SIZE, stats.rom_size[0]);
53+
TEST_ASSERT_EQUAL(MBED_ROM_START, stats.rom_start[0]);
54+
#endif
55+
#if defined(MBED_RAM_START) && defined(MBED_RAM_SIZE)
56+
TEST_ASSERT_NOT_EQUAL(0, stats.ram_size[0]);
57+
TEST_ASSERT_EQUAL(MBED_RAM_START, stats.ram_start[0]);
58+
TEST_ASSERT_EQUAL(MBED_RAM_SIZE, stats.ram_size[0]);
59+
#endif
60+
#if defined(MBED_RAM1_START) && defined(MBED_RAM1_SIZE)
61+
TEST_ASSERT_NOT_EQUAL(0, stats.ram_size[1]);
62+
TEST_ASSERT_EQUAL(MBED_RAM1_SIZE, stats.ram_size[1]);
63+
TEST_ASSERT_EQUAL(MBED_RAM1_START, stats.ram_start[1]);
64+
#endif
65+
#if defined(MBED_RAM2_START) && defined(MBED_RAM2_SIZE)
66+
TEST_ASSERT_NOT_EQUAL(0, stats.ram_size[2]);
67+
TEST_ASSERT_EQUAL(MBED_RAM2_SIZE, stats.ram_size[2]);
68+
TEST_ASSERT_EQUAL(MBED_RAM2_START, stats.ram_start[2]);
69+
#endif
70+
#if defined(MBED_RAM3_START) && defined(MBED_RAM3_SIZE)
71+
TEST_ASSERT_NOT_EQUAL(0, stats.ram_size[3]);
72+
TEST_ASSERT_EQUAL(MBED_RAM3_SIZE, stats.ram_size[3]);
73+
TEST_ASSERT_EQUAL(MBED_RAM3_START, stats.ram_start[3]);
74+
#endif
75+
#if defined(MBED_ROM1_START) && defined(MBED_ROM1_SIZE)
76+
TEST_ASSERT_NOT_EQUAL(0, stats.rom_size[1]);
77+
TEST_ASSERT_EQUAL(MBED_ROM1_SIZE, stats.rom_size[1]);
78+
TEST_ASSERT_EQUAL(MBED_ROM1_START, stats.rom_start[1]);
79+
#endif
80+
#if defined(MBED_ROM2_START) && defined(MBED_ROM2_SIZE)
81+
TEST_ASSERT_NOT_EQUAL(0, stats.rom_size[2]);
82+
TEST_ASSERT_EQUAL(MBED_ROM2_SIZE, stats.rom_size[2]);
83+
TEST_ASSERT_EQUAL(MBED_ROM2_START, stats.rom_start[2]);
84+
#endif
85+
#if defined(MBED_ROM3_START) && defined(MBED_ROM3_SIZE)
86+
TEST_ASSERT_NOT_EQUAL(0, stats.rom_size[3]);
87+
TEST_ASSERT_EQUAL(MBED_ROM3_SIZE, stats.rom_size[3]);
88+
TEST_ASSERT_EQUAL(MBED_ROM3_START, stats.rom_start[3]);
89+
#endif
4890
}
4991

5092
Case cases[] = {

platform/mbed_stats.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,39 @@ void mbed_stats_sys_get(mbed_stats_sys_t *stats)
131131

132132
#if defined(MBED_SYS_STATS_ENABLED)
133133
stats->os_version = MBED_VERSION;
134+
#if defined(MBED_RAM_START) && defined(MBED_RAM_SIZE)
135+
stats->ram_start[0] = MBED_RAM_START;
136+
stats->ram_size[0] = MBED_RAM_SIZE;
137+
#endif
138+
#if defined(MBED_ROM_START) && defined(MBED_ROM_SIZE)
139+
stats->rom_start[0] = MBED_ROM_START;
140+
stats->rom_size[0] = MBED_ROM_SIZE;
141+
#endif
142+
#if defined(MBED_RAM1_START) && defined(MBED_RAM1_SIZE)
143+
stats->ram_start[1] = MBED_RAM1_START;
144+
stats->ram_size[1] = MBED_RAM1_SIZE;
145+
#endif
146+
#if defined(MBED_RAM2_START) && defined(MBED_RAM2_SIZE)
147+
stats->ram_start[2] = MBED_RAM2_START;
148+
stats->ram_size[2] = MBED_RAM2_SIZE;
149+
#endif
150+
#if defined(MBED_RAM3_START) && defined(MBED_RAM3_SIZE)
151+
stats->ram_start[3] = MBED_RAM3_START;
152+
stats->ram_size[3] = MBED_RAM3_SIZE;
153+
#endif
154+
#if defined(MBED_ROM1_START) && defined(MBED_ROM1_SIZE)
155+
stats->rom_start[1] = MBED_ROM1_START;
156+
stats->rom_size[1] = MBED_ROM1_SIZE;
157+
#endif
158+
#if defined(MBED_ROM2_START) && defined(MBED_ROM2_SIZE)
159+
stats->rom_start[2] = MBED_ROM2_START;
160+
stats->rom_size[2] = MBED_ROM2_SIZE;
161+
#endif
162+
#if defined(MBED_ROM3_START) && defined(MBED_ROM3_SIZE)
163+
stats->rom_start[3] = MBED_ROM3_START;
164+
stats->rom_size[3] = MBED_ROM3_SIZE;
165+
#endif
166+
134167
#if defined(__CORTEX_M)
135168
stats->cpu_id = SCB->CPUID;
136169
#endif

platform/mbed_stats.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ extern "C" {
3838
#define MBED_THREAD_STATS_ENABLED 1
3939
#endif
4040

41+
/** Maximum memory regions reported by mbed-os memory statistics */
42+
#define MBED_MAX_MEM_REGIONS 4
43+
4144
/**
4245
* struct mbed_stats_heap_t definition
4346
*/
@@ -144,6 +147,10 @@ typedef struct {
144147
uint32_t cpu_id; /**< CPUID register data (Cortex-M only supported) */
145148
mbed_compiler_id_t compiler_id; /**< Compiler ID \ref mbed_compiler_id_t */
146149
uint32_t compiler_version; /**< Compiler version */
150+
uint32_t ram_start[MBED_MAX_MEM_REGIONS];/**< Start addresses of all internal RAM memories */
151+
uint32_t ram_size[MBED_MAX_MEM_REGIONS];/**< Size of all internal RAM memories in target */
152+
uint32_t rom_start[MBED_MAX_MEM_REGIONS];/**< Start addresses of all internal ROM memories */
153+
uint32_t rom_size[MBED_MAX_MEM_REGIONS];/**< Size of all internal ROM memories in target */
147154
} mbed_stats_sys_t;
148155

149156
/**

tools/config/__init__.py

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@
7272
"ETHERNET_HOST",
7373
]
7474

75+
# List of all possible ram memories that can be available for a target
76+
RAM_ALL_MEMORIES = ['IRAM1', 'IRAM2', 'IRAM3', 'IRAM4', 'SRAM_OC', \
77+
'SRAM_ITC', 'SRAM_DTC', 'SRAM_UPPER', 'SRAM_LOWER', \
78+
'SRAM']
79+
80+
# List of all possible rom memories that can be available for a target
81+
ROM_ALL_MEMORIES = ['IROM1', 'PROGRAM_FLASH', 'IROM2']
82+
7583
# Base class for all configuration exceptions
7684
class ConfigException(Exception):
7785
"""Config system only exception. Makes it easier to distinguish config
@@ -593,8 +601,6 @@ def sectors(self):
593601
raise ConfigException("No sector info available")
594602

595603
def _get_cmsis_part(self):
596-
if not getattr(self.target, "bootloader_supported", False):
597-
raise ConfigException("Bootloader not supported on this target.")
598604
if not hasattr(self.target, "device_name"):
599605
raise ConfigException("Bootloader not supported on this target: "
600606
"targets.json `device_name` not specified.")
@@ -615,24 +621,68 @@ def _get_mem_specs(self, memories, cmsis_part, exception_text):
615621
continue
616622
raise ConfigException(exception_text)
617623

618-
@property
619-
def rom(self):
620-
"""Get rom information as a pair of start_addr, size"""
624+
def get_all_active_memories(self, memory_list):
625+
"""Get information of all available rom/ram memories in the form of dictionary
626+
{Memory: [start_addr, size]}. Takes in the argument, a list of all available
627+
regions within the ram/rom memory"""
621628
# Override rom_start/rom_size
622629
#
623630
# This is usually done for a target which:
624631
# 1. Doesn't support CMSIS pack, or
625632
# 2. Supports TrustZone and user needs to change its flash partition
626-
cmsis_part = self._get_cmsis_part()
627-
rom_start, rom_size = self._get_mem_specs(
628-
["IROM1", "PROGRAM_FLASH"],
629-
cmsis_part,
630-
"Not enough information in CMSIS packs to build a bootloader "
631-
"project"
632-
)
633-
rom_start = int(getattr(self.target, "mbed_rom_start", False) or rom_start, 0)
634-
rom_size = int(getattr(self.target, "mbed_rom_size", False) or rom_size, 0)
635-
return (rom_start, rom_size)
633+
634+
available_memories = {}
635+
# Counter to keep track of ROM/RAM memories supported by target
636+
active_memory_counter = 0
637+
# Find which memory we are dealing with, RAM/ROM
638+
active_memory = 'ROM' if any('ROM' in mem_list for mem_list in memory_list) else 'RAM'
639+
640+
try:
641+
cmsis_part = self._get_cmsis_part()
642+
except ConfigException:
643+
""" If the target doesn't exits in cmsis, but present in targets.json
644+
with ram and rom start/size defined"""
645+
if getattr(self.target, "mbed_ram_start") and \
646+
getattr(self.target, "mbed_rom_start"):
647+
mem_start = int(getattr(self.target, "mbed_" + active_memory.lower() + "_start"), 0)
648+
mem_size = int(getattr(self.target, "mbed_" + active_memory.lower() + "_size"), 0)
649+
available_memories[active_memory] = [mem_start, mem_size]
650+
return available_memories
651+
else:
652+
raise ConfigException("Bootloader not supported on this target. "
653+
"ram/rom start/size not found in "
654+
"targets.json.")
655+
656+
present_memories = set(cmsis_part['memory'].keys())
657+
valid_memories = set(memory_list).intersection(present_memories)
658+
659+
for memory in valid_memories:
660+
mem_start, mem_size = self._get_mem_specs(
661+
[memory],
662+
cmsis_part,
663+
"Not enough information in CMSIS packs to build a bootloader "
664+
"project"
665+
)
666+
if memory=='IROM1' or memory=='PROGRAM_FLASH':
667+
mem_start = getattr(self.target, "mbed_rom_start", False) or mem_start
668+
mem_size = getattr(self.target, "mbed_rom_size", False) or mem_size
669+
memory = 'ROM'
670+
elif memory == 'IRAM1' or memory == 'SRAM_OC' or \
671+
memory == 'SRAM_UPPER' or memory == 'SRAM':
672+
if (self.has_ram_regions):
673+
continue
674+
mem_start = getattr(self.target, "mbed_ram_start", False) or mem_start
675+
mem_size = getattr(self.target, "mbed_ram_size", False) or mem_size
676+
memory = 'RAM'
677+
else:
678+
active_memory_counter += 1
679+
memory = active_memory + str(active_memory_counter)
680+
681+
mem_start = int(mem_start, 0)
682+
mem_size = int(mem_size, 0)
683+
available_memories[memory] = [mem_start, mem_size]
684+
685+
return available_memories
636686

637687
@property
638688
def ram_regions(self):
@@ -654,17 +704,19 @@ def ram_regions(self):
654704

655705
@property
656706
def regions(self):
707+
if not getattr(self.target, "bootloader_supported", False):
708+
raise ConfigException("Bootloader not supported on this target.")
657709
"""Generate a list of regions from the config"""
658710
if ((self.target.bootloader_img or self.target.restrict_size) and
659711
(self.target.mbed_app_start or self.target.mbed_app_size)):
660712
raise ConfigException(
661-
"target.bootloader_img and target.restirct_size are "
713+
"target.bootloader_img and target.restrict_size are "
662714
"incompatible with target.mbed_app_start and "
663715
"target.mbed_app_size")
664716
if self.target.bootloader_img or self.target.restrict_size:
665-
return self._generate_bootloader_build(*self.rom)
717+
return self._generate_bootloader_build(self.get_all_active_memories(ROM_ALL_MEMORIES))
666718
else:
667-
return self._generate_linker_overrides(*self.rom)
719+
return self._generate_linker_overrides(self.get_all_active_memories(ROM_ALL_MEMORIES))
668720

669721
@staticmethod
670722
def header_member_size(member):
@@ -701,7 +753,8 @@ def _assign_new_offset(rom_start, start, new_offset, region_name):
701753
"Can not place % region inside previous region" % region_name)
702754
return newstart
703755

704-
def _generate_bootloader_build(self, rom_start, rom_size):
756+
def _generate_bootloader_build(self, rom_memories):
757+
rom_start, rom_size = rom_memories.get('ROM')
705758
start = rom_start
706759
rom_end = rom_start + rom_size
707760
if self.target.bootloader_img:
@@ -785,7 +838,8 @@ def report(self):
785838
return {'app_config': self.app_config_location,
786839
'library_configs': list(map(relpath, self.processed_configs.keys()))}
787840

788-
def _generate_linker_overrides(self, rom_start, rom_size):
841+
def _generate_linker_overrides(self, rom_memories):
842+
rom_start, rom_size = rom_memories.get('ROM')
789843
if self.target.mbed_app_start is not None:
790844
start = int(self.target.mbed_app_start, 0)
791845
else:

tools/toolchains/__init__.py

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
from ..notifier.term import TerminalNotifier
4141
from ..resources import FileType
4242
from ..memap import MemapParser
43-
from ..config import ConfigException
43+
from ..config import (ConfigException, RAM_ALL_MEMORIES, ROM_ALL_MEMORIES)
4444

4545

4646
#Disables multiprocessing if set to higher number than the host machine CPUs
@@ -699,14 +699,19 @@ def mem_stats(self, map):
699699

700700
return None
701701

702-
def _add_defines_from_region(self, region, suffixes=['_ADDR', '_SIZE']):
702+
def _add_defines_from_region(self, region, linker_define=False, suffixes=['_ADDR', '_SIZE']):
703703
for define in [(region.name.upper() + suffixes[0], region.start),
704704
(region.name.upper() + suffixes[1], region.size)]:
705705
define_string = "-D%s=0x%x" % define
706706
self.cc.append(define_string)
707707
self.cppc.append(define_string)
708708
self.flags["common"].append(define_string)
709-
709+
if linker_define:
710+
ld_string = ("%s" % define[0], "0x%x" % define[1])
711+
ld_string = self.make_ld_define(*ld_string)
712+
self.ld.append(ld_string)
713+
self.flags["ld"].append(ld_string)
714+
710715
def _add_all_regions(self, region_list, active_region_name):
711716
for region in region_list:
712717
self._add_defines_from_region(region)
@@ -725,26 +730,51 @@ def add_regions(self):
725730
"""Add regions to the build profile, if there are any.
726731
"""
727732
if self.config.has_regions:
728-
regions = list(self.config.regions)
729-
self.notify.info("Using ROM region%s %s in this build." % (
730-
"s" if len(regions) > 1 else "",
731-
", ".join(r.name for r in regions)
732-
))
733-
self._add_all_regions(regions, "MBED_APP")
733+
try:
734+
regions = list(self.config.regions)
735+
self.notify.info("Using ROM region%s %s in this build." % (
736+
"s" if len(regions) > 1 else "",
737+
", ".join(r.name for r in regions)
738+
))
739+
self._add_all_regions(regions, "MBED_APP")
740+
except ConfigException:
741+
pass
742+
734743
if self.config.has_ram_regions:
735-
regions = list(self.config.ram_regions)
736-
self.notify.info("Using RAM region%s %s in this build." % (
737-
"s" if len(regions) > 1 else "",
738-
", ".join(r.name for r in regions)
739-
))
740-
self._add_all_regions(regions, "MBED_RAM")
744+
try:
745+
regions = list(self.config.ram_regions)
746+
self.notify.info("Using RAM region%s %s in this build." % (
747+
"s" if len(regions) > 1 else "",
748+
", ".join(r.name for r in regions)
749+
))
750+
self._add_all_regions(regions, "MBED_RAM")
751+
except ConfigException:
752+
pass
753+
754+
Region = namedtuple("Region", "name start size")
755+
756+
try:
757+
# Add all available ROM regions to build profile
758+
rom_available_regions = self.config.get_all_active_memories(ROM_ALL_MEMORIES)
759+
for key, value in rom_available_regions.items():
760+
rom_start, rom_size = value
761+
self._add_defines_from_region(
762+
Region("MBED_" + key, rom_start, rom_size),
763+
True,
764+
suffixes=["_START", "_SIZE"]
765+
)
766+
except ConfigException:
767+
pass
741768
try:
742-
rom_start, rom_size = self.config.rom
743-
Region = namedtuple("Region", "name start size")
744-
self._add_defines_from_region(
745-
Region("MBED_ROM", rom_start, rom_size),
746-
suffixes=["_START", "_SIZE"]
747-
)
769+
# Add all available RAM regions to build profile
770+
ram_available_regions = self.config.get_all_active_memories(RAM_ALL_MEMORIES)
771+
for key, value in ram_available_regions.items():
772+
ram_start, ram_size = value
773+
self._add_defines_from_region(
774+
Region("MBED_" + key, ram_start, ram_size),
775+
True,
776+
suffixes=["_START", "_SIZE"]
777+
)
748778
except ConfigException:
749779
pass
750780

0 commit comments

Comments
 (0)