Embedded C Interview Guide - 100 Key Questions & Answers
Embedded C Interview Guide - 100 Key Questions & Answers
In my previous post, I have created a collection of “c interview questions” that is liked by many people. I have also got the response
to create a list of interview questions on “embedded c”. So here I have tried to create some collection of embedded c interview
questions that might be asked by your interviewer.
Linkedin@Keerthanagaliveeti
being taken by the code. If an object is qualified by the volatile qualifier (https://aticleworld.com/understanding-
volatile-qualifier-in-c/), the compiler reloads the value from memory each time it is accessed by the program that means it
prevents from to cache a variable into a register. Reading the value from memory is the only way to check the unpredictable
change of the value.
In another side volatile prevent from any compiler optimization and says that the value of the object can be changed by
something that is beyond the control of the program and so that compiler will not make any assumption about the object. e.g,
volatile int a;
When the compiler sees the above declaration then it avoids to make any assumption regarding the “a” and in every iteration
read the value from the address which is assigned to the variable.
After using the volatile keyword, you will get the proper value whenever you are accessing the ports but still here is one more
problem because the pointer is not const type so it might be your program change the pointing address of the pointer. So we
have to create a constant pointer with volatile keyword.
Syntax of declaration,
Linkedin@Keerthanagaliveeti
| | +- - - - - - - - - - - - - - - - - > pointer to a
| + > volatile
+ > integer
unit32_t GetRecvData()
{
//Code to recv data
while (((*pStatusReg) & COM_STATUS_BIT) == 0)
{
// Wait until flag does not set
}
return RecvData;
}
& Sharing the global variables or buffers between the multiple threads.
& Accessing the global variables in an interrupt routine or signal handler.
int main(void)
{
while (!giFlag)
{
//do some work
}
return 0;
}
What is ISR?
An ISR refers to the Interrupt Service Routines. These are procedures stored at specific memory addresses which are called when a
certain type of interrupt occurs. The Cortex-M processors family has the NVIC that manage the execution of the interrupt.
Linkedin@Keerthanagaliveeti
Can we pass any parameter and return a value from the ISR?
An ISR returns nothing and not allow to pass any parameter. An ISR is called when a hardware or software event occurs, it is not
called by the code, so that’s the reason no parameters are passed into an ISR.
In the above line, we have already read that the ISR is not called by the code, so there is no calling code to read the returned
values of the ISR. It is the reason that an ISR is not returned any value.
The Cortex-M processors have the very low interrupt latency. In below table, I have mentioned, Interrupt latency of Cortex- M
processors with zero wait state memory systems.
Cortex-M0 16
Cortex-M0+ 15
Cortex-M3 12
Cortex-M4 12
Cortex-M7 12
The interval between the two signals (interrupt latency) may be easily read from the instrument.
Linkedin@Keerthanagaliveeti
& CPU clock speed.
& Timer frequency
& Cache configuration.
& Application program.
So using the proper selection of platform and processor we can easily reduce the interrupt latency. We can also reduce the interrupt
latency by making the ISR shorter and avoid to calling a function within the ISR.
Linkedin@Keerthanagaliveeti
If you want to learn STM32 from scratch, you should follow this course “ Mastering Microcontroller with Embedded
Driver Development (https://click.linksynergy.com/deeplink?
id=UajS5soDmWY&mid=39197&murl=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Fwww.udemy.com%2Fmastering-microcontroller-with-
peripheral-driver-development%2F)“. The course contains video lectures of 18.5-hours length covering all topics like,
Microcontroller & Peripheral Driver Development for STM32 GPIO, I2C, SPI, USART using Embedded C.
(https://click.linksynergy.com/deeplink?
id=UajS5soDmWY&mid=39197&murl=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Fwww.udemy.com%2Fmastering-microcontroller-with-
peripheral-driver-development%2F)
The Cortex-M3 and Cortex-M4 processors the NVIC supports up to 240 interrupt inputs, with 8 up to 256 programmable
priority levels
One important point also needs to remember that function which is called from the ISR should be re-entrant. If the called
function is not re-entrant, it could create the issues.
For example,
Linkedin@Keerthanagaliveeti
If the function is not reentrant and supposes that it is called by another part of the code beside the ISR. So the problem will be
invoked when if the ISR calls the same function which is already invoked outside of the ISR?
C Programming Language, 2nd Edition (https://aax-us-east.amazon- Making Embedded Systems: Design Patterns for Grea… (https://aax-us-
adsystem.com/x/c/QhI8hDUxdOncJ6OQu6mi- east.amazon-adsystem.com/x/c/QhI8hDUxdOncJ6OQu6mi-
YkAAAFrzBID6AEAAAFKAZ9lcWc/https://www.amazon.com/Programming- YkAAAFrzBID6AEAAAFKAZ9lcWc/https://www.amazon.com/Making-
L$6a0n.g3u0ag$e67-2.0n0d-Brian- $E3m0b.4e0dd$e3d9-.9S9ystems-Patterns-
Kernighan/dp/(0611351)103628/ref=sm_n_se_dkp_VN_pr_sea_0_0? Software/dp/1(45449)302149/ref=sm_n_se_dkp_VN_pr_sea_0_1?
adId=0131103628&creativeASIN=0131103628&linkId=0e96fb5178b3c0d08d9… adId=1449302149&creativeASIN=1449302149&linkId=0e96fb5178b3c0d08d9…
20&linkCode=w42&ref- 20&linkCode=w42&ref-
refURL=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Faticl eworld.com%2Fe mbedded-c-interview- refURL=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Faticl eworld.com%2Fem bedded-c-interview-
questions-2%2F&slotNum=1&im prToken=Pacoyq B5K.- questions-2%2F&slotNum=1&im prToken=Pacoyq B5K.-
KajXbujSXGg&adType=smart& adMode=search& adFormat=grid&impressionTi… KajXbujSXGg&adType=smart& adMode=search& adFormat=grid&impressionTi…
Embedded C Programming: Techniques and Applicatio… (https://aax-us- Test Driven Development for Embedded C (Pragmat… (https://aax-us-
east.amazon-adsystem.com/x/c/QhI8hDUxdOncJ6OQu6mi- east.amazon-adsystem.com/x/c/QhI8hDUxdOncJ6OQu6mi-
YkAAAFrzBID6AEAAAFKAZ9lcWc/https://www.amazon.com/Embedded- YkAAAFrzBID6AEAAAFKAZ9lcWc/https://www.amazon.com/Driven-
$P5ro0g.3ra5m$m59i.n9g5-Techniques-Applications- $D2e6v.e6l0op$m34e.n95t-Embedded-Pragmatic-
MCUS/dp/012(830)13141/ref=sm_n_se_dkp_VN_pr_sea_1_0? Programmers(/d3p2/)193435662X/ref=sm_n_se_dkp_VN_pr_sea_1_1?
adId=0128013141&creativeASIN=0128013141&linkId=0e96fb5178b3c0d08d9… adId=193435662X&creativeASIN=193435662X&linkId=0e96fb5178b3c0d08d…
Ads by Amazon (https://aax-us-east.amazon-adsystem.com/x/c/QhI8hDUxdOncJ6OQu6mi-YkAAAFrzBID6AEAAAFKAZ9lcWc/https://affiliate-program.amazon.com/home/ads/ref=sm_n_se_dkp_VN_logo?
adId=logo&creativeASIN=logo&linkId=0e96fb5178b3c0d08d9383a937f63edd&tag=aticleworld02-20&linkCode=w42&ref-refURL=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Faticleworld.com%2Fembedded-c-interview-questions-
2%2F&slotNum=1&imprToken=PacoyqB5K.-KajXbujSXGg&adType=smart&adMode=search&adFormat=grid&impressionTimestamp=1562496864063&ac-ms-src=nsa-ads&cid=nsa-ads)
(https://aax-us-east.amazon-adsystem.com/x/c/QhI8hDUxdOncJ6OQu6mi-YkAAAFrzBID6AEAAAFKAZ9lcWc/https://www.amazon.com/adprefs/ref=sm_n_se_dkp_VN_ac?
tag=aticleworld02-20&linkCode=w42)
Linkedin@Keerthanagaliveeti
& Copy any initialized data from ROM to RAM.
& Zero the uninitialized data area.
& Allocate space for and initialize the stack.
& Initialize the processor’s stack pointer.
& Create and initialize the heap.
& Enable interrupts.
& Call main.
Infinite loops often arise in embedded systems. How do you code an infinite loop in C?
In embedded systems, infinite loops are generally used. If I talked about a small program to control a led through the switch, in
that scenario an infinite loop will be required if we are not going through the interrupt.
There are the different way to create an infinite loop, here I am mentioning some methods.
Method 1:
while(1)
{
// task
}
Method 2:
for(;;)
{
// task
}
Method 3:
Loop:
goto Loop;
Linkedin@Keerthanagaliveeti
//variable to stored the read value
uint32_t readData = 0;
RISC CISC
Acronym It stands for ‘Reduced Instruction Set It stands for ‘Complex Instruction Set
Computer’. Computer’.
Definition The RISC processors have a smaller set The CISC processors have a larger set of
of instructions with few addressing nodes. instructions with many addressing nodes.
Memory unit It has no memory unit and uses a It has a memory unit to implement
separate hardware to implement complex instructions.
instructions.
Calculations The calculations are faster and precise. The calculations are slow and precise.
External memory It does not require external memory for It requires external memory for
calculations. calculations.
Pipelining Pipelining does function correctly. Pipelining does not function correctly.
Code expansion Code expansion can be a problem. Code expansion is not a problem.
Linkedin@Keerthanagaliveeti
What is the stack overflow?
If your program tries to access the beyond the limit of the available stack memory then stack overGow occurs. In other word you
can say that a stack overGow occurs if the call stack pointer exceeds the stack boundary.
If stack overGow occurs, the program can crash or you can say that segmentation fault that is the result of the stack overGow.
The important difference between the I2C and SPI communication protocol.
& I2C support half duplex while SPI is the full duplex communication.
& I2C requires only two wire for communication while SPI requires three or four wire for communication (depends on
requirement).
& I2C is slower as compared to the SPI communication.
& I2C draws more power than SPI.
& I2C is less susceptible to noise than SPI.
& I2C is cheaper to implement than the SPI communication protocol.
& I2C work on wire and logic and it has a pull-up resistor while there is no requirement of pull-up resistor in case of the SPI.
& In I2C communication we get the acknowledgment bit after each byte, it is not supported by the SPI communication protocol.
& I2C ensures that data sent is received by the slave device while SPI does not verify that data is received correctly.
& I2C support the multi-master communication while multi-master communication is not supported by the SPI.
& One great difference between I2C and SPI is that I2C supports multiple devices on the same bus without any additional select
lines (work on the basis of device address) while SPI requires additional signal (slave select lines) lines to manage multiple
devices on the same bus.
& I2C supports arbitration while SPI does not support the arbitration.
& I2C support the clock stretching while SPI does not support the clock stretching.
& I2C can be locked up by one device that fails to release the communication bus.
& I2C has some extra overhead due to start and stop bits.
Linkedin@Keerthanagaliveeti
& I2C is better for long distance while SPI is better for the short distance.
& In the last I2C developed by NXP while SPI by Motorola.
There is no common clock signal between the sender and Communication is done by a shared clock.
receivers.
Sends 1 byte or character at a time. Sends data in the form of blocks or frames.
communication. A start and stop bit used for the data synchronization. A shared clock is used for the data
synchronization.
Economical Costly
Linkedin@Keerthanagaliveeti
Bit Rate Baud Rate
Bit rate is the number of bits per second. Baud rate is the number of signal units per second.
It determines the number of bits traveled per second. It determines how many times the state of a signal is changing.
Cannot determine the bandwidth. It can determine how much bandwidth is required to send the
signal.
This term generally used to describe the processor efficiency. This term generally used to describe the data transmission over
the channel.
Bit rate = baud rate x the number of bits per signal unit Baud rate = bit rate / the number of bits per signal unit
Generally, the segmentation fault occurs when a program tried to access a memory location that it is not allowed to access or
tried to access a memory location in a way that is not allowed (tried to access read-only memory).
Linkedin@Keerthanagaliveeti
In case of a BUS error, SIGBUS (10) signal is generated. The Bus error issue occurs when a program tries to access an invalid
memory or unaligned memory. The bus error comes rarely as compared to the segmentation fault.
Primarily size of integer depends on the type of the compiler which has written by compiler writer for the underlying
processor. You can see compilers merrily changing the size of integer according to convenience and underlying
architectures. So it is my recommendation use the C99 integer data types ( uin8_t, uin16_t, uin32_t ..) in place of standard int.
& A signed integer can store the positive and negative value both but beside it unsigned integer can only store the positive
value.
& The range of nonnegative values of a signed integer type is a sub-range of the corresponding unsigned integer type.
For example,
Linkedin@Keerthanagaliveeti
Assuming size of the integer is 2 bytes.
signed int -32768 to +32767
unsigned int 0 to 65535
& When computing the unsigned integer, it never gets overflow because if the computation result is greater than the largest
value of the unsigned integer type, it is reduced modulo the number that is one greater than the largest value that can be
represented by the resulting type.
For example,
Computational Result % (Largest value of the unsigned integer+1)
& The overflow of signed integer type is undefined.
& If Data is signed type negative value, the right shifting operation of Data is implementation dependent but for the unsigned
type, it would be Data/ 2pos.
& If Data is signed type negative value, the left shifting operation of Data show the undefined behavior but for the unsigned
type, it would be Data x 2pos.
typedef:
The C language provides a very important keyword typedef (https://aticleworld.com/typedef-in-c/) for defining a
new name for existing types. The typedef is the compiler directive mainly use with user-defined data types (structure, union
or enum) to reduce their complexity and increase the code readability and portability.
Syntax,
typedef type NewTypeName;
Now UnsignedInt is a new type and using it, we can create a variable of unsigned int.
UnsignedInt Mydata;
In above example, Mydata is variable of unsigned int.
Note: A typedef creates synonyms or a new name for existing types it does not create new types.
Linkedin@Keerthanagaliveeti
Macro:
A macro is a pre-processor directive and it replaces the value before compiling the code.One of the major problem with the macro
that there is no type checking. Generally, the macro is used to create the alias, in C language macro is also used as a file guard.
Syntax,
#define Value 10
Now Value becomes 10, in your program, you can use the Value in place of the 10.
An enumeration increases the readability of the code and easy to debug in comparison of symbolic constant (macro).
The most important thing about the enum is that it follows the scope rule and compiler automatic assign the value to its
member constant.
Note: A variable of enumeration type stores one of the values of the enumeration list defined by that type.
Syntax of enum,
enum Enumeration_Tag { Enumeration_List };
Example,
enum FLASH_ERROR { DEFRAGMENT_ERROR, BUS_ERROR};.
Linkedin@Keerthanagaliveeti
Number | = (1<< nth Position)
Clearing a Bits
Bitwise AND operator (&) use to clear a bit of integral data type. “AND” of two bits is always zero if any one of them is zero.To clear
the nth bit, first, you need to invert the string of bits then AND it with the number.
Checking a Bits
To check the nth bit, shift the ‘1’ nth position toward the left and then “AND” it with the number.
Toggling a Bits
Bitwise XOR (^) operator use to toggle the bit of an integral data type. To toggle the nth bit shift the ‘1’ nth position toward
the left and “XOR” it.
Write a program swap two numbers without using the third variable?
Let’s assume a, b two numbers, there are a lot of methods two swap two number without using the third variable.
main()
{
int a = 10, b = 5;
return 0;
}
main()
{
int a = 10, b = 5;
return 0;
}
Linkedin@Keerthanagaliveeti
What is meant by structure padding?
In the case of structure or union, the compiler inserts some extra bytes between the members of structure or union for the
alignment, these extra unused bytes are called padding bytes (https://aticleworld.com/data-alignment-and-
structure-padding-bytes/) and this technique is called padding.
Padding has increased the performance of the processor at the penalty of memory.In structure or union data members aligned
as per the size of the highest bytes member to prevent from the penalty of performance.
Note: Alignment of data types mandated by the processor architecture, not by language.
Big-endian
The most significant byte of data stored at the lowest memory address.
Little-endian
The least significant byte of data stored at the lowest memory address.
Linkedin@Keerthanagaliveeti
Note: Some processor has the ability to switch one endianness to other endianness using the software means it can
perform like both big endian or little endian at a time. This processor is known as the Bi-endian, here are some architecture
(ARM version 3 and above, Alpha, SPARC) who provide the switchable endianness feature.
Method 1:
int main(void)
{
uint32_t u32RawData; uint8_t
*pu8CheckData;
u32RawData = 0x11223344; //Assign data pu8CheckData
return 0;
}
Method 2:
typedef union
{
}RawData;
int main(void)
{
RawData uCheckEndianess;
uCheckEndianess.u32RawData = 0x11223344; //assign the value
Linkedin@Keerthanagaliveeti
}
return 0;
}
Method 1:
int main()
{
uint32_t u32CheckData = 0x11223344;
uint32_t u32ResultData =0;
u32ResultData = ChangeEndianness(u32CheckData); //swap the data printf("0x%x\n",u32ResultData);
u32CheckData = u32ResultData;
u32ResultData = ChangeEndianness(u32CheckData);//again swap the data printf("0x%x\n",u32ResultData);
return 0;
}
Static Allocation means, an object has external or internal linkage or declared with static storage-class. It’s initialized only once,
prior to program startup and its lifetime is throughout the execution of the program. A global and static variable is an example of
static memory allocation.
In C language, there are a lot of library functions (malloc, calloc, or realloc,..) which are used to allocate memory
dynamically. One of the problems with dynamically allocated memory i (https://aticleworld.com/dynamic-
memory-allocation-in-c/)s that it is not destroyed by the compiler itself that means it is the responsibility of the user to deallocate
the allocated memory.
When we allocate the memory using the memory management function, they return a pointer to the allocated memory
block and the returned pointer is pointing to the beginning address of the memory block. If there is no space available,
these functions return a null pointer.
Linkedin@Keerthanagaliveeti
Linkedin@Keerthanagaliveeti
What is the memory leak in C?
A memory leak (https://aticleworld.com/problems-with-dynamic-memory-allocation/) is a common and
dangerous problem. It is a type of resource leak. In C language, a memory leak occurs when you allocate a block of
memory using the memory management function and forget to release it.
int main ()
{
/* Do some work */
Note: once you allocate a memory than allocated memory does not allocate to another program or process until it gets
free.
In C language,calloc function initialize the all allocated space bits with zero but malloc does not initialize the allocated
memory. These both function also has a difference regarding their number of arguments, malloc take one argument but calloc
takes two.
The calloc function first deallocates the old object and allocates again with newly specified size. If the new size is lesser to
the old size, the contents of the newly allocated memory will be same as prior but if any bytes in the newly created object
goes beyond the old size, the values of the exceeded size will be indeterminate.
Syntax:
void *realloc(void *ptr, size_t size);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
char *pcBuffer = NULL;
/* Initial memory allocation */
pcBuffer = malloc(8);
Linkedin@Keerthanagaliveeti
//free the allocated memory
free(pcBuffer);
return 0;
}
Output:
pcBuffer = aticle
pcBuffer = aticleworld
Note: It should be used for dynamically allocated memory but if a pointer is a null pointer, realloc behaves like the malloc
function.
The external fragmentation is due to the small free blocks of memory (small memory hole) that is available on the free list
but program not able to use it. There are different types of free list allocation algorithms that used the free memory block
ePciently.
To understand the external fragmentation, consider a scenario where a program has 3 contiguous blocks of memory and
the user frees the middle block of memory. In that scenario, you will not get a memory, if the required block of memory is
larger than a single block of memory (but smaller or equal to the aggregate of the block of memory).
The internal fragmentation is wasted of memory that is allocated for rounding up the allocated memory and in bookkeeping
(infrastructure), the bookkeeping is used to keep the information of the allocated memory.
Whenever we called the malloc function then it reserves some extra bytes (depend on implementation and system) for bookkeeping.
This extra byte is reserved for each call of malloc and become a cause of the internal fragmentation.
Linkedin@Keerthanagaliveeti
For example,
See the below code, the programmer may think that system will be allocated 8 *100 (800) bytes of memory but due to
bookkeeping (if 8 bytes) system will be allocated 8*100 extra bytes. This is an internal fragmentation, where 50% of the heap
waste.
main()
{
int iLoop = 0;
while(iLoop < 100)
{
acBuffer[iLoop ] = malloc(8);
++iLoop;
Whenever we call the free function and pass the pointer that is pointing to allocated memory, the free function gets the
bookkeeping information and release the allocated memory. Anyhow if you or your program change the value of the pointer
that is pointing to the allocated address, the calling of free function give the undefined result.
For example,
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *pcBuffer = NULL;
pcBuffer = malloc(sizeof(char) * 16); //Allocate the memory pcBuffer++;
return 0;
}
Linkedin@Keerthanagaliveeti
What is a Function Pointer?
Linkedin@Keerthanagaliveeti
A function pointer (https://aticleworld.com/use-of-function-pointer-in-c/) is similar to the other pointers but the
only difference is that it points to a function instead of the variable.
In the other word, we can say, a function pointer is a type of pointer that store the address of a function and these pointed function can
be invoked by function pointer in a program whenever required.
The declaration of a pointer to a function is similar to the declaration of a function. That means function pointer also requires a
return type, declaration name, and argument list. One thing that you need to remember here is, whenever you declare the
function pointer in the program then declaration name is preceded by the * (Asterisk) symbol and enclosed in parenthesis.
For example,
For the better understanding, let’s take an example to describe the declaration of a function pointer in c.
e.g,
void ( *pfDisplayMessage) (const char *);
In above expression, pfDisplayMessage is a pointer to a function taking one argument, const char *, and returns void.
When we declare a pointer to function in c then there is a lot of importance of the bracket. If in the above example, I remove the
bracket, then the meaning of the above expression will be change and it becomes void *pfDisplayMessage (const char *). It is a
declaration of a function which takes the const character pointer as arguments and returns void pointer.
Linkedin@Keerthanagaliveeti
#include <stdio.h>
int main()
{
int x = -15; x =
x << 1;
printf("%d\n", x);
}
Output:
undefined behavior.
main()
{
int x = -30; x =
x >> 1;
printf("%d\n", x);
}
Output:
implementation-defined.
According to C standard, the pointer to void shall have the same representation and alignment requirements as a pointer to a
character type.A void pointer declaration is similar to the normal pointer, but the difference is that instead of data types we
use the void keyword.
Syntax:
void * Pointer_Name;
Linkedin@Keerthanagaliveeti
What is the advantage of a void pointer in C?
There are following advantages of a void pointer in c.
& Using the void pointer we can create a generic function that can take arguments of any data type. The memcpy and memmove
library function are the best examples of the generic function, using these function we can copy the data from the source to
destination.
e.g.
void * memcpy ( void * dst, const void * src, size_t num );
& We have already know that void pointer can be converted to another data type that is the reason malloc, calloc or realloc
library function return void *. Due to the void * these functions are used to allocate memory to any data type.
& Using the void * we can create a generic linked list.For more information see this link: How to create generic Link List.
For example,
#include<stdio.h> #include<stdlib.h>
int main()
{
int *piData = NULL;
piData = malloc(sizeof(int)* 10); //creating integer of size 10. free(piData); //free the
allocated memory
Linkedin@Keerthanagaliveeti
In simple word, we can say that dangling pointer is a pointer that not pointing a valid object of the appropriate type and it can be
the cause of the undefined behavior.
ELEGOO UNO Project Super Starter Kit with Tu… (https://aax-us-east.amazon- ARDUINO UNO R3 [A000066] (https://aax-us-east.amazon-
adsystem.com/x/c/Qs0FJuPHnq4rfJyQozucEksAAAFrzBID1AEAAAFKAULY9… adsystem.com/x/c/Qs0FJuPHnq4rfJyQozucEksAAAFrzBID1AEAAAFKAULY9…
Project-Tutorial-Controller- A000066-ARDUINO-UNO-
$P3ro5j.e0c0ts/dp/B01D8KOZF4/ref=sm_n_se_dkp_VN_pr_sea_0_0? $R230/d.0p0/B008GRTSV6/ref=sm_n_se_dkp_VN_pr_sea_0_1?
adId=B01D8K(O95Z8F)4&creativeASIN=B01D8KOZF4&linkId=49aef9aa83f7c2895… adId=B008GR(T7S32V)6&creativeASIN=B008GRTSV6&linkId=49aef9aa83f7c2895…
20&linkCode=w42&ref- 20&linkCode=w42&ref-
refURL=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Faticleworld.com%2Fembedded-c-interview- refURL=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Faticleworld.com%2Fembedded-c-interview-
questions- questions-
2%2F&slotNum=2&imprToke n=NXPhkADQ7syylOa NyXKzfg&adType=smart&… 2%2F&slotNum=2&imprT oken=NXPhkADQ7syylOaNyX Kzfg&adType=smart&…
Elegoo EL-KIT-008 Mega 2560 Project The Most C… (https://aax-us- Arduino Starter Kit - English Official Kit With 170 Page… (https://aax-us-
east.amazon- east.amazon-
adsystem.com/x/c/Qs0FJuPHnq4rfJyQozucEksAAAFrzBID1AEAAAFKAULY9… adsystem.com/x/c/Qs0FJuPHnq4rfJyQozucEksAAAFrzBID1AEAAAFKAULY9…
$K5IT9-.09098-Project-Complete-Ultimate- $S7ta0r.t0e0r-Kit-English-
Tutorial/dp/B0(15E4W4)NUUUA/ref=sm_n_se_dkp_VN_pr_sea_1_0? Official/dp/B00(796U0K)ZV0A/ref=sm_n_se_dkp_VN_pr_sea_1_1?
adId=B01EWNUUUA&creativeASIN=B01EWNUUUA&linkId=49aef9aa83f7c2… adId=B009UKZV0A&creativeASIN=B009UKZV0A&linkId=49aef9aa83f7c2895…
Ads by Amazon (https://aax-us-east.amazon-adsystem.com/x/c/Qs0FJuPHnq4rfJyQozucEksAAAFrzBID1AEAAAFKAULY9zo/https://affiliate-program.amazon.com/home/ads/ref=sm_n_se_dkp_VN_logo?
adId=logo&creativeASIN=logo&linkId=49aef9aa83f7c2895f4870b99f96dd36&tag=aticleworld02-20&linkCode=w42&ref-refURL=https%3A%2F%2Ffanyv88.com%3A443%2Fhttps%2Faticleworld.com%2Fembedded-c-interview-questions-
2%2F&slotNum=2&imprToken=NXPhkADQ7syylOaNyXKzfg&adType=smart&adMode=search&adFormat=grid&impressionTimestamp=1562496863492&ac-ms-src=nsa-ads&cid=nsa-ads)
(https://aax-us-east.amazon-adsystem.com/x/c/Qs0FJuPHnq4rfJyQozucEksAAAFrzBID1AEAAAFKAULY9zo/https://www.amazon.com/adprefs/ref=sm_n_se_dkp_VN_ac?
tag=aticleworld02-20&linkCode=w42)
In the other word, we can say every pointer in programming languages (https://aticleworld.com/pointers-in-
c/) that are not initialized either by the compiler or programmer begins as a wild pointer.
Syntax,
int *piData; //piData is wild pointer.
Linkedin@Keerthanagaliveeti
Syntax,
int *piData = NULL; // piData is a null pointer
If you are reading a Gash memory byte by bytes through the character pointer then here you have to use the post- increment,
either you will skip the first byte of the data. Because we already know that in case of pre-increment pointing address will be
increment first and after that, you will read the value.
main(void)
{
= acData; printf("%c
",*++pcData);
return 0;
}
Linkedin@Keerthanagaliveeti
But in place of pre-increment if we use post-increment then the problem is getting solved and you will get A as the output.
main(void)
{
= acData; printf("%c
",*pcData++);
return 0;
}
Besides that, when we need a loop or just only need to increment the operand then pre-increment is far better than post-
increment because in case of post increment compiler may have created a copy of old data which takes extra time. This is not
100% true because nowadays compiler is so smart and they are optimizing the code in a way that makes no difference between
pre and post-increment. So it is my advice, if post-increment is not necessary then you have to use the pre- increment.
Note: Generally post-increment is used with array subscript and pointers to read the data, otherwise if not necessary then use
pre in place of post-increment.Some compiler also mentioned that to avoid to use post-increment in looping condition. iLoop = 0.
main(void)
{
int aiData[5] = {100,200,300,400,500};
++*piData;
return 0;
}
Explanation:
In the above example, two operators are involved and both have the same precedence with a right to left associativity. So
the above expression ++*p is equivalent to ++ (*p). In another word, we can say it is pre-increment of value and output is 101,
200, 101.
main(void)
{
int aiData[5] = {100,200,30,40,50};
Linkedin@Keerthanagaliveeti
int *piData = aiData;
*++piData;
return 0;
}
Explanation:
In the above example, two operators are involved and both have the same precedence with the right to left associativity. So the
above expression *++p is equivalent to *(++p). In another word you can say it is pre-increment of address and output is 100,
200,200.
Syntax
const DataType Identifier = Value;
e.g.
const int iData = 0
Linkedin@Keerthanagaliveeti
& In call by reference function argument, if you don’t want to change the actual value which has passed in function.
Eg.
int PrintData ( const char *pcMessage);
& In some places, const is better then macro because const handle by the compiler and have a type checking.
Eg.
const int ciData = 100;
& In the case of I/O and memory mapped register const is used with the volatile qualifier for efficient access.
Eg.
const volatile uint32_t *DEVICE_STATUS = (uint32_t *) 0x80102040;
& When you don’t want to change the value of an initialized variable.
Constant pointer:
Let’s see the below example code when you will compile the below code get the compiler error.
#include<stdio.h> int
main(void)
{
int var1 = 10, var2 = 20;
printf("%d\n", *ptr);
return 0;
}
Linkedin@Keerthanagaliveeti
Pointer to a constant:
In this scenario the value of pointed address is constant that means we can not change the value of the address that is pointed by
the pointer.
#include<stdio.h> int
main(void)
{
int var1 = 100;
// pointer to constant integer const int*
ptr = &var1;
*ptr);
return 0;
}
& A static variable only initializes once, so a variable declared static within the body of a function maintains its prior value
between function invocations.
& A global variable with static keyword has an internal linkage, so it only accesses within the translation unit (.c). It is not
accessible by another translation unit. The static keyword protects your variable to access from another translation unit.
& By default in C language, linkage of the function is external that it means it is accessible by the same or another translation unit.
With the help of the static keyword, we can make the scope of the function local, it only accesses by the translation unit within
it is declared.
So global variable can be accessed outside of the file but the static global variable only accesses within the file in which it is
declared.
Linkedin@Keerthanagaliveeti
A external static variable ===>>> internal linkage.
A internal static variable ===>>> none .
Declaration of variable in c
A variable declaration only provides sureness to the compiler at the compile time that variable
(https://aticleworld.com/variable-in-c-language/) exists with the given type and name, so that compiler proceeds
for further compilation without needing all detail of this variable. In C language, when we declare a variable, then we only
give the information to the compiler, but there is no memory reserve for it. It is only a reference, through which we only
assure to the compiler that this variable may be defined within the function or outside of the function.
Note: We can declare a variable multiple time but defined only once.
eg,
extern int data;
extern int foo(int, int);
int fun(int, char); // extern can be omitted for function declarations
Definition of variable in c
The definition is action to allocate storage to the variable. In another word, we can say that variable definition is the way to
say the compiler where and how much to create the storage for the variable generally definition and declaration occur at the
same time but not almost.
eg,
int data;
int foo(int, int) { }
Note: When you define a variable then there is no need to declare it but vice versa is not applicable.
What is the difference between pass by value by reference in c and pass by reference in c?
Pass By Value:
& In this method value of the variable is passed. Changes made to formal will not affect the actual parameters.
& Different memory locations will be created for both variables.
& Here there will be temporary variable created in the function stack which does not affect the original variable.
Pass By Reference :
Linkedin@Keerthanagaliveeti
& Both formal and actual parameter shared the same memory location.
& it is useful when you required to returns more than 1 values.
Aticleworld invites you to try skillshare (Unlimited Access to over 20,000 classes) Premium free for 2 months.
for example,
Advantages:-
1)It saves the function calling overhead.
2) It also saves the overhead of variables push/pop on the stack, while function calling.
3) It also saves the overhead of return call from a function.
4) It increases locality of reference by utilizing instruction cache.
5) After inlining compiler can also apply intraprocedural optimization if specified. This is the most important one, in this way
compiler can now focus on dead code elimination, can give more stress on branch prediction, induction variable elimination
etc..
Linkedin@Keerthanagaliveeti
Disadvantages:-
1)May increase function size so that it may not fit in the cache, causing lots of cache miss.
2) After inlining function, if variables number which are going to use register increases than they may create overhead on
register variable resource utilization.
3) It may cause compilation overhead as if somebody changes code inside an inline function then all calling location will also
be compiled.
4) If used in the header file, it will make your header file size large and may also make it unreadable.
5) If somebody used too many inline functions resultant in a larger code size than it may cause thrashing in memory. More and
number of page fault bringing down your program performance.
6) It’s not useful for an embedded system where large binary size is not preferred at all due to memory size constraints.
Consider the two statements and find the difference between them?
Name[12];
int Age; float
Weight;
int RollNumber;
};
statement 1
STUDENT_INFO p1, p2;
statement 2 studentInfo
q1, q2;
Both statements looking same but actually, both are different to each other.
Statement 1 will be expanded to struct sStudentInfo * p1, p2. It means that p1 is a pointer to struct sStudentInfo but p2 is a variable of
struct sStudentInfo.
Linkedin@Keerthanagaliveeti
& I2C uses resistive pull-up for its bus. Limiting the bus speed.
& Bus speed is directly dependent on the bus capacitance, meaning longer I2C bus traces will limit the bus speed.
Here, I have mentioned some more embedded c interview questions for you. If you know, please write in the
comment box. Might be your comment helpful for others.
& What is the difference between flash memory, EPROM, and EEPROM?
& What is the difference between Volatile & Non Volatile Memory?
& What are the differences between a union and a structure in C?
& What is the difference between RS232 and UART?
& Is it possible to declare struct and union one inside other? Explain with example.
& How to find the bug in code using the debugger if the pointer is pointing to an illegal value.
& What is watchdog timer?
& What is the DMA?
& What is RTOS?
& What are CAN and its uses?
& Why is CAN having 120 ohms at each end?
& Why is CAN message-oriented protocol?
& What is the Arbitration in the CAN?
& Standard CAN and Extended CAN difference?
& What is the use of bit stuffing?
& How many types of IPC mechanism do you know?
& What is semaphore?
& What is the spinlock?
& Convert a given decimal number to hex.
& What is the difference between heap and stack memory?
& What is socket programming?
& How can a double pointer be useful?
& What is the difference between binary semaphore and mutex?
Linkedin@Keerthanagaliveeti
B A C K TO TOP
Linkedin@Keerthanagaliveeti