PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 """ Configurable hooks in the build system. Can be used by various platforms
demayer 0:6bf0743ece18 2 to customize the build process.
demayer 0:6bf0743ece18 3 """
demayer 0:6bf0743ece18 4
demayer 0:6bf0743ece18 5 ################################################################################
demayer 0:6bf0743ece18 6 # Hooks for the various parts of the build process
demayer 0:6bf0743ece18 7
demayer 0:6bf0743ece18 8 # Internal mapping of hooks per tool
demayer 0:6bf0743ece18 9 _HOOKS = {}
demayer 0:6bf0743ece18 10
demayer 0:6bf0743ece18 11 # Internal mapping of running hooks
demayer 0:6bf0743ece18 12 _RUNNING_HOOKS = {}
demayer 0:6bf0743ece18 13
demayer 0:6bf0743ece18 14 # Available hook types
demayer 0:6bf0743ece18 15 _HOOK_TYPES = ["binary", "compile", "link", "assemble"]
demayer 0:6bf0743ece18 16
demayer 0:6bf0743ece18 17 # Available hook steps
demayer 0:6bf0743ece18 18 _HOOK_STEPS = ["pre", "replace", "post"]
demayer 0:6bf0743ece18 19
demayer 0:6bf0743ece18 20 # Hook the given function. Use this function as a decorator
demayer 0:6bf0743ece18 21 def hook_tool(function):
demayer 0:6bf0743ece18 22 """Decorate a function as a tool that may be hooked"""
demayer 0:6bf0743ece18 23 tool = function.__name__
demayer 0:6bf0743ece18 24 tool_flag = "_" + tool + "_done"
demayer 0:6bf0743ece18 25 def wrapper(t_self, *args, **kwargs):
demayer 0:6bf0743ece18 26 """The hooked function itself"""
demayer 0:6bf0743ece18 27 # if a hook for this tool is already running, it's most likely
demayer 0:6bf0743ece18 28 # coming from a derived class, so don't hook the super class version
demayer 0:6bf0743ece18 29 if _RUNNING_HOOKS.get(tool, False):
demayer 0:6bf0743ece18 30 return function(t_self, *args, **kwargs)
demayer 0:6bf0743ece18 31 _RUNNING_HOOKS[tool] = True
demayer 0:6bf0743ece18 32 # If this tool isn't hooked, return original function
demayer 0:6bf0743ece18 33 if not _HOOKS.has_key(tool):
demayer 0:6bf0743ece18 34 res = function(t_self, *args, **kwargs)
demayer 0:6bf0743ece18 35 _RUNNING_HOOKS[tool] = False
demayer 0:6bf0743ece18 36 return res
demayer 0:6bf0743ece18 37 tooldesc = _HOOKS[tool]
demayer 0:6bf0743ece18 38 setattr(t_self, tool_flag, False)
demayer 0:6bf0743ece18 39 # If there is a replace hook, execute the replacement instead
demayer 0:6bf0743ece18 40 if tooldesc.has_key("replace"):
demayer 0:6bf0743ece18 41 res = tooldesc["replace"](t_self, *args, **kwargs)
demayer 0:6bf0743ece18 42 # If the replacement has set the "done" flag, exit now
demayer 0:6bf0743ece18 43 # Otherwise continue as usual
demayer 0:6bf0743ece18 44 if getattr(t_self, tool_flag, False):
demayer 0:6bf0743ece18 45 _RUNNING_HOOKS[tool] = False
demayer 0:6bf0743ece18 46 return res
demayer 0:6bf0743ece18 47 # Execute pre-function before main function if specified
demayer 0:6bf0743ece18 48 if tooldesc.has_key("pre"):
demayer 0:6bf0743ece18 49 tooldesc["pre"](t_self, *args, **kwargs)
demayer 0:6bf0743ece18 50 # Execute the main function now
demayer 0:6bf0743ece18 51 res = function(t_self, *args, **kwargs)
demayer 0:6bf0743ece18 52 # Execute post-function after main function if specified
demayer 0:6bf0743ece18 53 if tooldesc.has_key("post"):
demayer 0:6bf0743ece18 54 post_res = tooldesc["post"](t_self, *args, **kwargs)
demayer 0:6bf0743ece18 55 _RUNNING_HOOKS[tool] = False
demayer 0:6bf0743ece18 56 return post_res or res
demayer 0:6bf0743ece18 57 else:
demayer 0:6bf0743ece18 58 _RUNNING_HOOKS[tool] = False
demayer 0:6bf0743ece18 59 return res
demayer 0:6bf0743ece18 60 return wrapper
demayer 0:6bf0743ece18 61
demayer 0:6bf0743ece18 62 class Hook(object):
demayer 0:6bf0743ece18 63 """A compiler class that may be hooked"""
demayer 0:6bf0743ece18 64 def __init__(self, target, toolchain):
demayer 0:6bf0743ece18 65 _HOOKS.clear()
demayer 0:6bf0743ece18 66 self._cmdline_hooks = {}
demayer 0:6bf0743ece18 67 self.toolchain = toolchain
demayer 0:6bf0743ece18 68 target.init_hooks(self, toolchain)
demayer 0:6bf0743ece18 69
demayer 0:6bf0743ece18 70 # Hook various functions directly
demayer 0:6bf0743ece18 71 @staticmethod
demayer 0:6bf0743ece18 72 def _hook_add(hook_type, hook_step, function):
demayer 0:6bf0743ece18 73 """Add a hook to a compile function
demayer 0:6bf0743ece18 74
demayer 0:6bf0743ece18 75 Positional arguments:
demayer 0:6bf0743ece18 76 hook_type - one of the _HOOK_TYPES
demayer 0:6bf0743ece18 77 hook_step - one of the _HOOK_STEPS
demayer 0:6bf0743ece18 78 function - the function to add to the list of hooks
demayer 0:6bf0743ece18 79 """
demayer 0:6bf0743ece18 80 if hook_type not in _HOOK_TYPES or hook_step not in _HOOK_STEPS:
demayer 0:6bf0743ece18 81 return False
demayer 0:6bf0743ece18 82 if hook_type not in _HOOKS:
demayer 0:6bf0743ece18 83 _HOOKS[hook_type] = {}
demayer 0:6bf0743ece18 84 _HOOKS[hook_type][hook_step] = function
demayer 0:6bf0743ece18 85 return True
demayer 0:6bf0743ece18 86
demayer 0:6bf0743ece18 87 def hook_add_compiler(self, hook_step, function):
demayer 0:6bf0743ece18 88 """Add a hook to the compiler
demayer 0:6bf0743ece18 89
demayer 0:6bf0743ece18 90 Positional Arguments:
demayer 0:6bf0743ece18 91 hook_step - one of the _HOOK_STEPS
demayer 0:6bf0743ece18 92 function - the function to add to the list of hooks
demayer 0:6bf0743ece18 93 """
demayer 0:6bf0743ece18 94 return self._hook_add("compile", hook_step, function)
demayer 0:6bf0743ece18 95
demayer 0:6bf0743ece18 96 def hook_add_linker(self, hook_step, function):
demayer 0:6bf0743ece18 97 """Add a hook to the linker
demayer 0:6bf0743ece18 98
demayer 0:6bf0743ece18 99 Positional Arguments:
demayer 0:6bf0743ece18 100 hook_step - one of the _HOOK_STEPS
demayer 0:6bf0743ece18 101 function - the function to add to the list of hooks
demayer 0:6bf0743ece18 102 """
demayer 0:6bf0743ece18 103 return self._hook_add("link", hook_step, function)
demayer 0:6bf0743ece18 104
demayer 0:6bf0743ece18 105 def hook_add_assembler(self, hook_step, function):
demayer 0:6bf0743ece18 106 """Add a hook to the assemble
demayer 0:6bf0743ece18 107
demayer 0:6bf0743ece18 108 Positional Arguments:
demayer 0:6bf0743ece18 109 hook_step - one of the _HOOK_STEPS
demayer 0:6bf0743ece18 110 function - the function to add to the list of hooks
demayer 0:6bf0743ece18 111 """
demayer 0:6bf0743ece18 112 return self._hook_add("assemble", hook_step, function)
demayer 0:6bf0743ece18 113
demayer 0:6bf0743ece18 114 def hook_add_binary(self, hook_step, function):
demayer 0:6bf0743ece18 115 """Add a hook to the elf to binary tool
demayer 0:6bf0743ece18 116
demayer 0:6bf0743ece18 117 Positional Arguments:
demayer 0:6bf0743ece18 118 hook_step - one of the _HOOK_STEPS
demayer 0:6bf0743ece18 119 function - the function to add to the list of hooks
demayer 0:6bf0743ece18 120 """
demayer 0:6bf0743ece18 121 return self._hook_add("binary", hook_step, function)
demayer 0:6bf0743ece18 122
demayer 0:6bf0743ece18 123 # Hook command lines
demayer 0:6bf0743ece18 124 def _hook_cmdline(self, hook_type, function):
demayer 0:6bf0743ece18 125 """Add a hook to a command line function
demayer 0:6bf0743ece18 126
demayer 0:6bf0743ece18 127 Positional arguments:
demayer 0:6bf0743ece18 128 hook_type - one of the _HOOK_TYPES
demayer 0:6bf0743ece18 129 function - the function to add to the list of hooks
demayer 0:6bf0743ece18 130 """
demayer 0:6bf0743ece18 131 if hook_type not in _HOOK_TYPES:
demayer 0:6bf0743ece18 132 return False
demayer 0:6bf0743ece18 133 self._cmdline_hooks[hook_type] = function
demayer 0:6bf0743ece18 134 return True
demayer 0:6bf0743ece18 135
demayer 0:6bf0743ece18 136 def hook_cmdline_compiler(self, function):
demayer 0:6bf0743ece18 137 """Add a hook to the compiler command line
demayer 0:6bf0743ece18 138
demayer 0:6bf0743ece18 139 Positional arguments:
demayer 0:6bf0743ece18 140 function - the function to call
demayer 0:6bf0743ece18 141 """
demayer 0:6bf0743ece18 142 return self._hook_cmdline("compile", function)
demayer 0:6bf0743ece18 143
demayer 0:6bf0743ece18 144 def hook_cmdline_linker(self, function):
demayer 0:6bf0743ece18 145 """Add a hook to the linker command line
demayer 0:6bf0743ece18 146
demayer 0:6bf0743ece18 147 Positional arguments:
demayer 0:6bf0743ece18 148 function - the function to call
demayer 0:6bf0743ece18 149 """
demayer 0:6bf0743ece18 150 return self._hook_cmdline("link", function)
demayer 0:6bf0743ece18 151
demayer 0:6bf0743ece18 152 def hook_cmdline_assembler(self, function):
demayer 0:6bf0743ece18 153 """Add a hook to the assembler command line
demayer 0:6bf0743ece18 154
demayer 0:6bf0743ece18 155 Positional arguments:
demayer 0:6bf0743ece18 156 function - the function to call
demayer 0:6bf0743ece18 157 """
demayer 0:6bf0743ece18 158 return self._hook_cmdline("assemble", function)
demayer 0:6bf0743ece18 159
demayer 0:6bf0743ece18 160 def hook_cmdline_binary(self, function):
demayer 0:6bf0743ece18 161 """Add a hook to the elf to bin tool command line
demayer 0:6bf0743ece18 162
demayer 0:6bf0743ece18 163 Positional arguments:
demayer 0:6bf0743ece18 164 function - the function to call
demayer 0:6bf0743ece18 165 """
demayer 0:6bf0743ece18 166 return self._hook_cmdline("binary", function)
demayer 0:6bf0743ece18 167
demayer 0:6bf0743ece18 168 # Return the command line after applying the hook
demayer 0:6bf0743ece18 169 def _get_cmdline(self, hook_type, cmdline):
demayer 0:6bf0743ece18 170 """Get the command line after running all hooks
demayer 0:6bf0743ece18 171
demayer 0:6bf0743ece18 172 Positional arguments:
demayer 0:6bf0743ece18 173 hook_type - one of the _HOOK_TYPES
demayer 0:6bf0743ece18 174 cmdline - the initial command line
demayer 0:6bf0743ece18 175 """
demayer 0:6bf0743ece18 176 if self._cmdline_hooks.has_key(hook_type):
demayer 0:6bf0743ece18 177 cmdline = self._cmdline_hooks[hook_type](
demayer 0:6bf0743ece18 178 self.toolchain.__class__.__name__, cmdline)
demayer 0:6bf0743ece18 179 return cmdline
demayer 0:6bf0743ece18 180
demayer 0:6bf0743ece18 181 def get_cmdline_compiler(self, cmdline):
demayer 0:6bf0743ece18 182 """Get the compiler command line after running all hooks
demayer 0:6bf0743ece18 183
demayer 0:6bf0743ece18 184 Positional arguments:
demayer 0:6bf0743ece18 185 cmdline - the initial command line
demayer 0:6bf0743ece18 186 """
demayer 0:6bf0743ece18 187 return self._get_cmdline("compile", cmdline)
demayer 0:6bf0743ece18 188
demayer 0:6bf0743ece18 189 def get_cmdline_linker(self, cmdline):
demayer 0:6bf0743ece18 190 """Get the linker command line after running all hooks
demayer 0:6bf0743ece18 191
demayer 0:6bf0743ece18 192 Positional arguments:
demayer 0:6bf0743ece18 193 cmdline - the initial command line
demayer 0:6bf0743ece18 194 """
demayer 0:6bf0743ece18 195 return self._get_cmdline("link", cmdline)
demayer 0:6bf0743ece18 196
demayer 0:6bf0743ece18 197 def get_cmdline_assembler(self, cmdline):
demayer 0:6bf0743ece18 198 """Get the assmebler command line after running all hooks
demayer 0:6bf0743ece18 199
demayer 0:6bf0743ece18 200 Positional arguments:
demayer 0:6bf0743ece18 201 cmdline - the initial command line
demayer 0:6bf0743ece18 202 """
demayer 0:6bf0743ece18 203 return self._get_cmdline("assemble", cmdline)
demayer 0:6bf0743ece18 204
demayer 0:6bf0743ece18 205 def get_cmdline_binary(self, cmdline):
demayer 0:6bf0743ece18 206 """Get the binary command line after running all hooks
demayer 0:6bf0743ece18 207
demayer 0:6bf0743ece18 208 Positional arguments:
demayer 0:6bf0743ece18 209 cmdline - the initial command line
demayer 0:6bf0743ece18 210 """
demayer 0:6bf0743ece18 211 return self._get_cmdline("binary", cmdline)
demayer 0:6bf0743ece18 212
demayer 0:6bf0743ece18 213 ################################################################################
demayer 0:6bf0743ece18 214