Automatic parallelization of embedded software using hierarchical task graphs and integer linear programming