Analog Devices · Software Engineer
Updated · 2026-10-02

Analog Devices Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Analog Devices (ADI) makes semiconductors: data converters, power management parts, RF microelectronics and edge-processing chips. Candidates describe software work that sits right next to the silicon. That means firmware and embedded drivers for ARM Cortex microcontrollers, Linux device drivers, post-silicon validation software, SystemVerilog and UVM verification environments, and real-time control and DSP code. The role also covers evaluation-board APIs, GUI configuration tools for external customers, and register-map and API documentation. Day to day, the reported work involves analog designers, system architects and field application engineers, and debugging uses logic analyzers, oscilloscopes, JTAG probes and emulators. In practice your code is judged against timing, latency, power and memory limits set by the hardware.

This guide is for candidates interviewing for a Software Engineer role at Analog Devices, whether the team leans toward embedded firmware, design verification, applications engineering or DSP. It covers the six stages candidates report, from the recruiter pre-screen to the offer. It gives question-specific guidance for all 23 reported questions: register access and volatile in C, memory layout, ring buffers, Cortex-M interrupts, metastability and Gray-code FIFOs, setup and hold timing, serial protocols, packet-parsing state machines, RC filters, MOSFETs, op-amps, ADC errors, nodal analysis, sampling, FIR and IIR filters, the FFT, fixed-point PID, and four behavioral questions about hardware-software work.

Candidates report six stages over roughly 4-6 weeks: Recruiter Pre-Screen, Online Assessment, Technical Discussions, Technical Sessions (3 to 5 sessions, virtual or onsite), Candidate Evaluation and Offer Delivery.

Digital Electronics FundamentalsAnalog Electronics FundamentalsStatic Timing Analysis (STA)

46 min read

Browse Software Engineer questions

See the practice prompts

3Candidate experiences ↗Read their reports
25Practice promptsAcross five skill areas

Software at Analog Devices controls and validates analog and mixed-signal silicon, so the reported questions go well beyond standard algorithm puzzles. They fall into five groups: embedded C and low-level systems, digital logic and RTL, analog circuit analysis, signals and DSP, and behavioral questions about hardware-software projects. Candidates also name Digital Electronics Fundamentals, Analog Electronics Fundamentals, Static Timing Analysis, Verilog Programming, and FPGA Concepts and Architecture as recurring topics. A software applicant who prepares only C and data structures will meet setup-time, op-amp and aliasing questions unprepared.

On the C side, prepare to explain what the compiler and the processor actually do. Know why a register pointer must be volatile and what volatile still does not guarantee. Know what the Cortex-M hardware pushes onto the stack before your ISR runs, how .data and .bss get initialised before main, and how to build a ring buffer that an ISR and the main loop can share without locks or malloc. The scenario questions candidates report follow the same pattern: reversing the bits of a 32-bit register, and debugging a deadlock between two RTOS tasks sharing an I2C driver.

On the hardware side, the bar candidates describe is fundamentals you can derive at a whiteboard, not IC design. You should be able to get an RC low-pass transfer function and its cutoff, apply KCL to a resistor network, compute a maximum clock frequency from flop and logic delays, explain why async FIFO pointers are Gray-coded, and turn ADC resolution into volts per code. The reported scenarios include 16-bit versus 12-bit step size on a 3.3 V rail and an op-amp gain derivation with a falling load resistance. For each of these, practise saying what it means for the software that reads the signal.

Candidates report that technical rounds mix direct questions, code analysis, logic and schematic evaluation, and deep dives into resume projects, and that follow-ups add new constraints or hints. Prepare every topic in two layers: a crisp first answer, then the follow-up about the edge case, the failure mode or the number. Prepare your own projects down to the register and timing level as well.

01

Recruiter Pre-Screen

reported

Candidates report a recruiter screen on fit for the role. Questions at Analog Devices differ by team (embedded, verification, applications or DSP), so use this call to find out which domain your loop leans toward. Then weight your preparation across C, digital logic, circuits and DSP to match. Give a short account of your background that leads with any work where your software touched physical hardware: microcontrollers, sensors, FPGAs or test benches.

What to demonstrate

  • Fit between your background and the team's domain (embedded, verification, applications or DSP)
  • Whether your hands-on experience includes hardware-facing software
  • Clear communication about your projects and motivation

How to prepare

  • Write a two-minute background summary that names the MCU, bus, RTOS or HDL you actually used in each project.
  • Ask which domain the team works in and whether the next step is an online assessment or a technical screening interview.
  • List the stack items from the requirements candidates describe (C/C++, SPI/I2C/UART/CAN, JTAG/SWD, oscilloscopes, Python, SystemVerilog) and mark where you have real experience.
Analog Devices Software Engineer candidate reports ↗
02

Online Assessment

reported

Candidates report either an online assessment or a technical screening interview at this stage. Written or automated tests are reported as common, especially for university hires and specialised teams, and they cover digital electronics fundamentals, C syntax, logic problems and basic aptitude. Expect short questions where precision matters more than design: predicting C output, bit manipulation, Boolean simplification and number-system conversions. If you get a screening interview instead, the same fundamentals come up spoken aloud.

What to demonstrate

  • Correct reading and writing of C, including pointers, integer types and bitwise operators
  • Digital electronics fundamentals: gates, flip-flops, number systems, Boolean logic
  • Logic and aptitude problems solved accurately

How to prepare

  • Drill C output-prediction items: pointer arithmetic, operator precedence, integer promotion of uint8_t, signed shift, sizeof of arrays versus pointers.
  • Write bit-manipulation routines from memory: set/clear/toggle a field, count set bits, reverse the 32 bits of a register in O(log n) swap steps.
  • Practise Karnaugh maps, two's complement, hex/binary/Gray conversion and basic flip-flop truth tables until each takes seconds.
Analog Devices Software Engineer candidate reports ↗
03

Technical Discussions

reported

Candidates report detailed technical discussions with engineering managers and team members after the initial assessment. Reports describe resume projects being taken apart down to low-level implementation choices: architecture diagrams, why a peripheral or bus was chosen, and how a hard failure was debugged. For each project, prepare the hardware boundary (registers, interrupts, DMA, timing), one real trade-off, and one bug you isolated with instruments, and be ready to draw the system.

What to demonstrate

  • Depth of understanding of your own projects at the register and timing level
  • Structured debugging of hardware-software failures
  • Ability to explain design trade-offs and reason aloud

How to prepare

  • For each resume project, sketch the block diagram: MCU, peripherals, buses, interrupt sources, memory budget, and where your code ran.
  • Prepare a hardware-software bug story with the evidence that separated code from silicon (scope or logic-analyzer capture, register dump over JTAG, errata).
  • Rehearse the volatile, memory-layout and Cortex-M interrupt-entry questions aloud, since they connect directly to firmware projects.
Analog Devices Software Engineer candidate reports ↗
04

Technical Sessions

reported

Candidates report 3 to 5 separate technical sessions, run virtually or as an onsite day, with most technical rounds lasting 45 to 60 minutes. Reports describe a mix of direct technical questions, code analysis, logic and schematic evaluation, and resume deep dives, with follow-ups that add constraints or offer hints. This is where the full breadth comes in, so practise each area as a spoken answer with a whiteboard sketch: embedded C, digital logic and timing, circuits, and DSP. When you get stuck, state your assumptions and work from first principles, because candidates report that hints are offered.

What to demonstrate

  • Working C for embedded problems (buffers, state machines, fixed-point arithmetic)
  • Digital logic and timing reasoning: synchronizers, Gray code, setup/hold, max frequency
  • Circuit and signal analysis: KCL, RC filters, op-amps, ADC errors, sampling and filtering
  • Problem-solving process under new constraints or hints

How to prepare

  • Write a lock-free SPSC ring buffer and a byte-driven packet-parser FSM in C on paper, then test both against wraparound and corrupted input.
  • Work timing numerically: max clock frequency from t_clk-q, logic delay, setup and skew, and a hold check for the same path.
  • Derive the RC low-pass response, solve a three-node KCL network, and convert 12-bit and 16-bit resolutions on a 3.3 V reference into volts per code.
  • Explain FIR versus IIR, FFT complexity and windowing, and write a fixed-point PID step with saturation and anti-windup.
Analog Devices Software Engineer candidate reports ↗
05

Candidate Evaluation

reported

Candidates report an evaluation step after the technical rounds that covers performance across the sessions and fit for the team. Little else is reported about it. Your preparation is already done by this point, but a short note to the recruiter can correct or complete an answer you fumbled, for example a timing calculation you finished after the session.

What to demonstrate

  • Overall performance across the technical sessions
  • Fit for the specific team

How to prepare

  • Right after the loop, write down every question you were asked and how you answered, and flag any you would correct.
  • If you worked out a better answer afterwards, send the recruiter a brief, factual correction rather than a general thank-you.
Analog Devices Software Engineer candidate reports ↗
06

Offer Delivery

reported

Candidates report that the process ends with an offer based on the evaluations. Before you accept, settle the practical questions the technical rounds did not cover. Candidates report that roles needing lab access, bench testing or post-silicon validation are usually on-site or hybrid, while some toolchain or architecture roles are more flexible.

What to demonstrate

  • Alignment on team, domain and work arrangement
  • Clarity on the role's day-to-day scope

How to prepare

  • Ask which domain and products the team works on and how much of the role is lab or bench work versus host-side development.
  • Confirm the on-site or hybrid arrangement for the team, since candidates report it depends on lab needs.
Analog Devices Software Engineer candidate reports ↗

3 candidate reports. Individual accounts describe a particular role and hiring cycle.

Software Engineer

Analog Devices Software Engineer interview: a rejection for interviews that never happened

HR ScreenOutcome: rejected

I first spoke with a recruiter about a hardware-validation role. The call was friendly and clear. We covered my background, relocation and work authorization, and my interest in hardware validation, mixed-signal systems, and test development or automation. I was told to expect a hiring-manager interview and then a longer technical panel. Neither was scheduled. I later got a rejection email that n…

Read full experience
Software Engineer

Analog Devices Software Engineer interview: circuit-focused pressure

This interview was almost entirely about circuit-level thinking. I met a director of test engineering early, and the technical conversation centered on circuits rather than behavioral topics. The expectation seemed to be quick, precise solutions, and I felt a mistake could end my chances. Another circuit-focused discussion covered how to test whether a circuit works, then components such as capac…

Read full experience
Software Engineer

Analog Devices Software Engineer Interview Experience: Supportive panel discussion

The interview flow was friendly and low-friction. The conversations felt welcoming from the start, without any sense that people were trying to catch me off guard. I spoke with a small panel, and the questions focused more on my background than on deep technical material. After a quick first step with a manager, I had a longer technical interview with multiple people from the group. The pace was…

Read full experience

PracHub editorial advice for the preparation topics above.

01

Saying volatile makes a variable shared with an ISR safe, then incrementing it with ++ from both sides.

Separate the two properties out loud. Volatile forces each access to happen; atomicity and ordering come from word-sized single writers, critical sections, C11 atomics or barriers. Practise the ring-buffer question with one writer per index so you can show the difference in code.

02

Treating the circuit questions as out of scope for a software role and stalling on an RC filter, a KCL network or an op-amp gain.

Candidates report basic circuit analysis in software panels. Derive H(s) = 1/(1 + sRC), solve a three-node KCL problem, write the non-inverting gain 1 + R_f/R_in, and convert ADC bits into volts per code until each comes out without notes.

03

Mixing up the timing fixes: proposing a lower clock frequency for a hold violation, or synchronizing a multi-bit bus bit by bit.

Write the setup and hold inequalities with skew and notice that only setup contains T_clk. For clock-domain crossings, keep a rule: two-flop synchronizers for single-bit levels, Gray-coded pointers or handshakes for multi-bit values.

04

Describing your own projects only at the library level ("I used the HAL's SPI driver") and failing to explain the registers, interrupts or timing underneath.

Candidates report resume deep dives down to implementation choices. For each project, prepare the block diagram, the peripheral configuration, the interrupt and DMA flow, the memory budget, and one bug you isolated with a scope, logic analyzer or JTAG.

05

Bluffing through an unfamiliar question, or going silent until you have the whole answer.

Candidates report that hints are offered and that follow-ups add constraints. State what you know from first principles (units, limiting cases, what the hardware must do), say which assumption you are making, and use the hint when it comes.

Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.

22 technical prompts0 include a worked solution

How do you configure and interact with hardware registers directly in C using volatile pointers?

medium
Embedded C & Low-Level Systems Programmi

How do you configure and interact with hardware registers directly in C using volatile pointers?

Approach
  1. Map the register with a fixed-width volatile type at its address, either as a single register, e.g. #define CTRL (*(volatile uint32_t *)0x40000000u), or as a struct of volatile uint32_t fields overlaid on the peripheral base address and matching the register map's offsets.
  2. Show the three basic operations: set bits with REG |= mask, clear with REG &= ~mask, and write a field with REG = (REG & ~FIELD_MASK) | ((val << FIELD_SHIFT) & FIELD_MASK). Keep masks and shifts as named constants generated from the register map.
  3. Call out that read-modify-write is not atomic. If an ISR writes the same register between the read and the write, its update is lost. Use the peripheral's dedicated set/clear registers where they exist, or a short critical section.
  4. Handle special bit semantics: for write-1-to-clear status flags, write only the mask (REG = FLAG). A |= would also clear every other pending flag. Read-to-clear registers must not be read speculatively by debug code.
  5. Avoid C bitfields for registers. Their layout and access width are implementation-defined, and many peripherals require full 32-bit accesses. Add a barrier (DSB on Cortex-M) where a write must complete before the next step, for example clearing an interrupt flag before returning.
Follow-up
  • Why are bitfield structs risky for register maps?
  • How do you keep a read-modify-write safe if an ISR touches the same register?
  • How would you unit-test this register code on a host machine with no peripheral?

Explain the memory layout of a standard C program (Stack, Heap, Data, BSS, Text) and describe how stack overfl

medium
Embedded C & Low-Level Systems Programmi

Explain the memory layout of a standard C program (Stack, Heap, Data, BSS, Text) and describe how stack overflow occurs.

Approach
  1. Walk the segments from low to high addresses on a typical MCU: .text (code) and .rodata (constants) in flash; .data (initialised globals and statics), stored in flash and copied to RAM by startup code; .bss (zero-initialised), zeroed by startup code; the heap growing up; the stack growing down from the top of RAM on ARM.
  2. Say what lives where: a static local sits in .data or .bss, not on the stack; a string literal sits in .rodata, while char s[] = "abc" inside a function is a stack copy; malloc returns heap memory.
  3. Explain stack overflow: deep or unbounded recursion, large local arrays, and nested interrupts each pushing frames until the stack pointer passes its region. Without an MMU it usually corrupts the heap or .bss silently instead of faulting, so the symptom appears far from the cause.
  4. Give detection and prevention: fill the stack with a known pattern at boot and check the high-water mark, use an MPU guard region or the ARMv8-M stack-limit registers, measure per-function usage with GCC's -fstack-usage plus call-graph analysis, and give each RTOS task a sized stack.
Follow-up
  • Where do const char *p = "abc" and char a[] = "abc" each store their bytes?
  • How would you size the stack for an RTOS task with an ISR that can preempt it?
  • What does the linker script do to place these sections?

How would you write a dynamic queue or circular buffer in C for an embedded system without causing dynamic mem

medium
Embedded C & Low-Level Systems Programmi

How would you write a dynamic queue or circular buffer in C for an embedded system without causing dynamic memory fragmentation?

Approach
  1. Use a statically allocated array with fixed capacity and head/tail indices, so no malloc is ever called. Choose a power-of-two capacity so wrap is index & (N-1) instead of a modulo.
  2. Resolve full versus empty explicitly: keep one slot unused, keep a separate count, or use free-running unsigned indices where count = head - tail. That last option wraps correctly when N is a power of two.
  3. For an ISR producer and main-loop consumer (single producer, single consumer), it can be lock-free: only the producer writes head and only the consumer writes tail. Write the data before publishing the index, and make indices word-sized and volatile or atomic. Add a barrier when another core or DMA is involved.
  4. Choose and state the full policy (reject newest, overwrite oldest, or return an error) and keep an overflow counter. Push and pop are O(1).
  5. If the question needs variable-size items without fragmentation, add a fixed-block memory pool: a free list of equal-size blocks with O(1) alloc and free. Fragmentation cannot occur because every block is the same size.
Follow-up
  • What changes if two ISRs can both push into the buffer?
  • How would you let a DMA controller fill this buffer directly?
  • Which tests prove the wraparound and the full/empty edge cases?

What is the purpose of the `volatile` keyword in C, and why is it essential when writing interrupt service rou

medium
Embedded C & Low-Level Systems Programmi

What is the purpose of the volatile keyword in C, and why is it essential when writing interrupt service routines (ISRs) or polling memory-mapped peripheral registers?

Approach
  1. Define it: volatile tells the compiler that every access is an observable side effect, so it cannot cache the value in a register, remove the access, merge accesses, or reorder it against other volatile accesses.
  2. Give the classic failure. A flag set in an ISR and polled with while (!flag) {} compiles at -O2 into a single load and an infinite loop if flag is not volatile. A status register polled for a ready bit fails the same way, because the hardware changes it.
  3. State what volatile does not do. It gives no atomicity (counter++ on a volatile is still load, add, store, and a 64-bit value on a 32-bit core takes two accesses). It does not order non-volatile memory, keep caches coherent with DMA, or replace C11 atomics, critical sections or memory barriers.
  4. Distinguish the declarations: volatile uint32_t *p (the pointee is volatile, the usual register case) versus uint32_t * volatile p (the pointer itself is volatile). const volatile suits a read-only status register.
Follow-up
  • Is volatile alone enough to share a 32-bit counter between an ISR and the main loop?
  • Can a variable be both const and volatile, and when would you use that?
  • What does volatile cost in performance inside a tight DSP loop?

Walk through the execution sequence when a hardware interrupt is triggered on an ARM Cortex-M processor, expla

medium
Embedded C & Low-Level Systems Programmi

Walk through the execution sequence when a hardware interrupt is triggered on an ARM Cortex-M processor, explaining register pushing and vector table lookups.

Approach
  1. The peripheral asserts its IRQ line and the NVIC marks it pending. If the interrupt is enabled, not masked by PRIMASK or BASEPRI, and higher priority than the current execution priority, exception entry starts.
  2. The hardware stacks an 8-word frame onto the current stack (MSP or PSP): R0-R3, R12, LR, PC and xPSR. With an active FPU context it may add S0-S15 and FPSCR (lazy stacking). Because these are exactly the AAPCS caller-saved registers, the ISR can be an ordinary C function.
  3. In parallel, the core fetches the handler address from the vector table at VTOR + 4 x exception number, where IRQn is exception 16 + n. It switches to Handler mode on MSP and loads LR with an EXC_RETURN code (0xFFFFFFF9 for thread mode on MSP, 0xFFFFFFFD for thread mode on PSP, 0xFFFFFFF1 for a nested handler).
  4. On return, branching to EXC_RETURN triggers unstacking. Mention tail-chaining (a pending interrupt runs without unstacking and restacking) and late arrival (a higher-priority IRQ arriving during stacking takes the vector), and note that entry latency is about a dozen cycles on Cortex-M3/M4 with zero-wait-state memory.
  5. Close with practical points: clear the peripheral's flag early, and use a DSB if needed, so the IRQ does not re-fire on return. Keep ISRs short and defer work to a task or main loop.
Follow-up
  • How does an RTOS use PendSV and the PSP to switch tasks?
  • What happens if the peripheral flag is cleared as the very last instruction of the ISR?
  • How do priority grouping and BASEPRI let you mask only some interrupts?

Explain the concept of Metastability and how multi-stage synchronizers mitigate Clock Domain Crossing (CDC) is

medium
Digital Logic, RTL & Firmware Integratio

Explain the concept of Metastability and how multi-stage synchronizers mitigate Clock Domain Crossing (CDC) issues.

Approach
  1. Define it: if a flip-flop's input changes inside its setup/hold window, the output can sit at an intermediate level and resolve to 0 or 1 after an unbounded time. The probability that it is still unresolved falls exponentially with the time allowed.
  2. Give the reliability model: MTBF = e^(t_r/tau) / (T_w x f_clk x f_data). Here t_r is the resolution time available, and tau and T_w are flop parameters. More resolution time increases MTBF exponentially.
  3. A two-flop synchronizer gives the first flop almost a full clock period to resolve before the second samples it. Each extra stage multiplies MTBF by about e^(T_clk/tau), so very fast clocks may need three stages. The cost is 2-3 cycles of latency, and the output is a clean value, not necessarily the latest one.
  4. Limit the scope: synchronizers are for single-bit, level signals. A multi-bit bus synchronized bit by bit can be sampled mid-transition into an invalid value, so use Gray-coded pointers, a req/ack handshake or an async FIFO. A single-cycle pulse from a fast domain can be missed in a slow domain, so stretch it or use a toggle synchronizer.
Follow-up
  • What happens to MTBF if you add a third flop stage?
  • How do you safely pass a one-cycle pulse from a 200 MHz domain to a 20 MHz domain?
  • Why is reconvergence of separately synchronized bits a bug?

Draw and explain a Gray Code counter, and describe its advantages over a standard binary counter in asynchrono

medium
Digital Logic, RTL & Firmware Integratio

Draw and explain a Gray Code counter, and describe its advantages over a standard binary counter in asynchronous FIFO designs.

Approach
  1. Define Gray code: consecutive values differ in exactly one bit. Conversion is g = b ^ (b >> 1). The inverse is a prefix XOR from the MSB down: b[n-1] = g[n-1], then b[i] = b[i+1] ^ g[i].
  2. Draw the counter as a binary register, an incrementer, an XOR network producing b ^ (b >> 1), and a Gray output register. Registering the Gray value matters because the combinational XOR output can glitch.
  3. Explain the FIFO advantage. The write pointer crosses into the read clock domain through a two-flop synchronizer. A binary pointer going 0111 to 1000 flips four bits, so a sample taken mid-transition can return any value. A Gray pointer flips one bit, so the synchronized value is either the old or the new pointer, and both give a safe, conservative full or empty decision.
  4. Cover the details: use N+1-bit pointers for a 2^N-deep FIFO. Empty is when the Gray pointers are equal. Full is when the top two bits of the write pointer are the inverse of the read pointer's and the remaining bits match. Depth must be a power of two so the wrap from the last code to zero is also a single-bit change.
Follow-up
  • Why must the async FIFO depth be a power of two with this scheme?
  • Is it a problem that the synchronized pointer is a few cycles stale?
  • Write the full-flag comparison for a 16-entry FIFO.

Explain the Nyquist-Shannon Sampling Theorem and describe the physical and mathematical consequences of aliasi

medium
Signals, Systems & DSP Algorithms

Explain the Nyquist-Shannon Sampling Theorem and describe the physical and mathematical consequences of aliasing when sampling a signal.

Approach
  1. State the theorem: a signal band-limited to B Hz is fully recoverable from samples taken at fs > 2B, ideally by sinc interpolation (an ideal low-pass at fs/2).
  2. Explain aliasing mathematically. Sampling replicates the spectrum at multiples of fs, so any component above fs/2 folds to |f - k fs|. For example, 7 kHz sampled at 10 kHz appears at 3 kHz, indistinguishable from a real 3 kHz tone, and no software can undo it.
  3. Describe the physical effects: out-of-band interference and noise folding into the band of interest, and the wagon-wheel effect as a visual analogy.
  4. Prevention: an analog anti-aliasing filter before the ADC with enough attenuation at fs/2 for the ADC resolution. Or oversample so a gentle analog filter suffices, then decimate with a sharp digital filter.
  5. Edge cases: sampling a sine at exactly 2f can land on its zero crossings, and bandpass sampling (undersampling) deliberately uses aliasing to bring an RF band down to baseband.
Follow-up
  • A 48 kHz system sees a 30 kHz interferer: where does it appear?
  • Why can't a digital filter after the ADC remove aliasing?
  • How does oversampling relax the analog filter requirements?

What is the fundamental difference between Finite Impulse Response (FIR) and Infinite Impulse Response (IIR) d

medium
Signals, Systems & DSP Algorithms

What is the fundamental difference between Finite Impulse Response (FIR) and Infinite Impulse Response (IIR) digital filters in terms of stability, phase linearity, and execution efficiency?

Approach
  1. FIR: y[n] = sum of b_k x[n-k], with no feedback, so it is always stable. Symmetric coefficients give exactly linear phase with a constant group delay of (N-1)/2 samples. Sharp transitions need many taps, at N multiply-accumulates per output.
  2. IIR: feedback terms a_k create poles that must lie inside the unit circle. It gives a sharp response with few coefficients (a biquad is 5 multiplies), but the phase is nonlinear and the filter can go unstable or show limit cycles when coefficients are quantized.
  3. Fixed-point implementation: for FIR, keep a circular delay line and accumulate Q15 x Q15 products in a wide accumulator (32/40/64-bit) before one final rounding. For IIR, use cascaded second-order sections (e.g. direct form II transposed) rather than one high-order direct form, to limit coefficient sensitivity and overflow.
  4. When to choose which: FIR when phase matters or for decimation and interpolation (polyphase). IIR when cycles are scarce or when copying an analog prototype (Butterworth via the bilinear transform).
  5. Use the moving average as a concrete FIR: N equal taps, an O(1) recursive running-sum implementation, and a sinc-shaped response with nulls at multiples of fs/N.
Follow-up
  • How would you implement a moving-average filter in C for streaming sensor data, and what does it do to the frequency response?
  • How do you check that a quantized IIR is still stable?
  • What is the latency of a 101-tap linear-phase FIR at 48 kHz?

Explain how the Fast Fourier Transform (FFT) reduces computational complexity from $O(N^2)$ to $O(N \log N)$ a

medium
Signals, Systems & DSP Algorithms

Explain how the Fast Fourier Transform (FFT) reduces computational complexity from $O(N^2)$ to $O(N \log N)$ and how windowing affects spectral leakage.

Approach
  1. The DFT computes X[k] = sum over n of x[n] e^(-j 2 pi k n / N): N outputs each needing N terms, so O(N^2).
  2. Radix-2 Cooley-Tukey splits x into even and odd samples, giving two N/2-point DFTs E and O. Then X[k] = E[k] + W^k O[k] and X[k + N/2] = E[k] - W^k O[k], with W = e^(-j 2 pi / N). Recursing gives log2 N stages of N/2 butterflies, so O(N log N). At N = 1024 that is about 5,120 complex multiplies instead of about 1 million.
  3. Mention the implementation details: in-place butterflies with bit-reversed input ordering, a precomputed twiddle table, and per-stage scaling by 1/2 in fixed point to avoid overflow.
  4. Spectral leakage: the FFT treats the block as one period of a periodic signal. A non-integer number of cycles creates an edge discontinuity, so energy spreads across bins, which is the same as convolving with the rectangular window's sinc.
  5. Windowing trades main-lobe width (resolution) for side-lobe level (leakage): Hann and Hamming for general use, Blackman-Harris for high dynamic range, flat-top for amplitude accuracy. Correct for the window's coherent gain. Bin spacing is fs/N, and coherent sampling avoids the window entirely in ADC testing.
Follow-up
  • Does zero-padding improve frequency resolution?
  • How would you exploit a purely real input to halve the work?
  • Which window would you use to measure THD of an ADC, and why?

How would you implement a discrete-time PID control loop in fixed-point C arithmetic while avoiding integer ov

medium
Signals, Systems & DSP Algorithms

How would you implement a discrete-time PID control loop in fixed-point C arithmetic while avoiding integer overflow and windup?

Approach
  1. Discretize at a fixed period Ts driven by a timer interrupt: u[n] = Kp e[n] + Ki Ts sum(e) + (Kd / Ts)(y[n-1] - y[n]). Precompute Ki Ts and Kd / Ts as fixed-point constants. Taking the derivative of the measurement instead of the error avoids a derivative kick when the setpoint steps.
  2. Pick Q formats from worst-case ranges, e.g. Q15 signals and gains in Q16.16. Multiply into a wider type (Q15 x Q15 into int32 as Q30, or int64 for Q16.16), then shift back with rounding (add 1 << (shift-1)). Note the -1 x -1 corner, which overflows Q15.
  3. Use saturating arithmetic: clamp sums to the type's limits instead of letting them wrap, because a wrapped control output reverses the actuator.
  4. Anti-windup: clamp the integrator to the range the actuator can use, stop integrating while the output is saturated and the error has the same sign (conditional integration), or use back-calculation. Low-pass the derivative term to stop it amplifying ADC noise.
  5. Verify it against a floating-point reference model on the host with step, ramp and saturation scenarios, and compare the fixed-point output error against a tolerance.
Follow-up
  • How would you choose the Q format for the integrator state?
  • How do you change gains at runtime without a bump in the output?
  • What happens if the loop period jitters, and how would you measure it?

Each day covers one group of the reported questions: embedded C, interrupts and parsing, digital timing, protocols and debugging, circuits, DSP, and finally the behavioral and resume material. Every day ends in written or spoken answers you can check.

Small steps. Visible outcomes.0 / 7 completed
ONE WEEK · YOUR PACE

Prepare, practise & reflect

One practical outcome each day. Spend longer where you need it.

0 / 7 done
01Embedded C fundamentals: registers, volatile and memory layout
  • Write a register header for a made-up peripheral (control, status, data) as both #defines and a volatile struct overlay, with set, clear and field-write macros and a write-1-to-clear flag.
  • Explain aloud why a while(!flag) loop hangs at -O2 without volatile, and list three things volatile does not guarantee.
  • Sketch the .text/.rodata/.data/.bss/heap/stack map for a Cortex-M part and place ten variables of different kinds in it, including a static local and a string literal.
  • Write a bit-reversal function for a 32-bit value using mask-and-shift swaps, plus three boundary test cases.

Deliverable: A register header file, a written list of volatile's limits, an annotated memory map, and a tested bit-reversal function.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
02Interrupts, ring buffers and packet parsing
  • Write out the Cortex-M exception entry and exit sequence: NVIC pending, the 8-word stack frame, the VTOR lookup, EXC_RETURN, tail-chaining.
  • Implement a static, power-of-two SPSC ring buffer with free-running indices and test full, empty and wraparound on the host.
  • Implement a byte-driven FSM parser (start, length, payload, CRC) fed from that buffer, and test it with fragmented, corrupted and oversized-length frames.

Deliverable: A one-page interrupt-entry diagram, a tested ring buffer, and a tested packet parser with its failure cases listed.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
03Digital logic and timing
  • Derive the setup and hold inequalities with skew, then solve three max-frequency problems with numbers, including one with negative skew.
  • Explain metastability with the MTBF formula and draw a two-flop synchronizer, a toggle synchronizer for pulses, and a req/ack handshake.
  • Draw a Gray-code counter and the async FIFO pointer logic, and write the empty and full comparisons for a 16-entry FIFO.
  • Write a Verilog rising-edge detector that outputs a one-cycle pulse, since candidates report Verilog and FPGA topics.

Deliverable: Worked timing calculations, three synchronizer sketches, a Gray-pointer FIFO diagram with its flag logic, and an edge-detector module.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
04Serial protocols and hardware-software debugging
  • Build a comparison table for UART, SPI and I2C: wires, clocking, duplex, addressing, acknowledgement, typical speeds and failure modes.
  • Talk through tracing a periodic corrupted bit on an SPI bus with a scope: trigger setup, which edges to inspect, how CPOL/CPHA mismatch and signal integrity look.
  • Talk through an RTOS deadlock between two tasks sharing an I2C driver: lock ordering, priority inversion, bus-stuck recovery.
  • Write your hardware-software bug story in STAR form, with the evidence that separated code from silicon.

Deliverable: A protocol comparison table, two spoken debugging walkthroughs, and a written STAR bug story.

Practice prompt ↗Practice prompt ↗
05Analog circuits for software engineers
  • Derive the RC low-pass transfer function, cutoff and step response, and compute attenuation at fs/2 for a sample design.
  • Solve two nodal-analysis problems (one with a supernode) and check each with a power balance.
  • Write the MOSFET region equations and explain the switch versus amplifier bias points, including logic-level gate drive.
  • List op-amp non-idealities with one formula each (offset x noise gain, gain error 1/(A beta), bandwidth GBW/noise gain, slew-limited frequency) and derive a non-inverting gain.

Deliverable: Four pages of worked circuit derivations with numeric answers and sanity checks.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
06Signals, ADCs and DSP
  • Compute LSB size for 12 and 16 bits on a 3.3 V reference, ideal SNR, and ENOB from a given SINAD, and explain INL, DNL and calibration.
  • Work three aliasing problems with |f - k fs| and explain how you would size the anti-aliasing filter.
  • Write a fixed-point moving-average FIR and a biquad IIR in C, and explain the FFT butterfly, the complexity count and the window choice.
  • Write a fixed-point PID step with saturation and conditional integration, and compare it with a float model on step and saturation inputs.

Deliverable: ADC calculations, aliasing worked examples, FIR and IIR code, an FFT explanation sheet, and a tested fixed-point PID.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Behavioral stories, resume deep dive and a mock loop
  • Write STAR answers for modular firmware under changing specs, a speed-versus-readability-or-memory trade-off with measurements, and testing drivers without hardware.
  • For each resume project, draw the architecture and rehearse a register-level explanation of one design choice and one failure.
  • Run a mock session with a friend or recording that mixes one C question, one timing question, one circuit question and one DSP question, then fix the weakest answer.

Deliverable: Three written STAR stories, one architecture sketch per project, and a recorded mock session with notes on the weakest answer.

Practice prompt ↗Practice prompt ↗Practice prompt ↗

Expand any day for tasks and deliverables. Your progress is saved on this device.

The behavioral questions candidates report for this role are all about working at the hardware-software boundary: isolating a bug between code and silicon, designing firmware while specs change, trading speed against memory or readability, and testing drivers before hardware exists. Candidates also report collaboration with hardware designers and validation teams as an evaluated area. Every story needs real technical detail and the measurements behind your decisions.

How do you approach designing modular firmware when hardware specifications are continuously evolving during p

medium
Behavioral, Project Architecture & Execu

How do you approach designing modular firmware when hardware specifications are continuously evolving during product development?

Approach
  1. Describe the layering: a register-access layer generated from the register map (one source of truth, regenerated when the spec changes), drivers with stable APIs above it, and application code that never touches registers directly.
  2. Explain how you contain churn: configuration structs instead of magic numbers, a chip-revision ID read at runtime or a compile-time variant switch, and interface tables (structs of function pointers) where implementations must be swappable.
  3. Cover the process side: agree interfaces early with the hardware designers, track spec revisions against code, and test against simulators, FPGA prototypes or RTL simulation before silicon arrives.
  4. Anchor it in a real case: a register field that moved between revisions, how many files changed, and what the layering saved. Avoid the opposite failure too, abstraction so heavy it costs cycles in an ISR path.
Follow-up
  • How would you support two silicon revisions in one firmware image?
  • Where would you refuse to add an abstraction layer, and why?
  • How do you find out a spec changed before it breaks your build?

Give an example of a time you had to trade off execution speed for code readability or memory footprint in a r

medium
Behavioral, Project Architecture & Execu

Give an example of a time you had to trade off execution speed for code readability or memory footprint in a resource-constrained system.

Approach
  1. Pick a story with concrete budgets: flash and RAM sizes, the cycle budget per sample or per interrupt, and the number you had to hit.
  2. Show the measurement before and after: the DWT cycle counter on Cortex-M or a GPIO toggle on a scope for timing, and the linker map file for memory. A trade-off made without measurement is the mistake that sinks this answer.
  3. Name the technique and its cost, for example a sine lookup table (flash for cycles), fixed-point instead of float on a core without an FPU, loop unrolling, or compiler intrinsics instead of portable C.
  4. Explain how you kept the code maintainable: the optimized code isolated behind one function, the reasoning in comments, and the plain reference implementation kept in the test suite to check the fast version.
Follow-up
  • How did you prove the optimized version gave the same results?
  • Would you make the same choice on a core with an FPU?
  • What did code review say about it?

How do you structure unit tests and regression test benches for low-level device drivers when physical hardwar

medium
Behavioral, Project Architecture & Execu

How do you structure unit tests and regression test benches for low-level device drivers when physical hardware targets are not yet available?

Approach
  1. Separate logic from hardware: put register access behind a thin interface so the driver's state machine, calculations and error handling compile and run on the host.
  2. Fake the hardware: point the driver's base address at a RAM array acting as a register file, and model peripheral behaviour in the fake (a status bit that sets after N polls, an error flag on demand). Run it with a host C unit-test framework such as Unity or CppUTest.
  3. Move up in fidelity as it becomes available: an instruction-set simulator or emulator, an FPGA prototype, or co-simulation against the RTL with a SystemVerilog testbench. Then hardware-in-the-loop once boards arrive.
  4. Run the host tests on every commit in CI under Git so regressions surface immediately, and keep golden traces to compare against the first silicon.
  5. Be explicit about what host tests cannot cover (real timing, DMA, cache effects, analog behaviour), and say which tests you ran first on the new board.
Follow-up
  • How do you keep your fakes faithful to the real peripheral?
  • Which bugs did this approach miss that only silicon exposed?
  • What is the first test you run when a new board arrives?
  • 01

    Describe a project where you encountered an elusive hardware-software bug. How did you isolate whether the root cause was in code or in silicon?

  • 02

    How do you approach designing modular firmware when hardware specifications are continuously evolving during product development?

  • 03

    Give an example of a time you had to trade off execution speed for code readability or memory footprint in a resource-constrained system.

  • 04

    How do you structure unit tests and regression test benches for low-level device drivers when physical hardware targets are not yet available?

  • 05

    Tell me about a time you disagreed with a hardware designer about where a problem should be fixed, in silicon or in firmware.

  • 06

    Walk me through the architecture of one project on your resume and the hardest timing or memory constraint you hit.

PracHub preparation framework ↗
How do Analog Devices software interviews differ from pure-software company loops?

Candidates report that the challenge is breadth, not hard algorithm puzzles. The reported questions cover embedded C and interrupts, digital logic and timing, circuit analysis, sampling and filtering, and behavioral questions about hardware-software work. Split your preparation across those areas instead of spending it all on data-structure drills.

Analog Devices Software Engineer candidate reports ↗
Will I get circuit problems if I applied for a software role?

Candidates report basic circuit analysis in software panels: reading a schematic, KVL/KCL, RC filters, op-amp configurations, transistor operating regions and ADC resolution. IC-level design is not reported. Practise deriving each result rather than memorising it, and connect each to the software that reads the signal.

Analog Devices Software Engineer candidate reports ↗
Which programming language is used in the technical rounds?

Candidates report embedded C as the main language for firmware and low-level roles, with Python, C++ or SystemVerilog weighted more heavily for verification and platform teams. Ask the recruiter which applies to your team, and be fluent in C pointers, bitwise operations and fixed-point arithmetic either way.

Analog Devices Software Engineer candidate reports ↗
What is on the online assessment?

Candidates report that written or automated tests at this stage cover digital electronics fundamentals, C syntax, logic problems and basic aptitude, and that they are especially common for university hires. Drill C output prediction, bit manipulation, Boolean simplification and number-system conversions for speed and accuracy.

Analog Devices Software Engineer candidate reports ↗
Do I need Verilog, STA or FPGA knowledge for a software role?

Candidates name Static Timing Analysis, Verilog Programming and FPGA Concepts and Architecture among the topics they were tested on, and SystemVerilog and UVM appear among the nice-to-have skills candidates describe for this role. At minimum, be able to write a simple sequential module, compute setup and hold slack, and explain clock-domain crossing.

Analog Devices Software Engineer candidate reports ↗
How long does the process take, and how many rounds are there?

Candidates report six stages over roughly 4-6 weeks: Recruiter Pre-Screen, Online Assessment, Technical Discussions, Technical Sessions (3 to 5 sessions, virtual or onsite), Candidate Evaluation and Offer Delivery. Counts vary with team, seniority and location.

PracHub Software Engineer practice ↗
Is the role on-site, hybrid or remote?

Candidates report that it depends on the team. Roles that need lab access, bench testing or post-silicon validation are usually on-site or hybrid, while some toolchain or architecture roles are more flexible. Confirm the arrangement for your specific team during the recruiter call or at the offer stage.

Analog Devices Software Engineer candidate reports ↗
Sources & methodology 3 sources ↗

No official company page is cited. Rounds and questions come from candidate reports and PracHub editorial material; each source shows the date it was read.