@@ -645,15 +645,23 @@ def _get_cmsis_part(self):
645
645
"arm_pack_manager index." )
646
646
return cache .index [self .target .device_name ]
647
647
648
- def _get_mem_specs (self , memories , cmsis_part , exception_text ):
649
- for memory in memories :
650
- try :
651
- size = cmsis_part ['memory' ][memory ]['size' ]
652
- start = cmsis_part ['memory' ][memory ]['start' ]
653
- return (start , size )
654
- except KeyError :
655
- continue
656
- raise ConfigException (exception_text )
648
+ @staticmethod
649
+ def _memory_ordering (memory ):
650
+ return (memory ['default' ], memory ['size' ], memory ['start' ])
651
+
652
+ def _get_mem_specs (self , permissions , cmsis_part ):
653
+ all_matching_memories = {
654
+ name : memory for name , memory in cmsis_part ['memories' ].items ()
655
+ if all (memory ['access' ][perm ] for perm in permissions )
656
+ }
657
+ if all_matching_memories :
658
+ return all_matching_memories
659
+ else :
660
+ raise ConfigException (
661
+ "Missing a memory that is {} in CMSIS Pack data" .format (
662
+ ", " .join (permissions )
663
+ )
664
+ )
657
665
658
666
def get_all_active_memories (self , memory_list ):
659
667
"""Get information of all available rom/ram memories in the form of dictionary
@@ -664,7 +672,6 @@ def get_all_active_memories(self, memory_list):
664
672
# This is usually done for a target which:
665
673
# 1. Doesn't support CMSIS pack, or
666
674
# 2. Supports TrustZone and user needs to change its flash partition
667
-
668
675
available_memories = {}
669
676
# Counter to keep track of ROM/RAM memories supported by target
670
677
active_memory_counter = 0
@@ -687,16 +694,16 @@ def get_all_active_memories(self, memory_list):
687
694
"ram/rom start/size not found in "
688
695
"targets.json." )
689
696
690
- present_memories = set (cmsis_part ['memory ' ].keys ())
697
+ present_memories = set (cmsis_part ['memories ' ].keys ())
691
698
valid_memories = set (memory_list ).intersection (present_memories )
692
699
700
+ memories = self ._get_mem_specs (
701
+ ["read" , "write" if active_memory == "RAM" else "execute" ],
702
+ cmsis_part
703
+ )
693
704
for memory in valid_memories :
694
- mem_start , mem_size = self ._get_mem_specs (
695
- [memory ],
696
- cmsis_part ,
697
- "Not enough information in CMSIS packs to build a bootloader "
698
- "project"
699
- )
705
+ mem_start = memories [memory ]["start" ]
706
+ mem_size = memories [memory ]["size" ]
700
707
if memory == 'IROM1' or memory == 'PROGRAM_FLASH' :
701
708
mem_start = getattr (self .target , "mbed_rom_start" , False ) or mem_start
702
709
mem_size = getattr (self .target , "mbed_rom_size" , False ) or mem_size
@@ -712,8 +719,10 @@ def get_all_active_memories(self, memory_list):
712
719
active_memory_counter += 1
713
720
memory = active_memory + str (active_memory_counter )
714
721
715
- mem_start = int (mem_start , 0 )
716
- mem_size = int (mem_size , 0 )
722
+ if not isinstance (mem_start , int ):
723
+ mem_start = int (mem_start , 0 )
724
+ if not isinstance (mem_size , int ):
725
+ mem_size = int (mem_size , 0 )
717
726
available_memories [memory ] = [mem_start , mem_size ]
718
727
719
728
return available_memories
@@ -722,19 +731,23 @@ def get_all_active_memories(self, memory_list):
722
731
def ram_regions (self ):
723
732
"""Generate a list of ram regions from the config"""
724
733
cmsis_part = self ._get_cmsis_part ()
725
- ram_start , ram_size = self ._get_mem_specs (
726
- ["IRAM1" , "SRAM0" ],
727
- cmsis_part ,
728
- "Not enough information in CMSIS packs to build a ram sharing project"
729
- )
734
+ rams = self ._get_mem_specs (("read" , "write" ), cmsis_part )
735
+ best_ram = sorted (
736
+ rams .values (),
737
+ key = self ._memory_ordering ,
738
+ reverse = True
739
+ )[0 ]
740
+ ram_start , ram_size = best_ram ["start" ], best_ram ["size" ]
730
741
# Override ram_start/ram_size
731
742
#
732
743
# This is usually done for a target which:
733
744
# 1. Doesn't support CMSIS pack, or
734
745
# 2. Supports TrustZone and user needs to change its flash partition
735
- ram_start = getattr (self .target , "mbed_ram_start" , False ) or ram_start
736
- ram_size = getattr (self .target , "mbed_ram_size" , False ) or ram_size
737
- return [RamRegion ("application_ram" , int (ram_start , 0 ), int (ram_size , 0 ), True )]
746
+ if getattr (self .target , "mbed_ram_start" ):
747
+ ram_start = int (getattr (self .target , "mbed_ram_start" ), 0 )
748
+ if getattr (self .target , "mbed_ram_size" ):
749
+ ram_size = int (getattr (self .target , "mbed_ram_size" ), 0 )
750
+ return [RamRegion ("application_ram" , ram_start , ram_size , True )]
738
751
739
752
@property
740
753
def regions (self ):
0 commit comments