What Is Embedded C Programming? How Is Embedded C Different From C Language?
What Is Embedded C Programming? How Is Embedded C Different From C Language?
What Is Embedded C Programming? How Is Embedded C Different From C Language?
A startup code is that piece of code that is called before the execution of the main
function. This is used for creating a basic platform for the application and it is
written in assembly language.
3. What is ISR?
ISR expands to Interrupt Service Routines. These are the procedures stored at a
particular memory location and are called when certain interrupts occur. Interrupt
refers to the signal sent to the processor that indicates there is a high-priority event
that requires immediate attention. The processor suspends the normal flow of the
program, executes the instructions in ISR to cater for the high priority event. Post
execution of the ISR, the normal flow of the program resumes. The following
diagrams represent the flow of ISR.
You can download a PDF version of Embedded C Interview Questions.
Download PDF
Void pointers are those pointers that point to a variable of any type. It is a generic
pointer as it is not dependent on any of the inbuilt or user-defined data types while
referencing. During dereferencing of the pointer, we require the correct data type
to which the data needs to be dereferenced.
For Example:
char c = 'a';
*ptr = &c; //Same void pointer can be used to point to data of
different type -> reusability
print("%c",(*(char*)ptr));
Void pointers are used mainly because of their nature of re-usability. It is reusable
because any type of data can be stored.
6. What are the differences between the const and volatile qualifiers
in embedded C?
const volatile
The keyword “const” is enforced by
The keyword “volatile” tells the compiler to
the compiler and tells it that no
not perform any optimization on the variables
changes can be made to the value of
and not to assume anything about the
that object/variable during program
variables against which it is declared.
execution.
Example: const int x=20;, here if the Example: volatile int x;, here the compiler
program attempts to modify the value is told to not assume anything regarding the
of x, then there would be a compiler variable x and avoid performing optimizations
error as there is const keyword on it. Every time the compiler encounters the
assigned which makes the variable x variable, fetch it from the memory it is
non-modifiable. assigned to.
main(){
We can think of it like this if arguments x and y are passed, then the macro just
returns xy -> The concatenation of x and y.
Interrupt latency refers to the time taken by ISR to respond to the interrupt. The
lesser the latency faster is the response to the interrupt event.
9. How will you use a variable defined in source file1 inside source
file2?
We can achieve this by making use of the “extern” keyboard. It allows the variable
to be accessible from one file to another. This can be handled more cleanly by
creating a header file that just consists of extern variable declarations. This header
file is then included in the source files which uses the extern variables. Consider an
example where we have a header file named variables.h and a source file
named sc_file.c.
/* variables.h*/
extern int global_variable_x;
/* sc_file.c*/
#include "variables.h" /* Header variables included */
#include <stdio.h>
void demoFunction(void)
{
printf("Value of Global Variable X: %d\n", global_variable_x++);
}
A segmentation fault occurs most commonly and often leads to crashes in the
programs. It occurs when a program instruction tries to access a memory address
that is prohibited from getting accessed.
11. What are the differences between Inline and Macro Function?
The const keyword is used when we want to ensure that the variable value should
not be changed. However, the value can still be changed due to external interrupts
or events. So, we can use const with volatile keywords and it won’t cause any
problem.
Variables defined with static are initialized once and persists until the end of the
program and are local only to the block it is defined. A static variables declaration
requires definition. It can be defined in a header file. But if we do so, a private copy
of the variable of the header file will be present in each source file the header is
included. This is not preferred and hence it is not recommended to use static
variables in a header file.
The Pre-decrement operator ( --operand) is used for decrementing the value of the
variable by 1 before assigning the variable value.
A function is called reentrant if the function can be interrupted in the middle of the
execution and be safely called again (re-entered) to complete the execution. The
interruption can be in the form of external events or signals or internal signals like
call or jump. The reentrant function resumes at the point where the execution was
left off and proceeds to completion.
Loops that involve count down to zero are better than count-up loops. This is
because the compiler can optimize the comparison to zero at the time of loop
termination. The processors need not have to load both the loop variable and the
maximum value for comparison due to the optimization. Hence, count down to 0
loops are always better.
A null pointer is a pointer that does not point to any valid memory location. It is
defined to ensure that the pointer should not be used to modify anything as it is
invalid. If no address is assigned to the pointer, it is set to NULL.
Syntax:
One of the uses of the null pointer is that once the memory allocated to a pointer is
freed up, we will be using NULL to assign to the pointer so that it does not point to
any garbage locations.