🔹 Embedded C Interview Questions with Answers
1. What is Embedded C and how is it different from standard C?
Answer:
Embedded C is an extension of the C programming language used for programming microcontrollers and embedded systems. It provides additional features like fixed-point arithmetic, direct I/O hardware addressing, and access to processor-specific registers.
- C → Used for general-purpose programming.
 - Embedded C → Used for hardware-level programming with limited resources.
 
2. Why is C preferred in embedded systems?
Answer:
- Portable and efficient.
 - Produces compact machine code.
 - Supports low-level hardware access (bitwise operations, pointers).
 - Easily integrates with assembly language.
 - Deterministic execution, which is critical in real-time systems.
 
3. What is the role of volatile keyword in Embedded C?
Answer:volatile tells the compiler that a variable can change at any time outside the program flow (e.g., hardware register, ISR). Without volatile, the compiler may optimize and cache the value, causing incorrect behavior.
Example:
volatile int status_register;
while(status_register == 0);  // Wait until hardware updates it
4. What is the difference between const and #define in Embedded C?
Answer:
#define→ Preprocessor directive, replaced at compile-time. No type checking.const→ Defines a typed constant, checked by compiler. Stored in memory (or flash).
#define PI 3.14     // No type checking
const float pi = 3.14;  // Type-safe
5. What is the difference between firmware and software?
Answer:
- Firmware: Low-level code stored in non-volatile memory (Flash/ROM), directly controls hardware.
 - Software: Higher-level code (OS, applications) running on top of hardware.
 
6. Explain static keyword in Embedded C.
Answer:
- Inside function: Retains value across function calls.
 - Global variable: Restricts visibility to the same file (file scope).
 - Function declaration: Function is limited to the file (private function).
 
7. What is the difference between polling and interrupts?
Answer:
- Polling: CPU continuously checks a flag or register. Wastes CPU cycles.
 - Interrupts: CPU executes normal code and jumps to ISR only when an event occurs. More efficient.
 
8. What is an ISR (Interrupt Service Routine)?
Answer:
An ISR is a special function that executes in response to an interrupt.
- Should be short and fast.
 - Must not return any value.
 - Should not call blocking functions.
 
Example:
void __interrupt() UART_ISR(void) {
   // Handle UART interrupt
}
9. What is the use of a watchdog timer in embedded systems?
Answer:
A watchdog timer resets the system if the software hangs or enters an infinite loop. The software must “kick” or “refresh” the watchdog periodically.
10. Why is malloc() avoided in embedded systems?
Answer:
- Causes memory fragmentation.
 - Non-deterministic execution time.
 - Limited memory availability.
Instead, static memory allocation or fixed memory pools are preferred. 
11. What is the difference between RTOS and bare-metal programming?
Answer:
- Bare-metal: No OS, code runs directly on hardware. Suitable for simple applications.
 - RTOS: Provides task scheduling, synchronization, and resource management. Suitable for complex real-time systems.
 
12. What is endianess?
Answer:
- Big-endian: Most significant byte stored at lowest memory address.
 - Little-endian: Least significant byte stored at lowest memory address.
Microcontrollers often use little-endian (e.g., ARM Cortex-M). 
13. What is memory alignment?
Answer:
Data must be stored at addresses divisible by its size (e.g., a 4-byte integer aligned to address divisible by 4). Misaligned access may cause slower performance or hardware faults.
14. Explain function pointers with an example.
Answer:
A function pointer stores the address of a function and allows dynamic function calls.
#include <stdio.h>
void hello() { printf("Hello World\n"); }
int main() {
    void (*funcPtr)() = hello;
    funcPtr();  // Calls hello()
}
In embedded systems, function pointers are used for ISRs, callbacks, and state machines.
15. What are bit-fields in Embedded C?
Answer:
Bit-fields allow efficient use of memory by allocating specific bits for variables. Often used for hardware registers.
struct {
   unsigned int flag1:1;
   unsigned int flag2:1;
   unsigned int reserved:6;
} status;
16. How do you debounce a switch in Embedded C?
Answer:
Mechanical switches cause multiple transitions (bouncing). Solutions:
- Software delay after detecting a press.
 - Timer-based sampling (check after stable period).
 - State machine for stable detection.
 
17. What is the difference between inline functions and macros?
Answer:
- Macros: Preprocessor substitution, no type checking.
 - Inline functions: Compiler-supported, type-safe, better debugging.
 
18. What are reentrant functions?
Answer:
A function is reentrant if it can be safely called by multiple tasks/ISRs simultaneously without corrupting data.
- No static/non-volatile global variables.
 - Uses local variables only.
 
19. How do you debug embedded C code without printf()?
Answer:
- Use LED indicators (blink for debug).
 - Use UART logging.
 - Use JTAG/SWD debugger.
 - Use logic analyzers/oscilloscopes.
 - Use trace/debug registers.
 
20. Explain the difference between GPOS (General Purpose OS) and RTOS.
Answer:
- GPOS: Designed for throughput and fairness. Tasks may not run in strict timing. Example: Linux, Windows.
 - RTOS: Deterministic scheduling, minimal latency. Suitable for real-time embedded systems. Example: FreeRTOS, VxWorks.
 
🔹 Embedded C Interview Questions with Answers (Q21–Q40)
21. What is a pointer in C?
Answer:
A pointer is a variable that stores the address of another variable. It allows direct access to memory. In embedded systems, pointers are often used to access hardware registers.
22. How are pointers used in embedded systems?
Answer:
Pointers are used to:
- Access hardware registers (memory-mapped I/O).
 - Pass large data structures to functions efficiently.
 - Implement dynamic data structures.
 - Access arrays efficiently.
 
23. What is a null pointer?
Answer:
A null pointer points to nothing (0x00). It is often used for initialization and to check if a pointer is valid.
int *ptr = NULL;
if(ptr == NULL) {
   // Pointer not assigned
}
24. What is a dangling pointer?
Answer:
A pointer that refers to memory which has been freed or is out of scope. Using it can cause undefined behavior.
25. What is the difference between pointer to constant and constant pointer?
Answer:
- Pointer to constant: Cannot modify the value it points to.
 
const int *ptr; // value is constant
- Constant pointer: Pointer itself cannot change, but the value can.
 
int * const ptr; // address is constant
26. Explain function pointers with an example.
Answer:
A function pointer points to a function and allows indirect calling. Commonly used for callbacks, ISRs, and drivers.
void fun() { printf("Hello\n"); }
void (*fptr)() = fun;
fptr();
27. How are function pointers used in embedded systems?
Answer:
- For Interrupt Vector Tables.
 - Callback mechanisms (e.g., UART receive handler).
 - State machine implementations.
 - Dynamic driver selection.
 
28. What is a memory leak? Can it happen in embedded C?
Answer:
A memory leak occurs when dynamically allocated memory is not freed, making it unusable. In embedded systems (with limited memory), this is critical. It mainly occurs if malloc() is used but free() is not called.
29. How is dynamic memory allocation handled in embedded systems?
Answer:
- Generally avoided due to fragmentation.
 - If used, handled with custom memory pools or fixed block allocation.
 - RTOS often provides heap management APIs.
 
30. Why is malloc() avoided in embedded systems?
Answer:
- Unpredictable execution time.
 - Causes fragmentation.
 - Limited memory availability.
 - Instead, use static allocation or memory pools.
 
31. What is the role of the preprocessor in C?
Answer:
The preprocessor runs before compilation. It handles macros, file inclusion, conditional compilation, and symbolic constants.
32. Difference between #include <file> and #include "file"?
Answer:
<file>: Searches in standard library paths."file": Searches in the current directory first, then system directories.
33. What are macros? Give an example.
Answer:
Macros are preprocessor directives that replace code before compilation.
#define SQUARE(x) ((x)*(x))
34. What is the difference between macros and inline functions?
Answer:
- Macros: Preprocessor substitution, no type checking, may cause side effects.
 - Inline functions: Type-safe, better debugging, managed by compiler.
 
35. Explain conditional compilation in Embedded C.
Answer:
Allows code to be compiled selectively based on conditions. Useful for portability.
#ifdef DEBUG
   printf("Debug mode\n");
#endif
36. What is the use of #pragma in Embedded C?
Answer:#pragma provides additional instructions to the compiler (e.g., to disable warnings, align structures, or place variables in specific memory sections).
37. How are header guards used and why are they needed?
Answer:
Header guards prevent multiple inclusion of the same header file.
#ifndef HEADER_H
#define HEADER_H
// code
#endif
38. What are predefined macros in C?
Answer:
Some standard predefined macros are:
__FILE__→ Current filename__LINE__→ Current line number__DATE__→ Compilation date__TIME__→ Compilation time
39. What is the difference between #ifdef and #if defined()?
Answer:
Both check if a macro is defined, but:
#ifdef MACROis shorthand.#if defined(MACRO)can combine multiple conditions.
40. Can you write a macro for swapping two numbers?
Answer:
Yes, using XOR or temporary variable:
#define SWAP(a,b) { int temp = a; a = b; b = temp; }
🔹 Embedded C Interview Questions with Answers (Q41–Q60)
41. What is an interrupt?
Answer:
An interrupt is a signal to the processor that temporarily halts the current execution and transfers control to a special function (ISR). After servicing, normal execution resumes.
42. How do you write an Interrupt Service Routine (ISR) in Embedded C?
Answer:
ISR is a special function executed when an interrupt occurs. Example (for ARM/Keil):
void UART0_IRQHandler(void) {
   // Handle UART interrupt
}
- Must be short, fast, and non-blocking.
 - Should not return any value.
 
43. What is the difference between polling and interrupts?
Answer:
- Polling: CPU continuously checks a status flag. Wastes CPU cycles.
 - Interrupts: CPU executes tasks normally and only services hardware when an event occurs. More efficient.
 
44. What is the role of timers in Embedded C?
Answer:
Timers are hardware peripherals used for:
- Measuring time intervals.
 - Generating delays.
 - Creating PWM signals.
 - Scheduling tasks in RTOS.
 
45. How is delay implemented in Embedded C?
Answer:
- Software delay: Using loops (not recommended for accuracy).
 
for (volatile int i=0; i<1000; i++);
- Hardware delay: Using timers for precise delays.
 
46. How do you configure I/O ports in Embedded C?
Answer:
By accessing memory-mapped registers of microcontrollers.
Example (STM32 GPIO):
GPIOA->MODER |= (1<<10);  // Set PA5 as output
GPIOA->ODR |= (1<<5);     // Turn ON LED
47. What is a watchdog timer?
Answer:
A hardware timer that resets the system if the software fails to refresh it periodically. Prevents system hangs.
48. What is memory-mapped I/O?
Answer:
A technique where hardware device registers are assigned fixed memory addresses. Accessing a memory location actually reads/writes hardware.
Example:
#define GPIO_PORT (*(volatile unsigned int*)0x40020014)
GPIO_PORT = 0x01;
49. What is the difference between Harvard and Von Neumann architecture?
Answer:
- Harvard: Separate memory for instructions and data → faster (used in DSPs, MCUs).
 - Von Neumann: Single memory for both instructions and data → simpler design (used in PCs).
 
50. How do you access hardware registers in Embedded C?
Answer:
Using volatile pointers to fixed memory addresses.
#define REG (*(volatile unsigned int*)0x40021000)
REG = 0x01;
51. Write a program to toggle an LED connected to a GPIO pin.
Answer:
while(1) {
   GPIOA->ODR ^= (1<<5);   // Toggle LED at PA5
   delay_ms(500);
}
52. Write a program to generate a PWM signal.
Answer (pseudo):
void PWM_Init() {
   TIMER->CCR1 = duty_cycle;
   TIMER->ARR = period;
   TIMER->CR1 |= 1; // Enable timer
}
53. How do you write a delay function using timers?
Answer:
void delay_ms(int ms) {
   TIMER->CNT = 0;
   while(TIMER->CNT < ms);
}
54. Write a function to reverse a string in C.
Answer:
void reverse(char *str) {
   int i=0, j=strlen(str)-1;
   while(i < j) {
      char temp = str[i];
      str[i++] = str[j];
      str[j--] = temp;
   }
}
55. Write a program to count the number of 1s in a binary number.
Answer:
int countOnes(int n) {
   int count = 0;
   while(n) {
      count += n & 1;
      n >>= 1;
   }
   return count;
}
56. Write a program to implement a circular buffer in Embedded C.
Answer:
#define SIZE 10
int buffer[SIZE], head=0, tail=0;
void enqueue(int data) {
   buffer[head] = data;
   head = (head+1) % SIZE;
}
int dequeue() {
   int data = buffer[tail];
   tail = (tail+1) % SIZE;
   return data;
}
57. Write code to detect button debounce.
Answer:
if(button_pressed()) {
   delay_ms(20); // debounce delay
   if(button_pressed()) {
      // Valid press
   }
}
58. How do you write an ISR for a UART receive interrupt?
Answer:
void USART1_IRQHandler(void) {
   if(USART1->SR & RXNE) {   // Check receive flag
      char c = USART1->DR;   // Read data
   }
}
59. Write a program to check whether a number is power of 2.
Answer:
int isPowerOf2(int n) {
   return (n>0) && !(n & (n-1));
}
60. Implement a simple state machine in C.
Answer:
typedef enum {STATE_INIT, STATE_ON, STATE_OFF} state_t;
state_t state = STATE_INIT;
void runStateMachine() {
   switch(state) {
      case STATE_INIT: state = STATE_ON; break;
      case STATE_ON:   state = STATE_OFF; break;
      case STATE_OFF:  state = STATE_ON; break;
   }
}
Got it! Here are Q61–Q80 with clear, interview-ready answers.
Optimization Techniques (Q61–Q65)
Q61. What are some techniques to optimize C code for embedded systems?
- Prefer fixed-width types (
uint8_t,uint16_t) and avoid implicit type promotions. - Use 
constfor read-only data so it resides in flash/ROM. - Mark hardware registers and shared flags 
volatile. - Replace floating point with fixed-point where possible.
 - Hoist invariants out of loops; precompute lookups.
 - Use 
restrict(when safe) to help the compiler optimize pointer aliasing. - Enable appropriate compiler optimizations (
-O2/-Os). - Avoid recursion; minimize stack usage.
 - Use DMA and peripherals (timers/PWM) instead of “bit-banging” in software.
 - Profile, measure, and optimize only the hotspots.
 
Q62. What is loop unrolling, and when is it beneficial?
Unrolling duplicates the loop body to reduce iteration overhead and improve instruction scheduling.
- Good when: Small, fixed trip counts; performance-critical inner loops; instruction cache not stressed.
 - Caution: Increases code size (may hurt I-cache/flash limits).
 
Q63. How does using volatile affect optimization by the compiler?
volatile tells the compiler that a variable may change outside normal flow; it must not cache or reorder accesses.
- Effect: Prevents certain optimizations (common subexpression elimination, register caching).
 - Use only when needed: hardware registers, ISR-shared flags, memory-mapped I/O.
 
Q64. Trade-offs between macros and inline functions in optimization?
- Macros: No call overhead; but no type checking, multiple evaluation side effects, harder to debug.
 - Inline functions: Type-safe, debuggable, allow single evaluation of arguments; inlining usually removes call overhead.
 - Rule: Prefer 
static inlinefunctions; use macros sparingly (e.g., compile-time constants, bit masks). 
Q65. How do you reduce code size without sacrificing performance?
- Compile with 
-Os(size-opt) and selectively-O2for hot files. - Share common code paths; avoid duplication.
 - Use tables/lookup instead of long 
switchchains when smaller. - Replace generic libraries with minimal, purpose-built routines.
 - Use link-time optimization (LTO) and dead-code elimination (
-ffunction-sections -fdata-sections+--gc-sections). - Keep printf small (no float), or use lightweight logging.
 
Debugging & Testing (Q66–Q71)
Q66. Typical methods for debugging when hardware is limited?
- GPIO/LED “heartbeat” and event blinks.
 - UART/ITM trace logs with timestamps.
 - On-chip debuggers (SWD/JTAG) for stepping, registers, memory.
 - Logic analyzer/oscilloscope to observe pins, buses (SPI/I²C/UART).
 - Assertions, watchdog resets with crash counters.
 - Simulation/emulation and unit tests on host.
 - Capture minidumps (PC, LR, SP, fault status registers) on hard faults.
 
Q67. Difference between watchpoint and breakpoint?
- Breakpoint: Halts CPU on executing a specific instruction/address.
 - Watchpoint (data breakpoint): Halts on memory access (read/write) to an address or range—great for catching buffer overruns/racey writes.
 
Q68. How to detect and fix stack overflow?
- Detect:
- Place canary pattern at stack end and check periodically.
 - Use RTOS watermarks (high-water usage).
 - Enable MPU/stack guards if available.
 
 - Fix:
- Increase stack; reduce local arrays/recursion; move large buffers to static or heap (if safe); split tasks; optimize deep call chains.
 
 
Q69. What is a memory leak in embedded systems? How to identify and prevent it?
Leak: Allocated memory not freed → cumulative loss (critical with small RAM).
- Identify: Heap usage stats, allocation counters, periodic heap walk, guard headers, test long-duration runs.
 - Prevent: Prefer static/pool allocators; ownership rules; RAII-like patterns in C (init/deinit pairs); avoid unbounded 
malloc. 
Q70. What is a race condition? How do you debug it?
Race: Outcome depends on timing of concurrent accesses.
- Debug: Reproduce with stress tests; add timestamps; use watchpoints on shared data; enable RTOS trace; inspect critical sections.
 - Fix: Proper synchronization (mutexes, semaphores, atomics, disable IRQs briefly), minimize shared state.
 
Q71. Role of static analysis tools (PC-Lint, Coverity, cppcheck) in embedded C?
They detect defects early: null derefs, buffer overruns, uninitialized use, MISRA violations, dead code.
- Benefits: Earlier bug finding, safety compliance, consistent style, better maintainability.
 
Best Practices (Q72–Q76)
Q72. Why is MISRA C important?
MISRA defines rules/guidelines to avoid undefined/unsafe constructs in C—crucial for safety-critical domains (automotive, medical). Improves portability, predictability, and auditability.
Q73. Advantages of modular programming in embedded C projects?
- Clear separation of concerns (drivers, HAL, middleware, app).
 - Easier unit testing and reuse.
 - Parallel development and simpler versioning.
 - Faster bring-up on new hardware via well-defined interfaces.
 
Q74. Why avoid dynamic memory allocation in embedded systems?
Non-deterministic latency, fragmentation, leaks, and failure at runtime. If required, use fixed-size pools, bounded allocators, or allocate once at startup.
Q75. What is defensive programming, and why is it critical?
Coding to anticipate faults: validate inputs, check return codes, assert invariants, timeouts on I/O, fail-safe defaults, watchdog petting strategy. Critical because devices must survive noise, resets, and unexpected states.
Q76. How to ensure portability across microcontrollers?
- Abstract hardware via HAL/driver layers.
 - Use fixed-width types and endianness-safe code.
 - Isolate compiler/MCU specifics in one module.
 - Stick to MISRA/ANSI C; avoid vendor extensions.
 - Build with multiple compilers/flags in CI.
 
RTOS-Related (Q77–Q80)
Q77. Advantages of using an RTOS over bare-metal?
- Deterministic scheduling, simpler concurrency model.
 - Built-in IPC (queues, semaphores), timers, and services.
 - Easier scaling/maintenance for complex apps.
 - Better separation of concerns per task, improved responsiveness.
 
Q78. Difference between task, thread, and process in RTOS context?
- Process: Owns virtual address space (rare on small MCUs).
 - Thread/Task: Execution unit scheduled by RTOS, shares address space; “task” is the common RTOS term on MCUs.
 
Q79. What is priority inversion? Give a practical example.
Lower-priority task holds a mutex needed by a higher-priority task; a medium-priority task preempts and blocks the high-priority one indirectly.
- Example: Low task L holds I²C mutex; High task H waits; Medium task M runs CPU-bound → H starves.
 - Mitigation: Priority inheritance/ceiling protocols; minimize lock hold time; use priority-aware mutexes.
 
Q80. How do you minimize interrupt latency in an RTOS-based system?
- Keep ISRs tiny; defer work to deferred handlers/tasks.
 - Minimize time with interrupts disabled; use fine-grained critical sections.
 - Prioritize interrupts appropriately; avoid long chains of nested ISRs.
 - Use fast, cache-aware ISRs and place vectors/ISRs in fast memory.
 - Avoid heavy logging/printf in ISRs.
 
Perfect 👍 Let’s continue with Q81–Q100 of Embedded C Interview Questions with Answers (Advanced Topics, RTOS, Low-level, and System Design).
Q81–Q100: Advanced Embedded C Interview Questions with Answers
Q81. What is the purpose of using volatile with hardware registers?
Answer:volatile tells the compiler that the variable can change at any time (due to hardware or interrupts) and should not be optimized away. Essential for memory-mapped I/O registers.
Q82. Explain the difference between stack and heap in embedded systems.
Answer:
- Stack: Fast, automatic allocation, LIFO structure, limited size. Used for local variables and function calls.
 - Heap: Dynamically allocated memory at runtime, slower, may cause fragmentation. Used when memory requirements are not known at compile time.
 
Q83. Why is dynamic memory allocation often avoided in embedded systems?
Answer:
Because of fragmentation, unpredictable allocation time, and possible memory leaks which can crash real-time systems. Static memory allocation is safer and predictable.
Q84. What is a race condition and how can you prevent it?
Answer:
A race condition occurs when multiple tasks/threads access shared data concurrently leading to unpredictable results.
- Prevent using mutexes, semaphores, disabling interrupts, or atomic operations.
 
Q85. Explain the concept of priority inversion in RTOS.
Answer:
Occurs when a low-priority task holds a resource needed by a high-priority task, while a medium-priority task preempts. This delays the high-priority task.
- Solution: Priority inheritance protocol in RTOS.
 
Q86. How does an RTOS differ from a bare-metal embedded system?
Answer:
- Bare-metal: Runs directly on hardware, single-threaded, cooperative.
 - RTOS: Provides scheduling, multitasking, priority-based execution, and timing guarantees.
 
Q87. What is the difference between preemptive and cooperative multitasking?
Answer:
- Preemptive: Scheduler interrupts tasks and switches based on priority/time slice. Ensures responsiveness.
 - Cooperative: Tasks voluntarily yield CPU. Easier but less responsive.
 
Q88. What is a watchdog timer?
Answer:
A hardware timer that resets the system if the program hangs or fails to refresh the timer within a set period. Prevents system lockups.
Q89. How do you minimize interrupt latency in embedded systems?
Answer:
- Keep ISRs short
 - Use interrupt priorities
 - Avoid heavy computations inside ISRs
 - Defer long tasks to background threads
 
Q90. What are memory-mapped I/O registers?
Answer:
Registers of peripherals (UART, GPIO, etc.) mapped into the processor’s address space. Accessed using pointers in C (often volatile).
Q91. What are the differences between polling and interrupt-driven I/O?
Answer:
- Polling: CPU repeatedly checks status → wastes CPU time.
 - Interrupt-driven: Peripheral notifies CPU only when needed → efficient, real-time.
 
Q92. What are static and dynamic libraries in embedded C?
Answer:
- Static libraries (.a, .lib): Linked at compile time, increase code size, no runtime dependency.
 - Dynamic libraries (.so, .dll): Loaded at runtime, smaller executable, but need OS support (rare in MCUs).
 
Q93. What is the difference between task, thread, and process in embedded systems?
Answer:
- Task/Thread: Lightweight execution unit inside a process, share memory. Common in RTOS.
 - Process: Independent execution unit with separate memory space (common in OS, not MCUs).
 
Q94. How do you debug hard faults in ARM Cortex-M MCUs?
Answer:
- Use hard fault handler to capture registers (PC, LR, SP).
 - Use debugger (JTAG/SWD).
 - Check stack overflow, null pointer dereference, misaligned access.
 
Q95. What is cache coherency in embedded systems?
Answer:
Occurs when data in CPU cache and main memory are inconsistent. Must use cache flush/invalidate operations for DMA or shared memory.
Q96. How does DMA improve system performance?
Answer:
DMA (Direct Memory Access) transfers data between memory and peripherals without CPU intervention, freeing CPU for other tasks.
Q97. What are critical sections in embedded programming?
Answer:
Portions of code that must not be interrupted while accessing shared resources. Protected using disabling interrupts, mutexes, or semaphores.
Q98. What are some common debugging techniques in embedded systems?
Answer:
- LED debug signals (toggling GPIOs)
 - Serial (UART) logging
 - JTAG/SWD debugging
 - Logic analyzers & oscilloscopes
 - Watchpoints & breakpoints
 
Q99. What is a bootloader in embedded systems?
Answer:
A small program that runs before the main application to initialize hardware, load firmware updates, or enable OTA programming.
Q100. What is MISRA C and why is it important?
Answer:
MISRA C is a set of coding guidelines for safety-critical systems (automotive, medical, aerospace). Ensures portability, safety, and reliability in embedded C code.




Leave a Reply