mbed os with nrf51 internal bandgap enabled to read battery level
Dependents: BLE_file_test BLE_Blink ExternalEncoder
Diff: tools/export/iar/__init__.py
- Revision:
- 0:f269e3021894
diff -r 000000000000 -r f269e3021894 tools/export/iar/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/export/iar/__init__.py Sun Oct 23 15:10:02 2016 +0000 @@ -0,0 +1,150 @@ +import os +from os.path import sep, join, exists +from collections import namedtuple +from subprocess import Popen, PIPE +from distutils.spawn import find_executable +import re +import sys + +from tools.targets import TARGET_MAP +from tools.export.exporters import Exporter, FailedBuildException +import json +from tools.export.cmsis import DeviceCMSIS + +class IAR(Exporter): + NAME = 'iar' + TOOLCHAIN = 'IAR' + + #iar_definitions.json location + def_loc = os.path.join( + os.path.dirname(os.path.abspath(__file__)), '..', '..', '..', + 'tools','export', 'iar', 'iar_definitions.json') + + #create a dictionary of the definitions + with open(def_loc, 'r') as f: + IAR_DEFS = json.load(f) + + #supported targets have a device name and corresponding definition in + #iar_definitions.json + TARGETS = [target for target, obj in TARGET_MAP.iteritems() + if hasattr(obj, 'device_name') and + obj.device_name in IAR_DEFS.keys()] + + SPECIAL_TEMPLATES = { + 'rz_a1h' : 'iar/iar_rz_a1h.ewp.tmpl', + 'nucleo_f746zg' : 'iar/iar_nucleo_f746zg.ewp.tmpl' + } + + def iar_groups(self, grouped_src): + """Return a namedtuple of group info + Positional Arguments: + grouped_src: dictionary mapping a group(str) to sources + within it (list of file names) + Relevant part of IAR template + {% for group in groups %} + <group> + <name>group.name</name> + {% for file in group.files %} + <file> + <name>$PROJ_DIR${{file}}</name> + </file> + {% endfor %} + </group> + {% endfor %} + """ + IARgroup = namedtuple('IARgroup', ['name','files']) + groups = [] + for name, files in grouped_src.items(): + groups.append(IARgroup(name,files)) + return groups + + def iar_device(self): + """Retrieve info from iar_definitions.json""" + device_name = TARGET_MAP[self.target].device_name + device_info = self.IAR_DEFS[device_name] + iar_defaults ={ + "OGChipSelectEditMenu": "", + "CoreVariant": '', + "GFPUCoreSlave": '', + "GFPUCoreSlave2": 40, + "GBECoreSlave": 35 + } + + iar_defaults.update(device_info) + IARdevice = namedtuple('IARdevice', iar_defaults.keys()) + return IARdevice(**iar_defaults) + + def format_file(self, file): + """Make IAR compatible path""" + return join('$PROJ_DIR$',file) + + def format_src(self, srcs): + """Group source files""" + grouped = self.group_project_files(srcs) + for group, files in grouped.items(): + grouped[group] = [self.format_file(src) for src in files] + return grouped + + def get_ewp_template(self): + return self.SPECIAL_TEMPLATES.get(self.target.lower(), 'iar/ewp.tmpl') + + def generate(self): + """Generate the .eww, .ewd, and .ewp files""" + srcs = self.resources.headers + self.resources.s_sources + \ + self.resources.c_sources + self.resources.cpp_sources + \ + self.resources.objects + self.resources.libraries + flags = self.flags + flags['c_flags'] = list(set(flags['common_flags'] + + flags['c_flags'] + + flags['cxx_flags'])) + if '--vla' in flags['c_flags']: + flags['c_flags'].remove('--vla') + if '--no_static_destruction' in flags['c_flags']: + flags['c_flags'].remove('--no_static_destruction') + #Optimizations + if '-Oh' in flags['c_flags']: + flags['c_flags'].remove('-Oh') + ctx = { + 'name': self.project_name, + 'groups': self.iar_groups(self.format_src(srcs)), + 'linker_script': self.format_file(self.resources.linker_script), + 'include_paths': [self.format_file(src) for src in self.resources.inc_dirs], + 'device': self.iar_device(), + 'ewp': sep+self.project_name + ".ewp", + 'debugger': DeviceCMSIS(self.target).debug.replace('-','').upper() + } + ctx.update(flags) + + self.gen_file('iar/eww.tmpl', ctx, self.project_name+".eww") + self.gen_file('iar/ewd.tmpl', ctx, self.project_name + ".ewd") + self.gen_file(self.get_ewp_template(), ctx, self.project_name + ".ewp") + + def build(self): + """ Build IAR project """ + # > IarBuild [project_path] -build [project_name] + proj_file = join(self.export_dir, self.project_name + ".ewp") + + if find_executable("IarBuild"): + iar_exe = "IarBuild.exe" + else: + iar_exe = join('C:', sep, + 'Program Files (x86)', 'IAR Systems', + 'Embedded Workbench 7.5', 'common', 'bin', + 'IarBuild.exe') + if not exists(iar_exe): + raise Exception("IarBuild.exe not found. Add to path.") + + cmd = [iar_exe, proj_file, '-build', self.project_name] + p = Popen(cmd, stdout=PIPE, stderr=PIPE) + num_errors = 0 + #Parse the output for printing and errors + for line in p.stdout.readlines(): + sys.stdout.write(line) + error_re = '\s*Total number of errors:\s*(\d+)\s*' + m = re.match(error_re, line) + if m is not None: + num_errors = int(m.group(1)) + if num_errors !=0: + # Seems like something went wrong. + raise FailedBuildException("Project: %s build failed with %s erros" % ( + proj_file, num_errors))