Speaking about embedded software and hardware is related to speaking about critical systems, which by definition must be reliable systems with no failures at all. Or, in case of failures, systems must have enough intelligence to operate under certain safety conditions for a short period of time (fail-safe or recovery mode).
Keeping in mind the previous statement, there is only one way to develop successful embedded software and hardware, that is, following an exhaustive debugging and verification process. Here is where this book comes into action.
This book presents a comprehensive review of state-of-the-art techniques in the context of software and hardware debugging and verification. Debugging and verification methodologies are also largely analyzed and compared. Chapters include a deep analysis and discussion of real experiments (real systems) and depict the lessons learned as well as future steps or open questions. A solid and updated list of references closes every chapter.
After the first introductory chapter, the book deals with recent approaches, covering hardware emulator systems such as Cadence FPGA boards in chapter 2 and software debugging techniques such as dynamic temporal assertions in chapter 3. Another interesting topic deals with not only finding bugs, but also reproducing those bugs in order to analyze the conditions that led to them before fixing the code. Chapter 4 presents approaches to bug reproduction (for example, online monitors, log monitors, and so on). Chapter 5 highlights another big player in current debugging techniques: the use of visualization tools for examining the behavior of software execution at runtime (for example, sequence diagrams, timing diagrams).
Nowadays, embedded systems are not a synonym for isolated systems; the Internet of Things (IoT) is a good example of the complexity of current embedded systems. Here, heterogeneous systems exchange data and cooperate to control a given process. Chapter 6 addresses monitoring techniques for checking communications between embedded systems. The use of certain conditions in the source code in order to prove the correctness of the system is explained in chapter 7. Chapter 8 closes the book with a novel methodology, VERIFYR, in order to allow the user to verify embedded software with temporal properties.
This book is primarily aimed at software and hardware developers, software architects, and researchers and PhD candidates with a special focus on computer science and embedded systems.