Fundamentals 24 min read

CVTE Embedded Technology Interview Experience and Key Technical Concepts

This article presents a comprehensive collection of CVTE embedded engineering interview questions and answers, covering project introductions, C/C++ operators, the static keyword, pointers vs. references, copy constructors, Linux sed usage, file system types, I²C limits, interrupt handling, recursion, IPC, GPIO modes, and compilation stages, providing clear explanations and code examples for each topic.

Deepin Linux
Deepin Linux
Deepin Linux
CVTE Embedded Technology Interview Experience and Key Technical Concepts

Hello everyone, I am DeepDiveCPP. Today I share the CVTE embedded technology interview experience; embedded positions have been very popular in recent years, offering attractive salaries, making it a good alternative for those not interested in backend development.

Is this position demanding for fresh graduates? Compared to backend Java or C++, the requirements are slightly lower; proficiency in C language is essential, which attracts many C/C++ developers.

The interview mainly assesses embedded system fundamentals, C/C++ programming ability, microcontrollers and single‑chip microcomputers, communication protocols, and bus interfaces.

Interview question source: https://www.nowcoder.com/ (Answers are self‑summarized; please point out any errors)

(1) Project Introduction

Interviewers ask about the project overview, your responsibilities, technologies used, challenges faced, and how you solved them.

(2) Difference Between ++i and i++

In C++, ++i is the prefix increment operator: it increments the variable first and then returns the incremented value. i++ is the postfix increment operator: it returns the original value first and then increments the variable.

++i increments before returning the value.

i++ returns the original value before incrementing.

Example:

int i = 5;
int a = ++i; // i becomes 6, a is 6
int b = i++; // b gets current i (6), then i becomes 7

cout << "a: " << a << endl; // prints: 6
cout << "b: " << b << endl; // prints: 6
cout << "i: " << i << endl; // prints: 7

Use ++i when you need the incremented value immediately; use i++ when you need the original value first.

(3) Role of the static Keyword

Inside a function: static makes the variable persist across calls, initializing it only once.

At global scope: static limits the variable or function's linkage to the current translation unit, preventing name clashes.

Inside a class: static members belong to the class itself, shared by all instances; they can be accessed via the class name. Static member functions lack a this pointer and can only access static data.

Static data members must be defined outside the class (or initialized inline in C++17 and later).

Static local variables are initialized only on the first entry to the function and retain their value thereafter.

(4) Difference Between Pointers and References

Declaration: pointers use * , references use & and must be initialized.

Memory address: a pointer stores an address and is dereferenced with * ; a reference is an alias and has no separate address.

Nullability: pointers can be null (nullptr); references must bind to a valid object.

Re‑assignability: pointers can change the object they point to; references cannot be reseated after initialization.

Space: pointers occupy storage for the address; references do not require extra storage.

Function parameters: passing a pointer allows the callee to modify the original via dereferencing; passing a reference provides the same effect without explicit dereferencing.

(5) Why Copy Constructors Take a Reference Parameter

The copy constructor uses a reference to avoid infinite recursive calls that would occur if the parameter were passed by value.

In C++, a copy constructor is invoked when an object is passed by value, returned from a function, or initialized from another object. Passing the parameter by value would trigger another copy, leading to endless recursion.

Using a const reference passes the original object without creating a new copy, preventing recursion and improving efficiency.

class MyClass {
public:
    MyClass(const MyClass& other) {
        // copy logic
    }
};

(6) Linux Command to Replace Underscore in "CVTE_STN" with a Space

Use the sed command, which supports regular‑expression based search and replace.

Example:

echo "CVTE_STN" | sed 's/_/ /g'

Output: "CVTE STN".

(7) Types of File Systems

FAT – simple file system for older Windows and removable media.

NTFS – Windows file system with permissions, journaling, encryption.

ext2/ext3/ext4 – common Linux file systems; ext4 offers the most features.

HFS+ – macOS file system for large storage and metadata journaling.

APFS – Apple’s modern file system with speed, security, and advanced features.

exFAT – Microsoft’s cross‑platform file system for large removable devices.

(8) Bootloader Question (details omitted)

(9) Knowledge of Assembly Language and Common Instructions

Assembly is a low‑level language that interacts directly with hardware.

Common instructions include:

Data transfer: MOV, PUSH, POP.

Arithmetic: ADD, SUB, MUL, DIV.

Control flow: JMP, conditional jumps (JC, JZ, JG, JE, etc.).

Logical: AND, OR, XOR, NOT.

Comparison: CMP.

Stack operations: PUSH, POP.

String handling: MOVS, CMPS, etc.

(10) Fastest Sorting Algorithm with Lowest Complexity

Counting sort has linear time complexity O(n) for integer keys within a known range, making it the most efficient in terms of asymptotic complexity when applicable.

It is limited to non‑negative integers (or a bounded range) and unsuitable for arbitrary data types.

(11) Maximum Number of I²C Slave Devices

I²C supports up to 128 slave addresses (7‑bit addressing), though some addresses are reserved, reducing the usable count.

(12) Difference Between Software and Hardware Interrupts

Software interrupts are triggered by executing special instructions within a program (e.g., system calls, exceptions). Hardware interrupts are generated by external devices signaling the CPU (e.g., I/O completion, key presses). Both cause the CPU to suspend the current flow and jump to an interrupt service routine.

(13) SPI Protocol Overview

Master‑slave architecture; one master controls one or more slaves.

Four lines: SCLK, MOSI, MISO, SS/CS.

Master selects a slave by pulling its SS low.

Data is transferred bit‑by‑bit synchronized with the clock; a full byte takes 8 clock cycles.

MOSI carries data from master to slave; MISO carries data from slave to master.

Sampling occurs on clock edges (commonly rising edge for transmit, falling edge for receive).

Supports full‑duplex or half‑duplex communication depending on hardware.

SPI is simple, high‑speed, low‑cost, and reliable, suitable for sensors, memory, displays, etc.

(14) Why TCP Is Considered a Secure Connection Method

TCP itself provides reliable, ordered delivery but no encryption or authentication. Security is achieved by layering protocols such as TLS/SSL on top of TCP, which encrypts the data and verifies peer identities.

(15) Four Stages of Program Compilation and Their Output Files

Preprocessing – expands macros and includes headers; output files typically have .i or .ii extensions.

Compilation – translates preprocessed source to assembly; output files have .s extension.

Assembly – converts assembly to machine code; produces object files with .o extension (or no extension).

Linking – combines object files and libraries into an executable or shared library.

(16) Characteristics of Interrupt Service Routines and the Effect of a 10 ms Delay Inside One

Interrupt routines must execute quickly, have high priority, and preserve the interrupted context. Introducing a 10 ms delay blocks the CPU, violates real‑time constraints, and can prevent handling of other interrupts.

(17) Behavior of a Recursive Function Without a Base Condition

Without a termination condition, the function recurses indefinitely until the call stack overflows, causing a runtime crash.

(18) Most Common Inter‑Process Communication Method

Sockets are the most widely used IPC mechanism, providing network‑level communication that works across hosts and supports protocols such as TCP/IP and UDP.

(19) Ways to Unblock a Stalled Process

Set a timeout on the blocking operation.

Convert the task to asynchronous execution with callbacks or event‑driven logic.

Offload the work to another thread or process.

Use non‑blocking I/O.

Send a signal to interrupt the blocked state.

(20) Understanding Synchronization, Concurrency, and Exceptions

Synchronous execution runs tasks sequentially, blocking until each completes. Asynchronous execution allows tasks to proceed without waiting, typically using callbacks or event loops. Concurrency involves multiple tasks making progress simultaneously, requiring synchronization primitives (locks, semaphores) to avoid race conditions. Exceptions are runtime error objects that can be caught and handled to maintain program stability.

(21) GPIO Modes and Edge Trigger Types

GPIO can be configured as Input or Output. Trigger modes include Rising Edge, Falling Edge, Both Edge, and No Edge, determining when an interrupt or action is generated based on signal transitions.

(22) Knowledge of Other Programming Languages (e.g., Java, Python)

...

(23) Hand‑written Code Question (Medium Difficulty – Approach Described)

...

programmingClinuxInterviewHardwareembedded
Deepin Linux
Written by

Deepin Linux

Research areas: Windows & Linux platforms, C/C++ backend development, embedded systems and Linux kernel, etc.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.