Real-time requirements in microcontroller based software systems leave the developer with fewer options in choosing the correct solution of the problem domain. Improving module reusability in resource-restricted environments might result in decreasing overall system performance, due to the introduction of new abstraction layers and components. This thesis examines the previous problem through the design procedure of a CAN data logging system. Several aspects of embedded software development are represented in the design process: device driver development, framework building and integration, migration to different hardware platforms, executing system tests in real-time environment. The application platform is based on a FAT file system framework with USB mass storage support. The thesis discusses the specialties of software development, using the C programming language and puts emphasis on the design patterns and methodologies presented in both the BSc. and MSc. courses and how to utilize them correctly in a microcontroller based environment. The application of design patterns in C is discussed in-depth through the system implementation process. The resulting embedded software system proves that design patterns provide a robust and efficient solution for each task, even without object-oriented language tools, and it becomes clear that improving reusability of modules doesn’t always decreases performance.