Despite many efforts to structure the development and design processes of embedded systems, errors are discovered at the final stages of production and sometimes after the delivery of the products. The cost of such errors can be prohibitive.Different design techniques to detect such errors will be presented. Moreover, we will try to describe the causes of these errors and the countermeasures that can be taken to avoid them. The main theme is that prevention is better than cure.The presentation is structured in three parts. The first part deals with an introduction to the subject area of embedded systems, a formal model for such systems is introduced. The main characteristics of embedded systems design and the interaction of these properties are described. A taxonomy for the structure of the software developed for such systems based on the amount of processes and processors involved is presented.The second part includes methods and techniques to detect software design errors.The third part deals with error prevention. It starts with a presentation of different models of the development processes used in industry and taught at universities. This leads us to deduce the major causes of errors that occur at the conceptual level during the specification and design processes.We propose some measures to be taken in order to prevent these errors from occurring in the first place. The conclusion summarizes our results and describes our present and future work in the area of the reliability of embedded systems.