Embedded Software Design : A Practical Approach to Architecture, Processes, and Coding Techniques