About the Role
We are looking for an Embedded Software Engineer to design, develop, and maintain firmware for microcontroller-based systems. The ideal candidate has strong C/C++ skills, a solid grasp of embedded systems fundamentals, and can read hardware documentation and schematics while working closely with our hardware team.
Responsibilities
-
Design, implement, test, and maintain modular embedded firmware for microcontroller-based systems.
-
Own firmware subsystems independently, including communication stacks, state machines, RTOS-based software architecture, and application logic, from specification through deployment.
-
Develop firmware for interfacing with sensors, communication peripherals, actuators, and motor control systems using vendor SDKs and middleware.
-
Design firmware that is reliable, fault-tolerant, and maintainable for long-term field deployment.
-
Develop, integrate, and troubleshoot firmware-level communication interfaces, spanning wired protocols (UART, SPI, I C, CAN, RS-485), wireless/mesh technologies (Wi-Fi, BLE, LoRa, Zigbee, Thread), and networked/industrial protocols (Ethernet, Modbus RTU/TCP).
-
Debug firmware issues using JTAG/SWD debuggers and instrumentation/logging. Write unit and integration tests where feasible; contribute to build systems, automation scripts, and CI workflows using Git, CMake, and Python.
-
Read schematics and datasheets to understand hardware behavior and firmware constraints; participate in schematic reviews from a firmware perspective.
-
Prepare technical documentation including architecture documents, interface specifications, and build/release notes to support manufacturing, deployment, and field troubleshooting.
-
Collaborate with hardware and cross-functional engineering teams throughout the product development lifecycle.
Required Skills
-
Strong programming skills in C/C++, with solid grounding in data structures, algorithms, and software design principles for resource-constrained systems.
-
Strong understanding of microcontroller architecture, peripherals, interrupt handling, timers/PWM, ADC/DAC, DMA, RTC, and memory management.
-
Experience with RTOS task design and synchronization, including scheduling, semaphores, mutexes, queues, and memory management; ideally FreeRTOS.
-
Understanding of robust firmware design practices including fault handling, watchdog recovery, defensive programming, and long-term reliability.
-
Hands-on experience with STM32, ESP32, or other ARM Cortex-M microcontrollers.
-
Experience with bootloaders and firmware update mechanisms (OTA or wired).
-
Experience developing firmware using communication interfaces and protocols across at least two of the following categories: Wired: UART, SPI, I C, CAN, RS-485 Wireless/mesh: Wi-Fi, BLE, LoRa, Zigbee, Thread Networked/industrial: Ethernet, MQTT, Modbus RTU/TCP
-
Proficiency with Git and CMake; comfortable working in a Python-based development environment.
-
Ability to read schematics and datasheets to understand hardware behavior and firmware constraints.
-
Strong analytical, debugging, and problem-solving skills; capable of investigating intermittent and field-only firmware issues.
-
Ability to work effectively with cross-functional engineering teams.