/Roadmap-to-Embedded-Engineering

This repository should serve as a guide to everybody who wants to study software and hardware for embedded systems but doesn't know where to start.

Primary LanguageJava

Roadmap to Embedded Engineering

This repository should serve as a guide to anyone who wants to study software and hardware for embedded systems but doesn't know where to start.

Motivation

Maybe some undergratuate students who wants to study and work with embedded systems have found some difficulty to know what to study. Many are used to work with Arduino, which is a good start, but when it comes to make prototypes and projects more like real world projects, making hardware and software more professional, it's hard to know the best way to do it.

I notice the problem when I started to look for internships and Jr. jobs. The companies are always asking for knowledge that the university doesn't teach usually. Of course, if you are a Computer Engineering student or some course related, you'll have a strong base to work in this area. But this isn't enough.

To work serious with embedded systems, some preparation is necessary, in order to achieve the knowledge needed to work with both universes: software and hardware.

Nota para quem não fala inglês: Um dos principais requisitos exigidos na maioria dos cargos oferecidos na área é um conhecimento em inglês suficientemente bom para falar e escrever, no mínimo. Por este motivo o repositório e tudo que for escrito será em inglês, não só para incentivar a leitura e aumentar o alcance dos temas abordados, mas também para que eu mesmo pratique a escrita dia após dia.

Note to non english speakers: One of the main requisites that are required in jobs and internships is english. At least you need to speak and write. That's the reason this repository is being written in english, not only to increase reach, but for me either to train english everyday.

Index

Under construction!

Goals

The main goal here is to study most of the things needed to work with embedded engineering. With a lot of research I've done a collection of subjects that we need to know. Based on what professionals in the field says and what internships and junior jobs asks, we'll study the main topics in order to be prepared.

How will this works

We are going to explore two main subjects: software and hardware. This repository structure will be divided in directories, which every one will have their own README with links to access courses, indications of books, articles and examples of the exercises that I'll do and document.

This repository should be updated a lot, in order to give you the best way to learn all of the subjects that will be learned.

Some study subjects

I'll list some fo the topics that we will see and explain in this repository.

  • Software

    • Programming languages (basic and advanced subjects)
      • C/C++, Python/Micropython, Java, Rust
    • Object-oriented programming (OOP) concepts
    • Data Structure
    • Algorithms
    • Bare-metal programming
    • RTOS Knowledge (Real-time operating systems)
    • OS programming (Linux)
    • Linux OS practical usage
    • Bits manipulation
    • DIP (Digital Image Processing)
    • DSP (Digital Signal Processing)
    • Database technologies
    • Native android development with Java and C++ (NDK)
  • Hardware

    • Digital Logic
    • Hardware architecture (Arduino MCU among others)
    • Core (CPU, Registers, Bus, Cache, Flash/SRAM/DRAM memories)
    • Features and peripherals (GPIO, PWM, Clock, Watchdog, ADC, DMA, EEPROM, RTC, etc)
    • Protocols (UART, I²C, SPI)
    • Understand WiFi, Bluetooth, ZigBee and others
    • Interrupters, Timers, Counters
    • Microcontrollers interface (e.g AVR Programming or Arm Cortex)
    • PCB Design
    • Datasheet reading

Real world examples of internships and jobs offers

Click on the offers to see some examples. I will update this section whenever interesting opportunities arise to show.

Eldorado Institute - Embedded Software Analyst

Activities

  • Develop mobile and desktop functionality for automated testing in cellphone manufacturing
  • Lead technical analysis and implementation
  • Perform critical analysis of risks and impacts

Requisites

  • Graduation in a course in the area of technology
  • Experience with Java, C/C++, Python and Shell
  • Experience with Linux Kernel and programming Device Drivers for Linux
  • Experience with problem analysis and investigation
  • Advanced or fluent English, to chat, write and read
  • Availability to travel

Candidate differentials

  • Experience with projects for mobile solutions (especially Android)

Eldorado Institute - Embedded Systems Developer (1)

Activities

  • Kernel Development for Android Smartphones
  • Analysis and suitability of drivers, bootloader and other kernel modules for new platforms and new versions of the Android Operating System
  • Analysis and correction of flaws in Android code related to the Kernel

Requisites

  • Graduation in a course in the area of technology
  • Experience with embedded software development using C language
  • Familiarity with Linux and working with a remote server
  • Andvanced english

CITeB - Embedded Systems Developer (2)

Team guided by agile principles, where the professional needs to analyze, research, specify, plan, develop, implement and test.

Profile

  • Balancing urgency and quality
  • Motivation to seek continuous improvement in processes
  • Self-taught and resourceful with new technologies
  • Abstract problems and think of efficient solutions

Requisites

  • Advanced knowledge with Linux Operational System
  • Languages: C, Shell Script, Lua and Python
  • Knowledge of embedded systems architecture
  • Gerenciamento de memória, GPIO, barramentos, etc
  • Knowledge of network protocols, wireless networks and wireless communication protocols (IEEE 802.11)
  • Git

Candidate differentials

  • Experience in Device Drivers development for Linux
  • Webservices development or Restful API
  • Knowledge of software-hardware integration and basic hardware testing
  • Knowledge in IoT communication protocols
  • TDD, BDD, Code Review, Pair programming
  • Agile development methodologies

Eldorado Institute - C/C++ Android Developer

Profile

  • Integration and development of software modules embedded in the camera application in C ++
  • Development and maintenance of Android camera frameworks and drivers
  • Search for and fix faults

Requisites

  • Graduation in a course in the area of technology
  • Experience with embedded software in C++
  • Desirable knowledge in Android app (Java, Kotlin)
  • Advanced English for daily contact with outside team

Axpr Valve Science - Embedded systems/devices developer

Profile

  • Act developing embedded hardware projects
  • Integrating sensors/devices with desktop platforms
  • Work and develop IoT systems
  • Create/Develop communication interfaces with desktop or web environments
  • Propose/Discuss solution strategies to industrial problems using embedded systems
  • Developing firmware to embedded systems
  • Communication with software developers team to specify communication interfaces

Requisites

  • Responsable, problem solver and organized
  • Graduation in a course in the area of technology
  • Focuses on having results and desire to learn
  • Knowledge on:
    • Developing PCB (Printed Circuit Board)
    • Use of hardware platforms like: Raspberry Pi, Arduino, ESP32, etc
    • Structural programming language (Preferably C)
    • OOP programming language (Preferably python/C#)
    • Industrial communication protocols (I²C, hart, etc)

Candidate differentials

  • Git
  • Linux environment
  • Intermediate english

Espressif Systems - Embedded Software Engineer

Profile

  • Develop and improve support for Espressif chips in RTOSes (such as Zephyr, NuttX) and frameworks (MicroPython, Arduino).
  • Collaborate with upstream projects, submitting features and bug fixes.
  • Help customers advance their progress on projects by offering technical support and helping them troubleshoot software issues.
  • Work closely with the teams developing other aspects of Espressif software and tools.
  • Write documentation such as application notes, tutorials, and API guides.

Requisites

  • Bachelor’s degree or above, in Computer Engineering, Electronic Engineering, Communications Engineering, or other related disciplines.
  • At least 4 years’ work experience in the field of Embedded Software Development.
  • Excellent knowledge of C language.
  • Familiar with low-level aspects of RTOS.
  • Familiar with command line tools (Linux / Unix) and at least one scripting language (shell, Python).
  • Experience with git version control system.

Any of the following would be a strong plus:

  • Prior experience in projects with operating systems and frameworks like Zephyr, Nuttx, Micropython, Lua, etc.
  • Knowledge of hardware communication protocols: SPI, UART, I2C, I2S.
  • Knowledge of network protocols, such as TCP, UDP, TLS, HTTP.
  • Knowledge of Bluetooth LE, GAP, GATT.

Venturus - Junior Firmware Developer

Profile

The challenge is to develop firmware in a innovation project with partnership with a automobilistic company.

Requisites

  • Basic Knowledge of electronics
  • Experience with C or C++ programming for embedded systems
  • Solid knowledge on microcontrollers programming
  • Knowledge using peripherals I2C, I2S, SPI
  • Familiar with RTOS (FreeRTOS or others)
  • Basic notion on analog and digital electronics

Candidate differentials

  • Experience with hardware bring-up
  • Proficiency with any SoC based in Arm Cortex M
  • Knowledge on firmware development for Arm and/or Xtensa microcontrollers
  • Is desirable knowledge on DSP (SigmaStudio)
  • Bachelor’s degree or above, in Computer Engineering, Electronic Engineering, Communications Engineering, or other related disciplines

Stone - C++ Developer

Profile

We are looking for creative software developers, responsible, with energy and focus to solve problems with quality. We also value your pratical skills to develop systems and capability to work with a team. You are going to develop embedded software with C++ using framework Qt, facing hardware limitations and making low resources becoming an product with high performance. Your work will affect milions of brazilians across the country.

Requisites

  • Continuous learning mindset
  • Fluency on a certain programming language: C++, C, Java
  • Experience with OOP
  • Experience with embedded development
  • Experience with Qt

Candidate differentials

  • Experience with:
    • Relational database
    • Telecommunications
    • Linux
    • Android
    • Javascript

General Content

Here I'll put some content that are useful, not only for studying but also implementing and practicing in real life projects.

README

👁‍🗨 Good documentation can be the key to your project's success.

Title Access Link Platform Type Tier Difficulty Summary
Writing READMEs Link Free Course Beginner Udacity Documentation is an important part of the development process. Learn to write READMEs using Markdown so your code can be used by other humans! (Text from course)

Version Control - Git

👁‍🗨 The versioning system in the development world is a necessary knowledge in practically 100% of the serious projects you are likely to work on. Whether in professional or personal projects, having a solid foundation in this is essential to ensure a good workflow, as well as being an ally of documentation.

Title Access Link Platform Type Tier Difficulty Summary
Introduction to Git Link Free Lecture¹ Beginner YouTube/Notes Why is version control useful? Even when you’re working by yourself, it can let you look at old snapshots of a project, keep a log of why certain changes were made, work on parallel branches of development, and much more. When working with others, it’s an invaluable tool for seeing what other people have changed, as well as resolving conflicts in concurrent development. (Text from lecture notes)

[¹] Lecture notes have a lot of usefil links that you can use to learn more about the tool and see more advanced content.

YouTube contents to watch

Channel/Playlist name Access Link Content Type
Michael Reeves Michael does a lot of crazy and creative projects that you probably will never reproduce at home. Good to have fun watching. Link Ideas, Projects, Entertainment
Anastasi In Tech Anastasi shares a lot of updated information on hardware development and news from hardware world. Link Learning, Hardware
Jacob Sorber Jacob is a teacher that shares information, tips and gives good lessons about software and embedded development. Link Learning, Software, Embedded
Modern Embedded Systems Programming Course This is an old playlist that is being updated for a long time with valuable lessons regarding Embedded Systems. Link Software, Hardware, Learning
Stuff Made Here Another channel with crazy and creative projects to watch and have some fun! Link Ideas, Projects, Entertainment

Software Content

Android Development

Title Access Link Platform Type Tier Difficulty Summary
Developing Android Apps Link Udacity Course Free Beginner¹ This course blends theory and practice to help you build great apps the right way. In this course, you'll work with instructors step-by-step to build a cloud-connected Android app, and learn best practices of mobile development, and Android development in particular. (Text from course)

[¹] It's a beginner course in Android field, but needs previous knowledge with programming language (Java or C++) and OOP

Data Structure

Title Access Link Platform Type Tier Difficulty Summary
Data Structures from MyCodeSchool Link YouTube Video Lessons Free Intermediate¹ In this series of lessons, we will study and implement data structures. We will be implementing these data structures in c or c++. Pre-requisite for this lesson is good understanding of pointers in C. (Text from author)
Principles of Data Structures Using C and C++ Link Book Lessons Free Intermediate¹ Programming methodologies deal with different methods of designing programs. This will teach you how to program efficiently (Text from book)

[¹] C/C++ programming is necessary to implement and practice the data structures that are showed in playlist. If you are just looking for data structure knowledge, you can just watch the teorical videos explaining them.

RTOS (Real Time Operating System)

👁‍🗨 A real-time operating system (RTOS) is an operating system that runs multi-threaded applications and can meet real-time deadlines.

Title Access Link Platform Type Tier Difficulty Summary
Introduction to RTOS Link YouTube Course Free Beginner¹ This course will show you how to use basic concepts of RTOS with FreeRTOS. You can practice using any tools that you have (Arduino IDE, ESP-IDF, STM Cube, PlatformIO), learning what you need to build your first applications with RTOS.

[1] It's a beginner course, but probably it's good if you already have knowledge on Arduino and/or boards like ESP32 development.

Qt: for embedded GUI applications

👁‍🗨 Often you can find job offers with Qt applications on embedded devices. It's a C++ framework that can run anywhere (Linux, Windows, MacOS, Android, IOS, Raspberry, etc) and have more than 25 years of development and presence on the market.

❕ Bryan Cairns is one of the best Qt teachers. He also have a lot of great paid courses on Udemy, but I'll not put them here, becase they are easy to find. If you want his paid courses for free, you can access the facebook page that he created to exchange knowledge about programming. Very often he gives several Cupom Codes for people who wants to learn from his courses for free.

Title Access Link Platform Type Tier Difficulty Summary
Introduction to Qt 5 Link Youtube Course Free Beginner¹ Qt5 still have some LTS (Long-Term-Support) versions and it's very used on many projects today, since Qt6 was recently released. Also have all the stable features available.
Introduction to Qt 6 Link Youtube Course Free Beginner¹ Qt6 is the las version of Qt bringing all the new features and updates from the company.

[1] It's a beginner course, but since this is a C++ Framework, it is recommended that you learn basics of C++ before.

Cmake

👁‍🗨 CMake is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice. (Text from official website)

Title Access Link Platform Type Tier Difficulty Summary
How to CMake Good Link YouTube Course Free Beginner Sometimes there is beginners topics that are not so easy to learn and Cmake is one of them. This playlist teaches step-by-step some easy explainings about Cmake to learn and practice! The teacher is the maintainer of the famous VSCode extension CMake Tools.

Hardware Content

Under construction!