0% found this document useful (0 votes)
42 views550 pages

Embedded C

This document provides an overview of a course on microcontroller embedded C programming for absolute beginners from FASTBIT EMBEDDED BRAIN ACADEMY. It covers various topics related to C programming including data types, variables, comments, escape sequences, and the structure of a basic C program. Links are provided for the full video course, course repository, and the academy's other courses.

Uploaded by

phamdat22012001
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
42 views550 pages

Embedded C

This document provides an overview of a course on microcontroller embedded C programming for absolute beginners from FASTBIT EMBEDDED BRAIN ACADEMY. It covers various topics related to C programming including data types, variables, comments, escape sequences, and the structure of a basic C program. Links are provided for the full video course, course repository, and the academy's other courses.

Uploaded by

phamdat22012001
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 550

www.fastbitlab.

com

Microcontroller Embedded ‘C’


Programming : Absolute Beginners
FASTBIT EMBEDDED BRAIN ACADEMY
www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

License
This power point presentation by BHARATI
SOFTWARE is licensed under CC BY-SA 4.0
To view a copy of this license, visit
https://creativecommons.org/licenses/by-sa/4.0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Important Links
• For the full video course please visit
– https://www.udemy.com/course/microcontroller-embedded-c-programming/
• Course repository
– https://github.com/niekiran/Embedded-C/
• Explore all FastBit EBA courses
– http://fastbitlab.com/course1/
• For suggestions and feedback
[email protected]

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Social media
• Join our Facebook private group for technical discussion
• https://www.facebook.com/groups/fastbiteba/
• Linkedin
• https://www.linkedin.com/company/fastbiteba/
• Facebook
• https://www.facebook.com/fastbiteba/
• YouTube
• https://www.youtube.com/channel/UCa1REBV9hyrzGp2mjJCagBg
• Twitter
• https://twitter.com/fastbiteba

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

What is a program ?
• A program is a series of instructions that cause a
computer or a microcontroller to perform a
particular task.
• A computer program includes more than just
instructions. It also contains data and various
memory addresses on which the instructions
work to perform a specific task.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Programming languages in Embedded Systems


– C and C++ ( most widely used )
– Rust
– Assembly
– Java
– Python

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Survey by Embedded.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

C programming standardization
• The C programming language was initially developed in AT&T
labs by Professor Brian W. Kernighan and Dennis Ritchie,
known as K&R C.
• During the year 1970, ‘C’ programming became very popular
but without any serious standardization to the language.
• The non-official standard was called K&R C, which led to many
ambiguities among different compiler programmers, and that
led to non-portable codes.
• K&R C was the first non-official ‘C’ standard
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

C programming standardization
• In 1989 American National Standard Institute designed and approved first
official C standard called X3.159-1989, and in 1990 it was approved by ISO as
an international standard for C programming language: ISO/IEC 9899:1990
(This is also called ANSI C or C89 or C90 standard in short )

• The language underwent few more changes (addition of new features,


syntaxes, data types, etc. ) and newly updated standard released in 1999
under the ISO tag ISO/IEC 9899:1999 which is also called C99 standard in
short

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

C programming standardization
• C11 is an informal name for ISO/IEC 9899:2011, which is a new
standard approved in December 2011. C11 supersedes the C99
standard.
• In this course, we will be using the ‘C11’ standard with some
compiler (GCC) extensions (gnu11). More on this, we will see later.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Compatibility
• Note that if you have written a code using C90 standard, then it
will compile without any issues in –std=C99
compilation(backward compatibility )
• If you have written a code using C99 standard specific features,
then It may not compile successfully in C90 compilation

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

First ‘C’ Program “Hello World”

Let’s write a ‘C’ code which simply displays the


text Hello world on the “console” and exits.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Escape Sequences Meaning

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Difference between \n and \r


\n : moves the cursor to the beginning of the
new line vertically
\r : moves the cursor to the beginning of the
current line horizontally

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

cursor

H e l l o W o r l d ! Line 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
‘\r’ moves the cursor horizontally to the beginning of the current line

H e l l o W o r l d ! Line 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

cursor

b y e ! W o r l d ! Line 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Check your understanding


Write a program to print the below texts using printf function
You can download and copy the texts from resource section of this lecture.

David says , " Programming is fun !"


**Conditions apply , "Offers valid until tomorrow"
C:\My computer\My folder
D:/My documents/My file
\ \ \ \ Today is holiday \ \ \ \
This is a triple quoted string """ This month has 30 days """

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Overview of a ‘C’ program

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Comments
✓Generally Comments are used to provide the description or documentation
about the code you have written.

✓Through commenting you can mention important note , briefly explain


behaviour of the code, and other useful details.

✓Comments help the developer understand the logic/algorithm of the code if


he/she revisits it after a long time.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Comments
✓You can mention the comments anywhere you want in the program and your
comments will be ignored by the compiler .

✓Comments do not affect program or they do not consume any program memory
space . They are not part of the final executable generated . It is there just for the
documentation purpose .

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Comments
In C there are two types of comments :
Single line comment
Multi-line comment

Single line comments


Single line comments can be provided by using / /....................

Multiple line comments


Multiple line comments can be provided by using /*......................*/

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Multi line comments

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

single line comments

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

‘C’ data types and variables

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Data types :
✓Data type is used for declaring the type of a
variable
✓In C programming, data types determine the
type and size of data associated with variables
✓Before storing any value in a variable, first
programmer should decide its type

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Representing real world data


• Data as numbers (Integer or real numbers )
• Data as characters
• Data as strings (Collection of characters )

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Examples
• Roy’s age is 44 years, 6 months and 200 days
• The temperature of the city X is +27.2 degrees
Celsius.
• Today date is 21st June
• I got an ‘A’ grade in school assignment

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Data types :
Based on the real-world data we have
two significant data types in C

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

‘C’ data types

Integer data types Float data types

Used to represent whole numbers Used to represent real


(Integers ) numbers
Ex: 10, 20, 20 , etc Ex : 10, 24.5,
60.000001 etc

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Integer data are represented by different integer data types

Integer data types(for signed data)


char Short int1 int long int2

long long int3

1: also referred by just “short”; “int” is assumed


‘short int’ is synonymous with ‘short’
2 : also referred by just "long"; "int" is assumed
3: also referred by just "long long"; "int" is assumed
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Integer data types(for unsigned data)


unsigned char unsigned short int unsigned int

unsigned long int unsigned long long int

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
‘C’ integer data types , their storage sizes and value ranges
MEMORY SIZE
DATA TYPE (BYTES) RANGE

Meaning of memory size :


The compiler(e.g., GCC) will generate the code to allocate 64 bits (8 bytes of memory) for each long
long variable.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
XC8 is a cross compiler for PIC 8 bit microcontrollers

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
armcc cross compiler for 32 bit ARM based microcontrollers

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
‘C’ integer data types , their storage sizes and value ranges

✓The C standard does not fix the storage sizes of different data types. It only talks
about the minimum and maximum values .

✓For example C standard says, the minimum storage size of a long type variable is
32 bits, and the max is 64 bits. So, exact size of the long type variable depends on
the compiler design.

✓Some compilers fix 32 bits storage size for long type variables and some
compilers fix 64 bits. Same is true for int data type, Some compilers fix 16bits
storage size for int type variables and some compilers fix 32 bits.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

These data types will always be fixed size irrespective of


compilers
Short(singed or unsigned) is always 2 bytes
char(singed or unsigned) is always 1 byte
long long(singed or unsigned) is always 8 bytes

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Integer data type : char
✓This is an integer data type to store a single character(ASCII code)
value or 1 byte of signed integer value (+ve or –ve value)

✓A char data type variable consumes 1 byte of memory.

✓char happens to be the smallest integer data type of 1 byte.

✓There is no other special meaning for the char data type, and it is
just another integer data type.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Range of char data type


• char range : -128 to 127
– A char data type will be used to store 1 byte of
signed data
• Unsigned char range : 0 to 255
– An unsigned char data type will be used to store 1
byte of unsigned data

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Example
www.fastbitlab.com

I want to store the current temperature data of city ‘X’ in my program.

City X's today's temperature is 25 degree Celsius.

I am sure that X's temperature never goes below 0 degrees and never goes above
40 degrees Celsius.

That means City X's temperature will always be a positive value, and the max
value is less than 255.

So, here we can use unsigned char data type to represent temperature value.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Example-1

unsigned char cityXTemperature;


cityXTemperature = 25;

Here, cityXTemperature is a variable of type unsigned char to


hold the integer value 25.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Variable definition
Data type Variable name

unsigned char cityXTemperature; /* This is a variable definition */

cityXTemperature = 25; /* This is variable initialization */

✓Variable definition always includes “data type “ followed by “variable name”


✓Before using a variable , you should always define it using appropriate data type
✓You can select the data type according your program logic and need .

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Example-2
✓Storing sun’s temperature value in a program.
✓Sun’s surface temperature is 5,505 °C. Moreover, we know that it
will never be –ve value for another few billion years :D.
✓ So we can consider it as unsigned data (+ve data) .
✓5505 > 255. so, we cannot use unsigned char.
✓So, in this case, we can safely use the unsigned short int data type
like below.
unsigned short sunTemperature = 5005;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Write a C program to calculate and print distance from A to C

A B C

160 Km 40 Km

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

1. Create the variables to hold these data


2. Compute the sum of the data
3. Store the result
4. Print the result as shown in the format
A B C

160 Km 40 Km

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

A B C

160 Km 40 Km

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Format specifier

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Range Calculation
Let us calculate the range of char data type.

✓We know that variable of the char data type consumes 1


byte of memory.

✓Also, the char data type will be used to store 1 byte of


signed data.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
1 byte signed data representation

The most significant


bit is used to 7 bits are used to store magnitude
represent the sign of
the data
7 6 5 4 3 2 1 0
0→ data is +ve
1→data is -ve

Magnitude is stored in 2’s complement format if data is negative.


Signed data means a dedicated 1 bit is used to encode a sign of the data.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Example
Represent the data -25 in 1 byte signed data representation
data

sign - 25 Magnitude
Magnitude will be stored in 2’s
complement form if data is negative
1 bit for sign 7 bits for magnitude
7 6 5 4 3 2 1 0
1 1 1 0 0 1 1 1 = 0XE7
hex value of decimal -25
So, in signed data context 0xE7 is -25
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Example
Represent the data 25 in 1 byte signed data representation
data

sign 25 Magnitude

+ve

7 6 5 4 3 2 1 0
0 0 0 1 1 0 0 1 = 0x19
(hex value of decimal 25)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
char data type range
When sign is +ve
Magnitude : 0
7 6 5 4 3 2 1 0
Least value 0 0 0 0 0 0 0 0

Magnitude : 127
7 6 5 4 3 2 1 0
Highest value
0 1 1 1 1 1 1 1

So, range is 0 to 127 for +ve data

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
char data type range
When sign is -ve
Magnitude : -128
7 6 5 4 3 2 1 0
Least value 1 0 0 0 0 0 0 0

Magnitude : -1
7 6 5 4 3 2 1 0
Highest value
1 1 1 1 1 1 1 1

So, range is -128 to -1 for -ve values

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

unsigned char range


• The unsigned char data type is used to store 1
byte of unsigned data.
• In unsigned data representation no particular
bit is dedicatedly used to encode the sign.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
1 byte unsigned data representation
8 bits are used to store magnitude

7 6 5 4 3 2 1 0

Least value Highest value


0 255

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Integer data type : short int and unsigned short int
✓Variable of type short int is used to store 2 bytes of signed data.

✓Variable of type unsigned short int is used to store 2 bytes of


unsigned data.

✓You can just mention short (for signed ) or unsigned short . “int” will
be assumed.

✓short type variable always consumes 2 bytes of memory irrespective


of compilers.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Range calculation of short int

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Represent the data -25 in 2 byte signed data representation

data Magnitude will be stored in 2’s complement form


If data is negative

sign - 25 Magnitude

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1
Binary representation of 25 using 2 bytes

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0
1s complement format of 25

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0
1’s complement format of 25
+ 1

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1
Sign bit 2’s complement format representation of -25 using 2 bytes

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Represent the data -25 in 2 byte signed data representation


data

sign - 25
1 bit for sign 15 bits for magnitude
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1
0xFFE7

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Represent the data 25 in 2 byte signed data representation


data

sign 25
1 bit for sign 15 bit for magnitude
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1
0x0019

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Range calculation of short int


• short range : -32,768 to 32,767
• unsigned short range : 0 to 65535

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
2 byte unsigned data representation
16 bits are used to store magnitude

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Least value Highest value


0 65535
(0xFFFF)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Integer data type : int and unsigned int
✓ int is an integer data type to store signed integer data
✓An int type variable consumes 2 bytes of memory or 4 bytes of
memory.
✓Size of an int is decided by the compiler being used to generate
code for your target hardware. i.e. you need to consult the compiler
user manual to understand the size of an int. It is typically 2 or 4
bytes.
✓unsigned int is an integer data type to store unsigned integer data.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Integer data type : long and unsigned long
✓ long is an integer data type to store signed integer data
✓A long type variable consumes 4 bytes of memory or 8 bytes of
memory.
✓Size of long data type is decided by the compiler being used to
generate code for your target hardware. i.e. you need to consult the
compiler user manual to understand the size of long. It is typically 4
or 8 bytes.
✓unsigned long is a integer data type to store unsigned integer data.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

sizeof operator
• sizeof operator of C programming language is
used to find out the size of a variable.
• The output of the sizeof operator may be
different on different machines because it is
compiler dependent.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Variables

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
What are variables ?
• Variables are identifiers for your data.
• Data are usually stored in computer
memory.
• So, a variable acts as a label to a
memory location where the data is
stored
• Variable names are not stored inside
the computer memory, and the
compiler replaces them with memory
location addresses during data
manipulation.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

0 1 1 0 0 1 1 1
1 1 0 0 0 1 0 0
0 1 1 0 0 1 1 1
Different
1 1 1 1 0 1 1 1 memory
1 1 1 0 0 1 1 0 locations
of the
0 1 1 0 0 1 1 0 computer
0 1 1 1 0 1 1 1 memory
0 1 1 1 0 1 1 1

Value stored in a memory location 0x0803


Memory location addresses
(pointers) BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Memory location address A Memory location


of computer
memory
7 6 5 4 3 2 1 0

0x0800 0 0 0 1 0 1 0 0

valueA
Data stored in the memory
location

Name assigned to the memory


location address to retrieve the
data stored.
Variable name just exists for programming convenience and doesn't exist post-
compilation, only its associated memory location address does.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Defining Variables
✓Before you use a variable, you have to define it.

✓Variable definition (sometimes also called a


variable declaration) is nothing more than letting the
compiler know you will need some memory space
for your program data so it can reserve some.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Defining Variables
✓To define a variable, you only need to state its type,
followed by a variable name.
✓e.g., If the data type of the variable is char, then
compiler reserves 1 byte. If the data type is int then
compiler reserves 4 bytes .

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Syntax : Defining Variables


‘C’ Syntax of variable definition :
<data type> <variable_name> ;

Example :
char myExamScore; //This is called variable definition

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Variable initialization
char myExamScore ; //Variable definition
myExamScore = 25; //This is called variable initialization
Observe that variable initialization is followed by
first defining the variable .

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

This is illegal
myExamScore = 25; //variable initialization
char myExamScore ; //Variable definition

When the compiler compiles these statements, it sees


that “myExamScore “ which is not defined before getting
assigned by a value. So, the compiler throws an error
here.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

This is legal

• Variable definition and initialization can be


done in one single statement. The below
statement is legal from the compiler point of
view.
char myExamScore = 25;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Rules for naming a variable

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Rules for naming a variable


• Make sure that the variable name is not more than 30
characters. Some compilers may issue errors.
• A variable name can only contain alphabets(both
uppercase and lowercase), digits and underscore.
• The first letter of the variable cannot be a digit. It
should be either an alphabet or underscore
• You cannot use ‘C’ standard reserved keywords as
variable names.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

C99 reserved keywords

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Variable definition vs. declaration


• A variable is defined when the compiler generates
instructions to allocate the storage for the variable.
• A variable is declared when the compiler is informed
that a variable exists along with its type. The compiler
does not generate instructions to allocate the storage
for the variable at that point.
• A variable definition is also a declaration, but not all
variable declarations are definitions.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Variable scopes
• Variables have scopes
• A Variable scope refers to the accessibility of a
variable in a given program or function
• For example, a variable may only be available
within a specific function, or it may be
available to the entire C program
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Variable scopes
• Local scope variables (local variables )
• Global scope variables ( global variables )

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Always remember that when the execution


control goes out of the scope of a local
variable, the local variable dies that means a
variable loses its existence

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Summary global variables


Scope − Global variables are visible to all the functions of a program.
They are everywhere. Even you can access global variables from
another file of the project.

Default value − All uninitialized global variables will have 0 as


default value.

Lifetime − Till the end of the execution of the program.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Summary local variables


Scope − Within the body of the function. Local variables lose
existence once the execution control comes out of the function
body.

Default value − unpredictable (garbage value).

Lifetime − Till the end of the execution of a function in which a


variable is defined.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Storage classes in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The Storage Classes in ‘C’ Language decides:


✓Scope of a variable
✓Visibility of a variable or function
✓Life time of a variable.

Scope, visibility, and lifetime are features of a variable . These


features can be modified by using storage class specifiers.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Storage class specifiers in ‘C’

There are two widely used storage class specifiers in ‘C’


✓static
✓extern

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Now, our requirement for this program is, we want a


global variable that is private to a function. We want a
private variable that does not lose its existence even if
the execution control goes out of the scope of that
variable.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
static

Here this variable is treated


as a global variable but
private to fun1, and it never
dies even if fun1 returns

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

A ‘C’ project

file1.c file2.c file3.c

A ‘C’ project can be a collection of multiple source files, and a


‘static’ storage class specifier can be used to manage the visibility
of the variables across various files effectively.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Extern
'extern' storage class specifier is used to access the
global variable , which is defined outside the scope of a
file.

'extern' storage class specifier can also be used during


the function call, when the function is defined outside
the scope of the file.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Extern
The keyword ‘extern’ is relevant only when your
project consists of multiple files, and you need to
access a variable defined in one file from another file.

'extern' keyword is used to extend the visibility of a


function or variable.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Address of a variable

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

ASCII codes
• The American National Standards Institute
(ANSI), which developed ANSI C, also
developed the ASCII codes.
• ASCII stands for “American Standard Code for
Information Interchange’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

ASCII codes
• By using ASCII standard, you can encode 128
different characters.
• That's why to encode any ASCII character you
just need 7 bits. (you can use char data type )

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

A A p p p p l l e e : )
For the machine everything is number.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

65 112 112 108 101 58 41

A p p l e : )
For the machine everything is number.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Address of a variable

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Write a program to print the address of variables.


int myData;
ampersand

&myData → gives you memory location


address of myData variable .

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Memory location address.
Address size is 8 bytes(64 bit
machine )
A Memory location
of computer
memory
7 6 5 4 3 2 1 0

0x00007FFF8E3C3821 0 1 0 0 0 0 0 1
(a pointer)

a1 Data stored in the memory


location ( ASCII code of ‘A’)

Variable name

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

This is a pointer data.


This represent a variable.
Pointer data are
Variables are represented by
represented by pointer data
variable data type
type in ‘C’

TYPE : unsigned long int TYPE : char *

unsigned long int addressOfa1 = &a1;


We are trying to assign a pointer type data into a variable.
Hence there is a data type mismatch warning.
This is not just a
To solve this issue, convert pointer data type into variable number.
data type using typecasting. This is a pointer
(more on this later)
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Type casting

unsigned long int addressOfa1 = (unsigned long int) &a1;

Now, this is a number of type unsigned long int.


Not a pointer

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

scanf

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

scanf
• scanf is a standard library function that allows
you to read input from standard in.
• Standard in for us is generally the keyboard
• By using scanf library function you can read
both characters and numbers from the
keyboard.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

int age ;
printf(“Enter your age : “);
scanf(“%d”, &age);

scanf reads an integer(a number) scanf puts that read value


which the user enters “At the address of” ‘age’ variable

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

int c;
printf(“Enter a character: “);
scanf(“%c”, &c);

scanf reads a character scanf puts that read value


which the user enters “At the address of” ‘c’ variable

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

getchar()
• If you just want to read a single character from
the keyboard in ASCII format then just use
getchar().
• getchar() function takes no argument and just
returns an int value which happens to be the
ASCII value of the key pressed
• int a = getchar(); // Here the program hangs until you press a key
followed by pressing the enter key.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

printf
output buffer

Abcd\r\nmn\r

To be written to display (stdout)


Display

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Keyboard

Input buffer

Program
scanf
getchar()

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Enter (\n) New line
10
Keyboard

Input buffer

Program

scanf(“%f”,&n1);

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Keyboard
Input buffer

10\n

Program
read by the scanf
scanf(“%f”,&n1);

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Keyboard
Input buffer

\n
Unread data
Program

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Keyboard
Input buffer

\n

Program
scanf(“%f”,&n2);
Read and discarded by the scanf
because its not a valid number
but a special character . Scanf waits
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Keyboard
Input buffer

45\n

Program
Read by scanf scanf(“%f”,&n2);

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Keyboard
Input buffer

65\n

Program
Read by scanf scanf(“%f”,&n3);

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Keyboard
Input buffer

\n
Unread data
Program

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Keyboard
Input buffer

\n

Program

getchar() fetches \r
and returns.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise

Write a program which takes 3 numbers from the user ,


computes and prints the average of those numbers.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise

Write a program which takes 6 characters (alphabets, numbers


and special characters) from the user and prints the ASCII
codes of the entered characters.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Functions in ‘C’
• In ‘C’, you write executable statements inside a function .
• A ‘C.’ function is nothing but a collection of statements to perform a specific
task.
• Every C program, at least, has one function called “main.”
• Using functions bring modularity to your code, easy to debug, modify and
increases the maintainability of the code
• Using C function also minimizes code size and reducing code redundancy
• Functions provide abstraction. For example, printf is a function given by a
standard library code. You need not worry about how it is implemented, and it
serves the purpose.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

• In your program, if you want to perform the


same set of tasks again and again, then create a
function to do that task and call it every time
you need to perform that task.
• This reduces code redundancy and brings
modularity to your program and also decreases
the final executable size of your program.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The general form of a function definition in C

return_data_type function_name( parameter list )


{
// body of the function
}

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
main function definition with no input arguments.
int main()
{
/* ... */
}

main function definition with 2 input arguments (Command line arguments ).


int main(int argc, char* argv[] )
{
We don’t use this definition of main for
/* ... */ embedded systems because most of the time,
} there are no command-line arguments in
embedded systems.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

'main' takes only zero or two arguments

main() is the special function in C from where execution of a


program starts and ends.

main() function returns the status of a program to the Parent


process, showing the success or failure of the program. 0
means SUCCESS. Non zero ERROR.

main() function suppose to return an int value to the calling


process as per the standard (C89 and above)
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Function prototype (declaration )


• In ‘C’ functions first have to be declared
before they are used.
• Prototype lets compiler to know about the
return data type, argument list and their data
type and order of arguments being passed to
the function .
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Write a program to do mathematical


operations such as addition, subtraction,
multiplication, and division of integers.

1)Do all the mathematical operations in separate functions in a file


called math.c

2)Call the functions from the main.c to test them.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Project

main.c math.h math.c

Written by someone else Share header file Written by you.


and uses functions of math.h to understand the
math.c function prototypes and
other details

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Type casting
Typecasting is a way of converting a variable or data
from one data type to another data type.

Data will be truncated when the higher data type is


converted in to lower

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

There are 2 types of casting


• Implicit casting (Compiler does this )
• Explicit casting ( Programmer does this )

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointers

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Width 8 bits

0x00007FFF8E3C3828 0 1 1 0 0 1 1 1
0x00007FFF8E3C3827 1 1 0 0 0 1 0 0
0x00007FFF8E3C3826 0 1 1 0 0 1 1 1 Different
memory
0x00007FFF8E3C3825 1 1 1 1 0 1 1 1 locations of
0x00007FFF8E3C3824 1 1 1 0 0 1 1 0 the computer
0x00007FFF8E3C3823 0 1 1 0 0 1 1 0 memory
0x00007FFF8E3C3822 0 1 1 1 0 1 1 1
0x00007FFF8E3C3821 0 1 1 1 0 1 1 1

Memory location addresses (pointers) Value stored in a memory location


0x00007FFF8E3C3824
On 64 bit machine , the pointer size ( memory location address size) is 8 bytes (64bit)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Now, let's see how to store a pointer inside the


program.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointer variable definition

<pointer data type > <Variable Name > ;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointer data types


char* unsigned char*
int* unsigned int*
long long int* unsigned long long int*
float* unsigned float*
double* unsigned double*

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointer variable definition and initialization

This is a pointer variable


of type char*

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointer variable definition and initialization

This is a pointer variable


of type char*

Compiler allocates 8 bytes for this variable to store this pointer.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Pointer stored in a pointer variable
0x1F007FFF8E3C4828 0x00
0x1F007FFF8E3C4827 0x00
0x1F007FFF8E3C4826 0x7F
0x1F007FFF8E3C4825 0xFF
0x1F007FFF8E3C4824 0x8E
0x1F007FFF8E3C4823 0x3C
0x1F007FFF8E3C4822 0x38
Address of the pointer
variable
0x1F007FFF8E3C4821 0x24
address1

7 6 5 4 3 2 1 0
0x00007FFF8E3C3824 0 1 0 0 0 0 0 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

0x00007FFF8E3C3824
0x1F007FFF8E3C4821
address1

An initialized pointer variable


0x85
0x00007FFF8E3C3824
A memory location address and value

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The compiler will always reserve 8 bytes for


the pointer variable irrespective of their
pointer data type.

In other words, the pointer data type


doesn’t control the memory size of the
pointer variable.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointer variable definition and initialization

Then, what is the purpose of mentioning “Pointer data type “?


?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointer variable definition and initialization

Then what is the purpose of mentioning “Pointer data type “?


?

The pointer data type decides the behavior of the operations carried
out on the pointer variable.
Operations : read, write, increment, decrement

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointer variable definition and initialization

Then what is the purpose of mentioning “Pointer data type “?


?

The pointer data type decides the behavior of the operations carried
out on the pointer variable.
Operations : read, write, increment, decrement

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Pointer variable to char type data

Pointer variable to int type data

Pointer variable to long long int type data


BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
Read operation on the pointer

Read data from the pointer


char data = *address1; //dereferencing a pointer to read data
1 byte of data is read from the pointer and stored in to “data” variable

* : “Value at Address” Operator


& : “ Address of” operator

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

0x00007FFF8E3C3824
0x1F007FFF8E3C4821
address1

An initialized pointer variable


0x85
0x00007FFF8E3C3824
char data = *address1;
(data = 0x85) A memory location address and value

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Write operation on the pointer

Write data to a pointer


*address1 = 0x89; //dereferencing a pointer to write data

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

0x00007FFF8E3C3824 Before
0x1F007FFF8E3C4821
address1 0x85
An initialized pointer variable 0x00007FFF8E3C3824
A memory location address and value

*address1 = 0x89;

0x00007FFF8E3C3824 After
0x1F007FFF8E3C4821
address1 0x89
An initialized pointer variable 0x00007FFF8E3C3824
A memory location address and value
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Exercise
1) Create a char type variable and initialize it to value 100
2) Print the address of the above variable.
3) Create a pointer variable and store the address of the above
variable
4) Perform read operation on the pointer variable to fetch 1
byte of data from the pointer
5) Print the data obtained from the read operation on the
pointer.
6) Perform write operation on the pointer to store the value 65
7) Print the value of the variable defined in step 1
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

100 1
000000000061FE46 (Address of variable “data” )
data

char* pAddress = &data;


(Address of the variable “data” is stored in the pointer variable “pAddress “) 2
i.e pAddress = 000000000061FE46 ;

value = *pAddress;
Dereferencing the address 000000000061FE46 to read the value stored
3
100 will be stored in the variable “value”

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

*pAddress = 65;
Dereferencing the address 000000000061FE46 to write the value 65
4
65 will be stored in the memory location addressed by 000000000061FE46

65
000000000061FE46 (Address of variable “data” )
data

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

char data = 100;


Here “data” is of type “char”
Therefore, “&data” will be of type “char* ”

int temp = 90;


Here “temp ” is of type “int”
Therefore, “&temp” will be of type “int* ”

long long distance= 9000000;


Here “distance” is of type “long long int”
Therefore, “& distance” will be of type “long long int * ”

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Effect of using different pointer data types


on pointer operations .

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
char *pAddress;

0xFF 0X0000000000403017

0xFE 0X0000000000403016

0xAB 0X0000000000403015

0xCD 0X0000000000403014

0x11 0X0000000000403013

0x11 0X0000000000403012

0x23 0X0000000000403011

0x 45 0X0000000000403010 pAddress
(&g_data)
g_data
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
char *pAddress; pAddress = pAddress +1;

0xFF 0X0000000000403017

0xFE 0X0000000000403016

0xAB 0X0000000000403015

0xCD 0X0000000000403014

0x11 0X0000000000403013

0x11 0X0000000000403012

0x23 0X0000000000403011 pAddress


0x 45 0X0000000000403010

g_data
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
char *pAddress; pAddress = pAddress +5;

0xFF 0X0000000000403017

0xFE 0X0000000000403016

0xAB 0X0000000000403015 pAddress


0xCD 0X0000000000403014

0x11 0X0000000000403013

0x11 0X0000000000403012

0x23 0X0000000000403011

0x 45 0X0000000000403010

g_data
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
int *pAddress;

0xFF 0X0000000000403017

0xFE 0X0000000000403016

0xAB 0X0000000000403015

0xCD 0X0000000000403014

0x11 0X0000000000403013

0x11 0X0000000000403012

0x23 0X0000000000403011

0x 45 0X0000000000403010 pAddress
g_data
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
Int *pAddress; pAddress = pAddress +1;

0xFF 0X0000000000403017

0xFE 0X0000000000403016

0xAB 0X0000000000403015

0xCD 0X0000000000403014 pAddress

0x11 0X0000000000403013

0x11 0X0000000000403012

0x23 0X0000000000403011

0x 45 0X0000000000403010

g_data
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
Int *pAddress;
pAddress+2 pAddress+3 pAddress+4 pAddress+5 pAddress+6
pAddress

0x0 0x4 0x8 0xC 0x10 0x14 0x18 0x1C 0x20


pAddress+1

4 Bytes offset

long long *pAddress;


pAddress+1 pAddress+2 pAddress+3 pAddress+4
pAddress

0x0 0x4 0x8 0xC 0x10 0x14 0x18 0x1C 0x20

8 Bytes offset

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

How is Pointer used in embedded programming?


• Store data into required SRAM locations.
• For copying data from Peripheral register to SRAM memory and
vice versa.
• To configure the peripheral registers. Because peripheral registers
are memory-mapped and each register will be given unique address
in the MCU memory map.
• Pointers to ISRs are stored in a vector table to handle the interrupts.
• Pointers are also used to configure the memory-mapped processor
specific registers like interrupt configuration registers.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Importance of <stdint.h>
ARMCC

Source : MPLAB compiler guide

The size of the data types depends upon the compiler.


BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Importance of <stdint.h>
Each architecture(x86, 8051, PIC, ARM,etc.) has a natural, most-efficient
size, and the designers, specifically compiler implementers use the
natural native data size for speed and code size efficiency.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Portability Issues in C

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Portability issues in “C” programming code due to


“size of data types”

✓In ‘C’ programming language the most commonly used data types “int” and
“long” cause portability issues.

✓The reason is that the storage size for ‘int’, ‘long’ type variable is not defined
within the C standard ( C90 or C99).

✓The compiler vendors have the choice to define the storage size for the
variable depending solely on hardware capabilities of the target platform, with
respect to the minimum widths defined by the standard.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

According to the compiler designer keeping


the size of the “int” type variable as 2 bytes
will be most efficient for data manipulation
considering the underlying architecture of
the PIC 8-bit microcontrollers

Why “int” is 2 bytes ?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Never use this

unsigned int count=0;


count++;
If( count > 65,536)
In{ order to get rid of portability issues due to data type size
mismatch across different compilers , you have to stop using
//Dodata
standard thistype
task
names,
instead
} use the data type alias names given by the header file
stdint.h

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

stdint.h
✓The standard library header file stdint.h defines fixed-
width integers using alias data types for the standard data
types available in ‘C’

✓A fixed-width integer data type is an aliased data type


that is based on the exact number of bits required to store
the data

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
stdint.h helps you to choose an exact size for your variable and makes
code portable no matter which compiler the code may be compiled
on.

stdint.h
aliased data
types

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
stdint.h helps you to choose an exact size for your variable and makes
code portable no matter which compiler the code may be compiled
on.
In order to get rid of portability issues due
to data type size mismatch , you have to
stop using standard data type names,
stdint.h instead use the data type alias names given
aliased data
types
by the header file stdint.h

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

uint32_t count=0;
count++;
Here, doesn’t matter under which
If( count > 65,536)
compiler this code compiles, the
{ compiler will always reserve 32bits for
//Do this task the variable by using suitable
standard data type.
}

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Some useful stdint.h aliases while programming

uintmax_t : defines the largest fixed-width unsigned integer


possible on the system

intmax_t : defines the largest fixed-width signed integer possible


on the system

uintptr_t : defines a unsigned integer type that is wide enough to


store the value of a pointer.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Operators in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Operators in ‘C’

An operator is a symbol
that tells the compiler to
perform a certain
mathematical or logical
manipulation on the
operands

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Arithmetic(Mathematical) operators
+ addition
- subtraction
* multiplication
/ division
% modulus
Modulus produces the remainder from division.
For example:
14 % 4 evaluates to 2.
14 divided by 4 yields a remainder of 2.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

uint32_t value ;
value = 20 or value = 14 ?
value = 2 + 3 * 4;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Operator Precedence
Operator precedence rules determine which
mathematical operation takes place first, i.e. takes
precedence over others. Parentheses, ( ), may be used
to force an expression to a higher precedence

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Don’t try to memorize


this table. Use () if you
want to promote the
precedence of an
operator of your choice
in an expression.

Image source
https://en.cppreference.com
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Examples

2 + 3 * 4 evaluates to 14 (multiplication first, addition second).


(2 + 3) * 4 evaluates to 20 (inside parentheses first, multiplication
second).
(2 * (4 + (6/2))) evaluates to 14 (inside parentheses first, work
outward).
4 * 5/2 * 5 evaluates to 50 (start left, move right).

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

* : higher precedence
+ : lower precedence

2 + 3 * 4
1

2 + 12
2

14

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
() : higher precedence
(2 + 3) * 4 * : lower precedence

1 (2 + 3) * 4

5 * 4
2

20

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

4 * 5/2 * 5

2 or 50 ??

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

4 * 5 / 2 * 5 * and / have the same precedence.


Associativity: Left to Right

20 / 2 * 5
Associativity is used to
2 evaluate the expression
when there are two or more
operators of the same
10 * 5 precedence is present in an
expression.
3
50

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Don’t try to memorize


this table. Use () if you
want to promote the
precedence of an
operator of your choice
in an expression.

Image courtesy
https://en.cppreference.com
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
12 + 3 - 4 / 2 < 3 + 1
12 + 3 - 4 / 2 < 3 + 1

12 + 3 - 2 < 3 + 1

15 - 2 < 3 + 1

13 < 3 + 1

13 < 4

0
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

All arithmetical operators are binary operators. i.e.,


they need at least two operands to operate.

+ addition
- subtraction
* multiplication
/ division
% modulus

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Unary operator in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Operand

x++ x--
Unary increment operator Unary decrement operator

Unary operators : ++, --

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

++ is a unary operator and it can appear on either side of an expression

The ++ (increment) operator


uint32_t x; adds 1 to the value of the
operand and updates the
x++; //x is incremented by 1 operand
++x; //x is incremented by 1

Note : when the operand is pointer variable the behavior will be different and
we will discuss later

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

++ is a unary operator and it can appear on either side of an expression

uint32_t x,y; uint32_t n,m;


x = 5; n = 5;
y = ++x; m = n++;

y=6 , x = 6 m=5, x = 6

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

++ is a unary operator and it can appear on either side of an expression

uint32_t x,y; uint32_t n,m;


x = 5; n = 5;
y = ++x; m = n++;
Pre-incrementing Post-incrementing
y=6 , x = 6 m=5, x = 6
First, value of x will be incremented by 1 First value of x will assigned to m
Then value of x will be assigned to y Then value of x will be incremented by 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

-- is a unary operator and it can appear on either side of an expression

uint32_t x,y; uint32_t n,m;


x = 5; n = 5;
y = --x; m = n--;
Pre-decrementing Post-decrementing
y=4 , x = 4 m=5, n = 4

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Unary operators with pointer variables


uint32_t *pAddress = (uint32_t*) 0xFFFF0000;

pAddress = pAddress +1 ; //this is arithmetic add operation


(result : pAddress = 0xFFFF0004)

pAddress++; //This is unary increment operation


(pAddress = 0xFFFF0004)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Relational Operators in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Relational Operators in ‘C’


✓ Relational operators do some kind of evaluation on the
operands and then return value 1 (for true) or 0 (for false).

✓ Relational operators are binary operators because they require


two operands to operate.

✓ The relational operators are evaluated left to right.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Relational Operators available in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

True and False in ‘C’


✓ In ‘C’ Zero is interpreted as false and anything non-zero
is interpreted as true.

✓ Expressions using relational operators evaluate to a value


of either TRUE (1) or FALSE (0).

✓ Relational expressions are often used within if and while


statements.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
Examples
A = 10, B=20

C= (A == B ); If A and B are the same value, then this expression evaluates to be


TRUE(1) otherwise FALSE(0). So, here 0 will be stored in C;

C= (A <= B ); If A is smaller than or equal to B, then this expression evaluates to be


TRUE(1) otherwise FALSE(0). So, here 1 will be stored in C;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Examples
A = 10, B=20

C= (A != B ); What happens here ?

C= (A < B ); What happens here ?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Examples
A = 10, B=20

C= (A != B ); What happens here ? C= 1

C= (A < B ); What happens here ? C= 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Logical Operators in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Logical Operators in ‘C’


• The logical operators perform logical-AND (&&) ,logical-
OR (||) and logical –NOT (!) operations.
• These are binary operators except NOT (!).

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

logical AND Operator : &&

✓The logical-AND operator produces the value 1 if both operands


have nonzero values .

✓If either operand is equal to 0, the result is 0. If the first operand


of a logical-AND operation is equal to 0, the second operand is not
evaluated.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

logical AND Operator : &&

A = -10, B=20;

C= (A && B ); // true && true

C = 1 //true

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Truth table

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Image courtesy
https://en.cppreference.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

logical OR Operator : ||
✓ The logical-OR operator performs an inclusive-OR
operation on its operands.
✓ The result is 0 if both operands have 0 values.
✓ If either operand has a nonzero value, the result is 1.
✓ If the first operand of a logical-OR operation has a
nonzero value, the second operand is not evaluated.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

logical NOT Operator : !


✓ It reverses the state of the operand.
✓ If a condition or expression is true, then Logical NOT
operator will make it false

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

logical NOT Operator : !


x = 10; // state of the x is true

/*state of the x is reversed and stored back in x */


x = !x; // NOT of x ( NOT of true = false)

Result : x = 0;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

logical NOT Operator : !


What is the value of A in the below expression ?
x =7,y=9

A = ! ((x>5) && (y<5));

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Bitwise Operators in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Operator Type

++, -- Increment and decrement


operator (Unary operator )
+,-,*,/,% Arithmetic operators
<,<=,>,>=,==,!= Relational operators
&&, || , ! Logical Operators
&, | , << , >>, ~, ^ Bitwise operators
=, +=, -=,*=,/=, %= Assignment operators
?: Conditional operators

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Bitwise Operators in ‘C’


& (bitwise AND) >> (bitwise Right Shift)

Unary

| (bitwise OR) ~ (bitwise NOT) (Negation)

<< (bitwise Left Shift) ^ (bitwise XOR)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Difference between Logical operator and bitwise
operator
• && is a ‘logical AND’ operator
• & is a ‘bitwise AND’ operator
char A = 40;
C = A && B; ? C = A & B; ?
char B = 30;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

char A = 40; char B = 30; char C;


C = A && B; C = A & B;
(Logical) (Bitwise)

C=1; A
&
00101000
b Bitwise
operation
B b00011110

C= b00001000

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

char A = 40; char B = 30; char C;

C = A || B; C = A | B;
C=1;
A
|
00101000
b Bitwise
operation
B b00011110

C= b00111110

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

char A = 40; char B = 30; char C;

C = ! A; C = ~A;
C=0;
Bitwise
00101000
A b operation

C= ~A b11010111
C= -41

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

char A = 40; char B = 30; char C;

C = A ^ B;

A 00101000
b Bitwise
^ operation
B b00011110

C= b00110110
C=54
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Applicability of bitwise operations


In an Embedded C program, most of the time
you will be doing,
✓Testing of bits ( &)
✓Setting of bits (|)
✓Clearing of bits (~ and &)
✓Toggling of bits (^)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Write a program which takes 2 integers from
the user , computes bitwise &,|,^ and ~ and
prints the result.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Applicability of bitwise operations


In an Embedded C program, most of the time
you will be doing,
✓Testing of bits ( &)
✓Setting of bits (|)
✓Clearing of bits (~ and &)
✓Toggling of bits (^)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise: Testing of bits


• Write a program to find out whether a user
entered integer is even or odd.
• Print an appropriate message on the console.
• Use testing of bits logic

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

46 (0x2E) 47 (0x2F)
lsb lsb
b00101110 b00101111
Number is EVEN
Number is ODD

Test the least significant bit of the number using bitwise operation
If the lsb is zero, then number is EVEN
If the lsb is one, then number is ODD

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Bit-Masking Data is masked with zeros to make all
bits of the data in this area zero at the
output
[input] number
&
b00101110 (46)

b00000001
[mask] Mask_value (1)

[output] b00000000 Data is Masked with 1 to


test lsb of data

Bit Masking is a technique in programming used to test or modify the states of the bits of a given data.

Modify : if the state of the bit is zero, make it one or if the state of the bit is 1 then make it 0
Test : check whether the required bit position of a data is 0 or 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
7 6 5 4 3 2 1 0
[data] 00101110 [data] 10101110
& &
[Mask] 00000010 [Mask] 10000000
[output] 00000010 [output] 10000000

[data] 00101110 [data] 00101110


& &
[Mask] 00000011 [Mask] 00010000
[output] 00000010 [output] 00000000

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

EVEN or ODD using Bitwise operation

Mask value
If ( number & 1)
{
print(number odd)
}else
{
print(Number even)
}

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise: Setting of bits


• Write a program to set(make bit state to 1) 4th
and 7th-bit position of a given number and
print the result.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise: Setting of bits


Un-affected data portion
7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
[data] b00111110 [data] b00111110
& |
b10010000
b10010000
[Mask] [Mask]

b00010000
b10111110
[output] [output]

‘&’ is used to ‘TEST’ not to ‘SET’ ‘|’ is used to ‘SET’ not to ‘TEST’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise: Clearing of bits


• Write a program to clear(make bit state to 0)
4th, 5th, 6th, bit positions of a given number
and print the result.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise: Clearing of bits


Which bit wise operation do you use to clear the
given bit position of the data ?
& or | ?
‘&’ is used to ‘TEST and CLEAR’ not to ‘SET’
‘|’ is used to ‘SET’ not to ‘TEST’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise: Clearing of bits


Un-affected data portion

7 6 5 4 3 2 1 0
[data]
b10111110
&
[Mask] b10001111
[output] b10001110
Only this portion is cleared out
‘&’ is used to ‘TEST and CLEAR’ not to ‘SET’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise: Clearing of bits


Method-II
Method-I Un-affected data portion Un-affected data portion

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
[data]
b10111110 [data] 10111110
b
& &
[Mask] b10001111 [Mask] ~(01110000)
b

[output] b10001110 [output] b10001110


Only this portion is cleared out Only this portion is cleared out

Negate (Bitwise NOT) the mask value first


and then perform bitwise AND (&)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Toggling of bits
[Led_state] 00000001 Led_state = Led_state ^ 0x01
^
[mask] 00000001
[Led_state] 00000000
^ Output toggles
[mask] 00000001
[Led_state] 00000001
^
[mask] 00000001
[Led_state] 00000000
^
[mask]
00000001
[Led_state] 00000001

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Applicability of bitwise operations in


Embedded Systems

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Write a program to turn on the LED of your
target board
• For this exercise we need the knowledge of
– Pointers
– Bitwise operations
– Hardware connections

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Hardware connections
• Lets understand how external hardware (LED)
is connected to MCU
– Refer schematic of the board you are using

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

In STM32Fx based
PORT-A PORT-E
MCUs , each port has
16 pins where you can
connect external
peripherals .
(LED, Display , button,
PORT-B PORTD Bluetooth transceiver ,
external memory (e.g.
EEPROM), Joy stick ,
keypad ,etc )

PORT-C

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
How do you access 12th pin of GPIO PORT-D peripheral from software ?

GPIO Port D
Peripheral’s
pins

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Now your goal is to control the I/O pin PD12’s state


either HIGH or LOW through software to make LED
turn ON or OFF.

PD12 : 12th pin of the GPIO PORT D peripheral

*GPIO: General Purpose Input Output


BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

It also has set of registers which are used to


control pin’s mode, state and other functionalities

GPIO D
peripheral

MICROCONTROLLER

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
You can access the registers of this peripheral
using memory addresses , hence you can also say
that this peripheral registers are memory
mapped.

GPIO D
peripheral
And its registers

MICROCONTROLLER

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Memory mapped I/O


• IO pins are controlled using peripheral
registers which are mapped on to processor
addressable memory locations
• What are processor addressable memory
locations ?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

What are processor addressable memory


locations ?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Memory Map of the processor


• Memory map explains mapping of different
peripheral registers in the processor
addressable memory location range
• Processor addressable memory location range
depends upon size of the address bus.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

ARM
Data Code
Cortex M4
memory memory
CPU
32 bit address channel
32 bit data channel

System bus(AHB)

GPIOD TIMERS ADC I2C

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
GPIO PORT-D 0
Peripheral
1
2

3
4

12

15
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Processor addressable memory locations ?

Since address bus width is 32 bits,


Processor put address ranging from 0x0000_0000 to 0xFFFF_FFFF on the address bus.

So, that means 4G(4,29,49,67,296 )different addresses can be put on address bus

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Memory map of ARM Cortex Mx processor

Program memory, data memory,


registers of various peripherals are
organized within the same linear
4 G byte of address space.

This is a generic memory map which


must be followed by all MCUs which
use ARM cortex Mx processor

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

PC
0x4000_0000
0x4000_0000 Address Bus

16 bits

Here Processor wants to talk to a peripheral register which is mapped at the address
0x4000_0000.
Processor either wants to read from the register or write in to the register.

Which register of which peripheral ?


That depends on your microcontroller design.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Memory map of STM32 MCU


Memory map of the microcontroller you can refer from the
datasheet or reference manual of the microcontroller

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The registers used to control and configure the Ethernet MAC peripheral and
registers used to read data from and write data into Ethernet MAC peripheral are
mapped in the address range of 0x4002_8000 to 0x40002_93FF.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

What is the address range of GPIOD


peripheral registers?

*if you are using different MCU , then please refer to your device reference manual to obtain
the correct address range

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

About peripheral registers


• All peripheral registers in STM32 microcontroller are
of 32 bits wide
• Different peripherals have different number of
peripheral registers.
• You should never assume about the address of the
peripheral registers. Always you should refer to the
device reference manual .
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

GPIOD Peripheral registers


1. GPIOD port mode register
2. GPIOD port output type register
3. GPIOD port output speed register
4. GPIOD port pull-up/pull-down register
5. GPIOD port input data register
6. GPIOD port output data register
7. GPIOD port bit set/reset register
8. GPIOD port configuration lock register
9. GPIOD alternate function low register
10. GPIOD alternate function high register

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

MICROCONTROLLER

GPIOD
peripheral
And its registers

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com 8 bits width

0x4002_0C03 Most significant byte

0x4002_0C02
32 bit register

0x4002_0C01

0x4002_0C00 Least significant byte

GPIOD port MODE register

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com 8 bits width

0x4002_0C07 Most significant byte

0x4002_0C06
32 bit register

0x4002_0C05

0x4002_0C04 Least significant byte

GPIOD port OUTPUT TYPE register

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
0x4002_0C24 31 GPIOD alternate function high register 0

31st bit 0th bit

0x4002_0C0C 31 GPIOD port pull-up/pull-down register 0

0x4002_0C08 31 GPIOD port output speed register 0

0x4002_0C04 31 GPIOD port output type register 0

0x4002_0C00 31 GPIOD port mode register 0

32 bits width
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

MICROCONTROLLER

GPIOD Output data register


31 15 1 0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Procedure to turn on the LED


To write a code to turn on the LED is not that
easy. That’s what makes the embedded system
programming so unique that you must know
memory map, peripheral registers, peripheral
register addresses, hardware connections, etc.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Procedure to turn on the LED


1) Identify the GPIO port(a peripheral) used to
connect the LED
GPIOD
2) Identify the GPIO pin where the LED is
connected
12
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
Procedure to turn on the LED
3) Activate the GPIOD peripheral ( Enable the clock )
• Until you enable the clock for a peripheral, the peripheral is
dead and it neither functions nor it takes any configuration
values set by you.
• Once you active the clock for a peripheral, the peripheral is
ready to take your configuration and control-related commands
or arguments (configuration values)
• Note: For some microcontrollers, the peripheral may be ON by
default, and you need not do any activation. ( you should
explore by the device datasheet for reference manual)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Procedure to turn on the LED
4) Configure the GPIO pin mode as output
Since you are driving an LED (to ON or OFF), the operation
mode of the GPIO pin has to be configured as OUTPUT.

5) Write to the GPIO pin


1 (HIGH) to make the GPIO pin state HIGH(3.3V)
0 (LOW) to make the GPIO pin state LOW(0V)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Procedure to turn on the LED : Summary
1) Identify the GPIO port(a peripheral) used to connect
the LED
2) Identify the GPIO pin where the LED is connected
3) Activate the GPIOD peripheral ( Enable the clock )
4) Configure the GPIO pin mode as output
5) Write to the GPIO pin

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

How to Enable the peripheral clock ?


1. Through peripheral clock control registers of the
microcontroller
2. In STM32 MCU, all clock control registers are
mapped at the below address range in the memory
map of the Microcontroller.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Microcontroller

ARM S-Bus
Cortex M4
CPU
memory

32 bit address channel


32 bit data channel

GPIOD
AHB Bus
GPIOC
Data exchange between
GPIOB peripheral and memory
happens over the bus
GPIOA

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Microcontroller

ARM S-Bus
Cortex M4
CPU

GPIOD
AHB1 Bus
GPIOC
Peripheral and memory
GPIOB
exchange data over this
GPIOA

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Bitwise Operators in ‘C’


& (bitwise AND) >> (bitwise Right Shift)

Unary

| (bitwise OR) ~ (bitwise NOT) (Negation)

<< (bitwise Left Shift) ^ (bitwise XOR)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Bitwise right shift operator(>>)


• This operator takes 2 operands
• Bits of the 1st operand will be right shifted by
the amount decided by the 2nd operand
• Syntax : operand1 << operand2
• Lets see an example

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

char a = 111
char b = a >> 4
b=?

a 0 1 1 0 1 1 1 1

Now, ‘a’ must be shifted by 4 times to the right

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

0
a 0 1 1 0 1 1 1 1 111 (0x6F)

0
a >> 1 0 0 1 1 0 1 1 1
0
a >> 2 0 0 0 1 1 0 1 1
0
a >> 3 0 0 0 0 1 1 0 1

a >> 4 0 0 0 0 0 1 1 0 6 (0X06)
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
0 0 0 0

a 0 1 1 0 1 1 1 1

a >> 4 0 0 0 0 0 1 1 0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

0 0 0

a 0 1 1 0 1 1 1 1

A >> 3 0 0 0 0 1 1 0 1

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Bitwise Operators in ‘C’


& (bitwise AND) >> (bitwise Right Shift)

Unary

| (bitwise OR) ~ (bitwise NOT) (Negation)

<< (bitwise Left Shift) ^ (bitwise XOR)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Bitwise left shift operator(<<)


• This operator takes 2 operands
• Bits of the 1st operand will be left shifted by
the amount decided by the 2nd operand
• Syntax : operand1 << operand2
• Lets see an example

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

a 0 1 1 0 1 1 1 1 0 111 (0x6F)

a << 1 1 1 0 1 1 1 1 0 0

a << 2 1 0 1 1 1 1 0 0 0

0 1 1 1 1 0 0 0 0
a << 3

a << 4 1 1 1 1 0 0 0 0 0 240 (0Xf0)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
<< vs >>
<< (left shift) >> (right shift)
4 << 0 => 4 128 >> 0 => 128
4 << 1 => 8 128 >> 1 => 64
4 << 2 => 16 128 >> 2 => 32
4 << 3 => 32 128 >> 3 => 16
4 << 4 => 64 128 >> 4 => 8
4 << 5 => 128 128 >> 5 => 4

A value will be multiplied by 2 for each left shift


A value will be divided by 2 for each right shift
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Applicability of bitwise shift operations


in embedded programming code

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Applicability
• Bitwise shift operators are very much helpful in
bit masking of data along with other bitwise
operators
• Predominantly used while setting or clearing of
bits
• Lets consider this problem statement :Set 4th bit
of the given data
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com 7 6 5 4 3 2 1 0

[Data] 0 0 0 0 1 0 0 0
Set 4th bit of the given data
[mask] 0 0 0 1 0 0 0 0
Data = 0x08
[output] 0 0 0 1 1 0 0 0
Data = Data | 0x10
= 0x18

Set 4th bit of the given data [1] 0 0 0 0 0 0 0 1


1 << 4
Data = 0x108
[mask] 0 0 0 1 0 0 0 0
Data = Data | (1 << 4)
= 0x18

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com 7 6 5 4 3 2 1 0

[Data] 0 0 0 1 1 0 0 0
Clear 4th bit of the given data
[mask] 1 1 1 0 1 1 1 1
Data = 0x18
[output] 0 0 0 0 1 0 0 0
Data = Data & 0xEF
= 0x10

Clear 4th bit of the given data [1] 0 0 0 0 0 0 0 1


1 << 4
Data = 0x18
[mask] 0 0 0 1 0 0 0 0
Data = Data & ~(1 << 4)
= 0x10

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Bit extraction
• Lets consider this problem statement

Extract bit positions from 9th to 14th [14:9] in a


given data and save it in to another variable .

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
[Data] 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0xB410

This portion needs to be extracted and saved in to another variable

1)Shift the identified portion to right hand side until it touches the least
significant bit ( 0th bit)
2)Mask the value to extract only 6 bits [5:0] and then save it in to
another variable

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
[Data] 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 Original data

1 2 3 4 5 6 7 8 9
>> 9

1) Shift the identified portion to right hand side until it touches the least
significant bit ( 0th bit)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
[Data] 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 After shifting

Not useful portion Useful portion

Mask Data to retain useful portion and zero out not


useful portion
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

2) Mask the new value to extract only first 6 bits[5:0] and then save it in to another
variable

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
[Data] 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 After shifting
&
[mask] 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 [0x003F]

[output] 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 After shifting


followed by masking

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

uint16_t Data = 0xB410;


uint8_t output ;

output = (uint8_t) ((Data >> 9) & 0x003F)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

• Solve this problem using combinations of


bitwise operators

Set bit positions [10:5] in a given data to 0x3E


Data = 0x4f63;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Set bit positions [10:5] in a given data to 0x3E


Data = 0x4f63;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision Making in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision Making in ‘C’

✓When you are going to write some program, it will always be


necessary that you will have to put some code which has to be
executed only when a specific condition is satisfied

✓Your program has to take decision based on internal/external


events or conditions.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision Making in ‘C’


✓For example, if the user presses a key, then execute 'this' set
of statements or if the user doesn't press any key, then execute
'that' set of statements.

✓In embedded programming, let's take an example of water


level indication and control program. If the sensor detects water
level rising above the threshold, then the program executes the
code to turn off the motor otherwise program doesn't turn off
the motor.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

YES Is water level


threshold
reached ?

NO

Turn off the motor Measure level

Decision making in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision taking statements in ‘C’


In ‘C’ there are 5 different ways to take decisions by making use of below decision
taking statements .

1. if Statement
2. if-else Statement
3. if-else-if ladder
4. Conditional Operators
5. Switch/case Statement

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision taking statements in ‘C’


In ‘C’ there are 5 different ways to take decisions by making use of below decision
taking statements .

1. if Statement
2. if-else Statement
3. if-else-if ladder
4. Conditional Operators
5. Switch/case Statement

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Syntax : if statement
Single statement execution Multiple statement execution

if(expression) if(expression) {
statement; statement_1;
statement_2;
statement_3;
If the expression evaluation is true statement_4;
(nonzero), then only statement(s) statement_n;
will be executed }

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
if statement flow chart

if(expression)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
This is called a “conditional statement(s).”
Because its execution depends upon evaluation
of an expression (myData > 40)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Beginner's mistake :
Observe that no ; here

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
In C , a semicolon ( ; ) by itself or an empty
block ( {} ) is an NOP

Equivalent to

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The relational operators (==, >, <, >=, <=, !=) and the logical operators (&&, ||, !)
are frequently used as the basis of conditions in if and if/else conditional
statements to direct program flow.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Write a program that takes the user’s age and
decides whether a user can cast a vote or not.
• The minimum age for casting a vote is 18
years
• Print appropriate messages

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision taking statements in ‘C’


In ‘C’ there are 5 different ways to take decisions by making use of below decision
taking statements .

1. if Statement
2. if-else Statement
3. if-else-if ladder
4. Conditional Operators
5. Switch/case Statement

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Syntax : if…else….statement
Single statement execution Multiple statement execution

if(expression) if (expression)
statement_1; {
else statement_1;
statement_2; statement_2;
}
else
{
statement_3;
statement_4;
}
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
If..else.. statement flow chart

if(expression)
‘If’ block statements

‘else’ block statements

One of these blocks will be executed


depending upon the expression
evaluation result.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Exercise
• Write a program which receives 2 numbers
(integers ) from the user and prints the biggest
of two .
• If n1 == n2, then print “both numbers are
equal”

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Return value of scanf


Here, scanf returns total number of inputs scanned successfully
scanf("%f",&num1);

In this above case scanf returns 1 , if the scan is successful.


If the scan is unsuccessful then scanf returns 0.

So, when you enter a character for the above code , the scanf fails and returns 0.
The scanf fails for the character input because it was expecting a number

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision taking statements in ‘C’


In ‘C’ there are 5 different ways to take decisions by making use of below decision
taking statements .

1. if Statement
2. if-else Statement
3. if-else-if ladder
4. Conditional Operators
5. Switch/case Statement

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Syntax : if..else.. ladder statement
if (expression1) First check this expression
{
// statement(s)
}
else if (expression2) Check this expression only if above expression
{ is false
// statement(s)
}
else if (expression3) Check this expression only if above expression is
{ false
// statement(s)
}
.
else
{ Execute these statements only if all the above
// statement(s) expression checks are false.
} BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com If..else if.. Ladder flow chart
True
if(expression1)

Statement(s)1
False
True
else if(expression2 )

Statement(s)2
False
True
else if(expression3 )
Statement(s)3
False
else Statement(s)4

Rest of the code


BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Exercise
• Write a program to calculate income tax
payable of the user . Tax is calculate as per
below table.
Total income % of tax
Up to $9,525 0 Tax payable = Income * (tax rate / 100)
$9,526 to $38,700 12%
$38,701 to $82,500 22%
> $82,500 32% + $1000
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

else if( (income > 9525) && ( income <= 38700 ) )


{
tax = income * 0.12;
}

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision taking statements in ‘C’


In ‘C’ there are 5 different ways to take decisions by making use of below decision
taking statements .

1. if Statement
2. if-else Statement
3. if-else-if ladder
4. Conditional Operators
5. Switch/case Statement

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Conditional Operators
• Conditional operator is a ternary operator in C
used for conditional evaluation.
• Operator symbol ?:
• It’s a ternary operator because it operates on
three operands.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Syntax of conditional operator

expression1 ? expression2 : expression3


(operand 1) (operand 2) (operand 3)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Syntax of conditional operator

expression1 ? expression2 : expression3


(operand 1) (operand 2) (operand 3)

uint32_t a = ( 5 + 4) ? (9 -4 ) : 99;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Syntax of conditional operator

expression1 ? expression2 : expression3


(operand 1) (operand 2) (operand 3)

uint32_t a = ( 5 + 4) ? (9 -4 ) : 99;
a = 5;
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
TRUE

expression1 ? expression2 : expression3


This will be the final result

FALSE

expression1 ? expression2 : expression3


This will be the final result

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Use case
• Sometimes you can use conditional operator
to replace if..else statements

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Using if….else

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Using Conditional operator

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Evaluate these expressions


int32_t a = 5;
a = 0?(a < 9) : a++;
a=?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Evaluate these expressions


int32_t a = 5, b = 10;
a = !(a+b) ? !(a < 9) : a ;
a=?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Decision taking statements in ‘C’


In ‘C’ there are 5 different ways to take decisions by making use of below decision
taking statements .

1. if Statement
2. if-else Statement
3. if-else-if ladder
4. Conditional Operators
5. Switch/case Statement

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Syntax of switch/case statement


• Switch/Case statement is one of the decision
making statement available in ‘C’
• It may be used instead of several if…else
statements.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Syntax of switch/case statement
switch(expression ) ‘C’ reserved
{ Keyword
case value :
Statement-1;
Statement-n;
break;
case value :
Statement-1;
Statement-n;
break;
case value :
Statement-1;
Statement-n;
break;
default:
Statement-1;
Statement-n;
}
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
Syntax of switch/case statement
switch(expression ) ‘C’ reserved
{ Keyword
case value :
Statement-1;
Statement-n;
break;
case value :
Statement-1;
Statement-n; Case label and it must be
break; an integer value
case value :
Statement-1;
Statement-n;
break;
default:
Statement-1;
Statement-n;
}
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Write a program to calculate the area of different geometrical
figures
– Circle , triangle , trapezoid , square and rectangle
• The program should ask the user to enter the code for which user
wants to find out the area
– ‘t’ for triangle
– ‘z’ trapezoid
– ‘c’ circle
– ‘s’ square
– ‘r’ rectangle

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Triangle Circle

Base Radius
Height

Trapezoid

Side
Base Square
Base
Height

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Length
Width

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Looping in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Without loop Program which prints numbers from 1 to 10 With loop

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Loops in ‘C’
• There are three types of loop statements in ‘C’
– while loop
– for loop
– do…while loop
while, for, do
(‘C’ reserved keywords)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Syntax : while loop


Loop body start

while(expression) /*Single statement while loop*/


{ /* multi statement while loop*/ while(expression)
statement1; statement1;
statement2;
statement3;
statementN; Repeat execution of code inside the loop
body until expression evaluates to false(0)
}
Loop body end

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Flowchart of while loop
1. expression is evaluated first
2. If expression evaluation is TRUE, then
Expression False statements inside the body of the loop will
evaluation be executed and execution loops back to
result ? check the expression again.
3. If expression evaluation is FASLE, loop body
True
breaks and the program continues with code
execute statement(s) outside the loop body

In while loop expression is always


Program continues with the
evaluated first
code outside loop body

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Example
• Write a program which prints from 1 to 10
using ‘while’ loop

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

while loop and ;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
while loop and semicolon
In C , a semicolon ( ; ) by itself or an empty
block ( {} ) is an NOP

Equivalent to

/*do nothing (NOP) */

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Example
• Write a program to print all even numbers between 0
to 100(including boundaries )
• Also count and print how many even numbers you
find.
– Use ‘while’ loop or ‘for’ loop or ‘do while’ loop
– Later change the program to accept boundary numbers
from the user

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Hangs forever

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

forever loop
A special form of the while loop is the forever loop. This is a loop that never ends. It is
common to see this in an embedded application in the main program. Unlike a PC
program, an embedded program may just run forever (or as long as it is powered up).

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Loops in ‘C’
• There are three types of loop statements in ‘C’
– while loop
– for loop
– do…while loop
While, for, do
(standard ‘C’ keywords)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Syntax : do..while loop
do
{
satement1
execute statement(s)
statement2
statement3
statementN True Expression
evaluation
}while(expression); result ?

False
Repeat execution of code inside the “do”
body until expression evaluates to false(0)
Program continues with the
code outside loop body

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
do while loop
1. Statements are executed first
2. Expression is evaluated
do 3. If expression evaluation result is true,
{ execution loops back and the statements
satement1 inside the “do” body executes again
4. If expression evaluation result is false, while
statement2 statement is terminated and program
statement3 continues with the statement next to while
statementN statement
5. Statements are executed at least once
}while(expression);
In do while loop, statement(s) is
executed first

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
for loop

for( Block-1 ; Block-2 ; Block-3 )


{
//Body of for loop

}
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
Flow chart of for loop
www.fastbitlab.com

for( Block-1 ; Block-2 ; Block-3 )


{
Execute block-1 //Body of for loop
}
Check result FALSE
of block-2?
TRUE Done
Execute body

Execute block-3

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Flow chart of for loop
www.fastbitlab.com

for( Block-1 ; Block-2 ; Block-3 )


{
i=0 Initialization (Block-1) //Body of for loop
}
i < 10 Expression FALSE
evaluation
(Block-2)

TRUE Done
Execute body

i++ Incrementation/decrementation
(block-3)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

for( ; ; )
{
for( ; ; )
{

}
}

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Track the height
using outer for
loop ( i < height)

Print the rows using inner for loop( j)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Modify the LED on program in to LED toggle
program by creating a software delay between
LED on and LED off
• LED should continuously toggle with certain
time delay forever.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Introducing delay in program


• Software delay
– Introduced using loop statements
• Hardware delay
– Introduced using hardware peripherals such as
timers

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Software time delay


• To introduce software delay, you should make the
processor busy in a software loop doing nothing
• This method is not an accurate method to obtain the
desired time delay
• The processor will keep wasting the execution cycles
until a certain delay is met

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Write a program which reads the status of the
pin PA0. If the status of PA0 is LOW then turn
off the on board LED(PD12) and if the status of
PA0 is HIGH then turn on the LED.
• Change the status of PA0 pin manually by
connecting between GND and VDD points of
the board.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Using printf outputs on ARM Cortex
M3/M4/M7 based MCUs
• This discussion is only applicable to MCUs
based on ARM Cortex M3/M4/M7 or higher
processors.
• printf works over SWO pin(Serial Wire Output)
of SWD interface

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Some hints
• PA0 should be in input mode
• To read from pin PA0, your code has to read
PORT-A input data register

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

ARM Cortex SWO pin To PC


M4 ST link V2
Processor
DEBUG
circuit USB
STM32F407VG MCU

STM32F4 DISC Board

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

ARM Cortex M4 Processor Instrumentation Trace Macrocell Unit

The ITM is an optional application-


driven trace source that supports printf
ITM unit style debugging to trace operating
system and application events, and
generates diagnostic system
information
Debug connector(SWD)
Serial Wire Debug (SWD) is a two-wire
SWD(Serial Wire Debug)
protocol for accessing the ARM debug
2 pin (debug) + 1 pin (Trace) interface

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
SWD
✓Serial Wire Debug (SWD) is a two-wire protocol for accessing the ARM debug interface

✓It is part of the ARM Debug Interface Specification v5 and is an alternative to JTAG

✓The physical layer of SWD consists of two lines


•SWDIO: a bidirectional data line
•SWCLK: a clock driven by the host

✓ By using SWD inteface should be able to program MCUs internal flash , you can access
memory regions , add breakpoints, stop/run CPU.

✓The other good thing about SWD is you can use the serial wire viewer for your printf
statements for debugging.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

SWD and JTAG


JTAG was the traditional mechanism for debug connections for ARM7/9 family,
but with the Cortex-M family, ARM introduced the Serial Wire Debug (SWD)
Interface. SWD is designed to reduce the pin count required for debug from
the 4 used by JTAG (excluding GND) down to 2. In addition, SWD interface
provides one more pin called SWO(Serial Wire Output) which is used for Single
Wire Viewing (SWV), which is a low cost tracing technology

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

ITM unit

FIFO

Debug connector(SWD)

SWO Pin
This SWO pin is connected to ST link circuitry
of the board and can be captured using our
debug software (IDE)
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Native compilation
Host Machine

Host native compiler This compiler runs on host machine


(mingw_64 or gcc)

Produces executable which also


.exe runs on the same machine

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Cross compilation
X86/x86_64 architecture ARM Architecture
Host Machine Target machine

Produces executable for different


architecture
Cross compiler
.elf / .bin /.hex
arm-none-eabi-gcc
This compiler runs on host machine

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

sizeof
• Find out storage sizes of the below data types
for your cross compiler
– char
– int
– long
– long long
– double
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Compiler settings of STM32CubeIDE

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Build process
• Preprocessing
• Parsing
• Producing object file(s)
• Linking object files(s)
• Producing final executable
• Post processing of final executable
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
Compilation stage of the build

preprocessor parser Code generator

Converts mnemonics to machine codes

Assembler

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com Linking stage of the build
Re-locatable
object files of Debug file
your source files

Linker objcopy tool

Pure binary executable file


Other libraries
(std and/or third party . Ex. libc )
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
Summary of build process

Preprocessing

compilation

linking

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Analyzing Embedded C Program

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Analyzing Embedded C Program


• Anatomy of the microcontroller
• Identifying code and data parts of the program
• Code memory and data memory of the MCU
• Disassembly feature of the IDE
• Analyzing the executable(.elf) using GNU tools
(like objdump and size)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

What is Microcontroller ?
• Microcontroller (MCU, μC) is a small computer system on a
single chip. But its resources and capabilities such as memory,
speed, external interfaces are very much limited than of a
desktop computer because of MCU targets embedded
applications.
• A typical microcontroller includes a processor, volatile and
non-volatile memories, input/output(I/O) pins, peripherals,
clock, bus interfaces on a single chip.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Processor Peripherals Memories Clock Bus

ADC DAC TIMERS UART USB

SRAM FLASH ROM EEPROM

A Microcontroller

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Anatomy of a Typical Small Microcontroller

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

MCU receiving data from Bluetooth and storing in data memory

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Inside view of the microcontroller

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Code memory
Code Memory Type : Flash

data memory
Data Memory Type :
SRAM (Static RAM)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Inside view of Typical modern microcontroller

Internal memories
CPU
(volatile and non
(ARM Cortex Mx)
volatile )
Voltage regulators
And other power
control ckts

Clock producing
Peripherals
ckts

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

PIC16F887

"Peripheral Interface
Controller" made by
Microchip Technology

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

A Microcontroller

DISPLAY

Microcontroller development board


BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Identifying code and data parts of the program

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Code and data memory of the MCU

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Code memory
• The purpose of the code(Program) memory is to store
instructions and constant data of your program.
• There are different types of code memory
– ROM (Read only Memory)
• MPROM (Mask Programmable Read only Memory)
• EPROM (Ultraviolet Erasable Programmable ROM)
• EEPROM (Electrically Erasable Programmable ROM)
– OTP (On time programmable)
– Flash
– FRAM(Ferroelectric Random Access memory )

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
MSP430FR2422

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

ROM
• Once code is stored inside the ROM, it cant be
modified . Only reading is allowed .
• Suitable during MCU production with prewritten
code targeting certain applications which will
never be modified.
• Usage of ROM technology reduces cost. Because
ROM is cheaper than Flash technology.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

We downloaded the executable into program


memory(FLASH) of the microcontroller. So, the data of
our program must be in FLASH memory.
How come data arrived in data memory (SRAM) ?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Disassembly feature of the IDE

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
So , we can use objdump tool to disassemble the machine code generated

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Analyzing the executable(.elf) using GNU tools

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Analyzing .elf using objdump gnu tool

Run this command on your PC command prompt


arm-none-eabi-objdump.exe -h 003Add.elf

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Processor Architecture and instruction set


• Processor : ARM Cortex Mx (0,3,4,7….)
• Processor architecture : ARMv7-M
• Instruction set architecture(ISA) : Thumb-2
instruction set(16/32 bits instruction
encoding)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

code
So, our main function
starts at address
0x080001e8 in the code
memory

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

code

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Total code memory occupancy : 1224


bytes = 1.2KB

Total size of the instructions


generated for our project : 792 bytes

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
data
What is the data of out project ?

This time we are going to again analyze the elf file of our project

Because at the end of the day, this file should contain all the code and data right ?

Again, run the command


arm-none-eabi-objdump.exe -h LED_Project.elf

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

we must be surprised
here to see , our project
already has 1076 bytes of
data

But can we locate those 1076


bytes of data in our project ?

It’s a kind of difficult task, lets


again use the command to analyze
further

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

data

These data will go to the data memory of your microcontroller

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Argument passing

Caller

Argument passing
(Call by value)

Callee

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Local scope variables

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Typical C project structure


A c project is typically collection of 1 or more source files along with collection of
optional header files.

Please note that header files are not compulsory for your project but most of the
time header files bring more structure to our project and it is always
recommended to use header files. Some times usage of header files become
compulsory when you access C standard library codes or functions from your
source file.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Typical C project structure


C project

Source files Header files

User defined header files


Third party Libraries
Standard library header files

Other 3rd part libraries

C Standard libraries

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Typical C project structure
C project
(LED_project)

Source files Header files


*Example.c User defined header files
led.c Third party Libraries
led.h
startup_stm32.s
Other 3rd part libraries stm32f407xx.h
C Standard libraries
Standard library header files

* This is considered as a main source file stdint.h


since it contains the main function of the
project from where the execution starts
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

The main function


Every C program is a collection of various functions, implementing different
functionalities.
But every C project will have at least one function whose name must be “main”
Main function is the starting point in your program execution *.

*Not really true , will discuss more on this later. But for a time being let's believe
that main is starting point of execution of our c project

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
The main function

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
The main function

Function body

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
The main function

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
From c99 standard about main

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Executables

Led_project.elf Led_project.bin

Lets analyze the elf executable generated to understand what are the codes and
data hidden in our project .

For that we are going to use the tool called objdump

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Led_Project.elf

code data

Now, fortunately there is one command which we can run to analyze the
elf files . To understand code section and data section

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Memory map

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Processor core
Register sets

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Manipulating decimal numbers in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Representation of decimal numbers
www.fastbitlab.com

in ‘C’
• A Decimal Number contains a Decimal Point.
•125.55 is a decimal number ( a real number)
• In computer memory, the real numbers are stored according to the
representation standardized by the IEEE standard 754
• IEEE754 floating-point representation is an approximate representation
of real numbers.
• All computer systems and microcontrollers nowadays use this standard
to store real numbers in memory
• If you are working with numbers that have a fractional part or in case
you are using integers that don't fit into a long data type, then we can
use floating-point representation.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Real numbers In ‘C’ too small or too big numbers or


numbers having a fractional part are
• Too small real number represented using floating-point
representation data types such as float
– Charge of an electron and double

– -1.60217662 × 10-19 coulombs

• Too big real number


– distance between earth and andromeda galaxy
– 2.3651826 x 1019 Kms

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Why do we need floating point
www.fastbitlab.com

representation?
• To store, a too-small number in memory
• To store, a too big number in memory
• To ofstore,
Think these situations
decimal number
1) Storing charge of an electron (too small)
2) Storing light years to kilometers conversion
3) Which data type do you use to store 1.767 x 10100 (too big)?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The IEEE-754 floating-point standard


• The IEEE-754 is a standard for representing and
manipulating floating-point quantities that are followed
by all modern computer systems and microcontrollers.

+7.432 x 1048

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The IEEE-754 floating-point standard

+7.432 x 1048
Exponent
sign Mantissa
(Significand)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The IEEE-754 floating-point standard


•1 Single8precision –>32 bits representation
23

Sign Exponent Significand

31 30 22 0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The IEEE-754 floating-point standard


•1 double11 precision –64 bits representation
52

Sign Exponent Significand

63 62 51 0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Integer part Decimal point fractional part

125.55
• You cannot represent this number in a program using integer data
types like int, char, long.
• You need particular data types to represent these decimal numbers
– Float (32-bit floating-point representation, single precision )
– Double (64-bit floating-point representation, double precision )

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Format specifier for float and double
www.fastbitlab.com

data types
• Use%lf format specifier to read or write double type variable
• Use %f format specifier to read or write float type variable
• Use %e %l format specifier to read or write real numbers in
e
scientific notation
• All constants with a decimal point are considered as double by
default

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Hardware floating point unit


• ARM Cortex processor provides inbuilt optional floating-point units
that can manipulate floating-point data which boosts the performance.
• Without a hardware floating unit, you need to use math libraries to
manipulate floating-point numbers stored in the memory which
consumes way too many clock cycles and reduces the performance for
embedded systems.
• So, if your application deals with too frequent access to floating-point
numbers then selecting a microcontroller that supports the hardware
floating-point unit may drastically improve the performance of your
application in terms of speed, memory and power consumption.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Find out the number of electrons responsible for
producing the given charge. Use scientific notation
while inputting and outputting the numbers.
Number of electrons = given charge / charge of Electron

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Range of float
Storage size : 4 bytes
Precision : up to 6 decimal places
Value range : 1.2x10-38 to 3.4x1038

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Range of double
Storage size : 8 bytes
Precision : up to 15 decimal places
Value range : 2.3x10-308 to 1.7x10308

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Type Qualifiers in ‘C’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Type Qualifiers in ‘C’


1. const
2. volatile
Applying these qualifiers to a variable declaration is
called qualifying the declaration

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

‘const’ type qualifier


• ‘const’ is a type qualifier in ‘C’ used to enforce
read-only feature on variables.
uint8_t data1 = 10; //here ‘data1’ is called a variable
data1 = 50; // OK. ‘data1’ value can be modified through out the program

uint8_t const data2 = 10; //here ‘data2’ is called constant variable


data2 = 50; //Compile-time- error ! ‘data2’ value can not be modified because it is read-only

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Type specifier of a variable


Read-only(constant) variable

uint8_t const data1 = 10;

Type qualifier
of a variable

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

const uint8_t data1 = 10;


Both statements are identical
uint8_t const data1 = 10;

uint8_t const data1 = 10; This is preferred

“data1” is a read-only(constant) variable of type unsigned integer_8

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

About “const”ness of a variable


• By using the ‘const’ keyword, you are just making a promise to
the compiler that you(the programmer) won't try to modify the
content of the variable using its name
• If you try to modify the variable by its name, the compiler stops
you by throwing an error. (compile-time error)
• You can still modify the content of the variable by using its
address

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

‘const’ doesn’t mean that the value never changes, its only programming safety
feature to ensure that the programmer shouldn’t try to modify the value.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

‘const’ doesn’t mean that the value never changes, its only
programming safety feature to ensure that the programmer shouldn’t
try to modify the value.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Placement of ‘const’ variables in
www.fastbitlab.com

memory
• All local const variables are just like non-const variables as far as
memory placement is concerned. They are placed in RAM. The
only specialty of a const variable is, it is read-only
• All Global const variables are stored in ROM or FLASH. This also
further depends on linker script rules and the hardware on
which code runs.
• In STM32 target hardware, all global const variables live in
FLASH memory. So, when you try to modify the const variable
using its address, operation has no effect. Because flash memory
of the microcontroller is write-protected.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Local ‘const’ vs global ‘const’ variables


Local ‘const’ variable Global ‘const’ variable

Stored in RAM with local scope stored in ROM or FLASH

Can be modified using variable Modifying variable value using its


address address has undefined behavior or
no effect

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Const pointer and different case


study

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Case1: constant data

uint8_t const data = 50;


//This is a case of const data

Use cases:
To define mathematical constants in the program
float const pi = 3.1415;
float const radius = 4;
int const number_of_months = 12;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Case2: Modifiable pointer and constant data

uint8_t const *pData = (uint8_t*) 0x40000000;


Read like this

• Here the pointer pData is modifiable but the data pointed by the
pData cannot be modifiable (read-only).
• So, we can say that pData is a pointer pointing to read-only data

pData is a pointer (*) pointing to constant data of type unsigned integer_8

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

uint8_t const *pData = (uint8_t*) 0x40000000;

Allowed Not-allowed
pData = (uint8_t*) 0x50000000;
*pData = 50;

pData = (uint8_t*) 0x60000000;

pData = (uint8_t*) 0x70000000;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Case2: Modifiable pointer and constant data


uint8_t const *pData = (uint8_t*) 0x40000000;

src is not guarded (prone to mistake)

src is guarded ( compiler alerts if programmer tries to change


the data pointed by src pointer)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Case3: Modifiable data and constant pointer

uint8_t *const pData = (uint8_t*) 0x40000000;


Read like this

• Here the pointer pData is read-only but the data pointed by the pData
can be modifiable.
• So, we can say that pData is a read only pointer pointing to modifiable
data

pData is a constant pointer (*) pointing to data of type unsigned integer_8

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

uint8_t * const pData = (uint8_t*) 0x40000000;

Not - Allowed Allowed


pData = (uint8_t*) 0x50000000;
*pData = 50;

*pData = 10;

*pData = 60;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Case3: Modifiable data and constant pointer

uint8_t *const pData = (uint8_t*) 0x40000000;

Use case :
Improve the readability
and guard the pointer
variables
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Case4: const data and const pointer

uint8_t const *const pData = (uint8_t*) 0x40000000;


Read like this

• Here the pointer pData is read-only and the data pointed by the pData
is also read-only
• So, we can say that pData is a read only pointer pointing to read-only
data

pData is a constant pointer (*) pointing to constant data of type unsigned integer_8

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Case4: const data and constant pointer
uint8_t const *const pData = (uint8_t*) 0x40000000;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Uses of ‘const’
• It adds some safety while you write code. The compiler warns
you when trying to change the value of the const variable.
• Since a constant variable doesn't change, It has only one state
throughout the problem. So, you need not track its various
states.
• Improves the readability of your program.
• Use it generously to enforce pointer access restrictions while
writing functions and function prototypes
• It may also help compiler to generate optimized code.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Type Qualifiers in ‘C’


1. const
2. volatile

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Volatile
Volatile is a type qualifier in ‘C’ used with variables to instruct the
compiler not to invoke any optimization on the variable operation.

It tells the compiler that the value of the variable may change at
any time with our without the programmer’s consent. So, the
compiler turns off optimizing the read-write operations on variables
which are declared using volatile keyword

Volatile is very much helpful in embedded systems codes

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

• Example of volatile effect


• Data1 = data2;
• Data1 = data2;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

When to use ‘Volatile’ qualifier ?


• A variable must be declared using a volatile
qualifier when there is a possibility of
unexpected changes in the variable value.

• The unexpected changes in the variable value


may happen from within the code or from
outside the code (from the hardware)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

When to use ‘Volatile’ qualifier ?


Use volatile when your code is dealing with below
scenarios
1. Memory-mapped peripheral registers of the
microcontrollers
2. Multiple tasks accessing global variables(read/write)
in an RTOS multithreaded application
3. When a global variable is used to share data
between the main code and an ISR code.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Syntax of using
‘volatile’

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Case1: volatile data


uint8_t volatile my_data;
volatile uint8_t my_data;
Read like

my_data is a volatile variable of type unsigned interger_8


this

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Case2: non-volatile pointer to volatile data


uint8_t volatile *pStatusReg;
Read like
this

pStatusReg is a non-volatile pointer , pointing to volatile data of type unsigned interger_8

Use case :
This is a perfect case of accessing memory-mapped registers.
Use this syntax generously whenever you are accessing memory mapped
registers in your microcontroller code

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Case3: volatile pointer to non-volatile data


uint8_t *volatile pStatusReg;

pStatusReg is a volatile pointer , pointing to non-volatile data of type unsigned interger_8

Rarely used
Case4: volatile pointer to volatile data
uint8_t volatile *volatile pStatusReg;

pStatusReg is a volatile pointer , pointing to volatile data of type unsigned interger_8

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

The keywords ’const’ and ’volatile’ can be applied to


any declaration, including those of structures,
unions, enumerated types or typedef names.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Usage of ‘const’ and ‘volatile’ together


• You can also use both ‘const’ and ‘volatile’ qualifiers in
a variable declaration as per your goal.
• Example
uint8_t volatile *const pReg = (uint8_t*)0x40000000;

uint8_t const volatile *const pReg = (uint8_t*)


0x40000000

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Case of reading from read-only buffer or address which is prone to unexpected
change
uint8_t const volatile *const pReg = (uint8_t*) 0x40000000

Data coming from external world

0xF1
Input data register of a peripheral
Or a shared memory from which you are supposed to read-only

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Structures in
www.fastbitlab.com

‘C’
• Structure is a data structure used to create user-defined
data types in ‘c’
• Structures allow us to combine data of different types

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Creation of structure
struct tag_name
{
This is syntax
member_element-1; to create a
member_element-2; structure in C
member_element-3;
member_element-n;
};
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Example of a structure
struct CarModel
{
unsigned int This called structure definition
Structure definition doesn’t consume any memory
carNumber; .
uint32_t Its just a description or a record

carPrice;
uint16_t
carMaxSpeed; BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Variables of a structure
struct CarModel User defined data type Structure variables

{
unsigned int carNumber; struct CarModel CarBMW, CarFord , CarHonda ;
uint32_t carPrice; (Memory will be consumed when
uint16_t carMaxSpeed;
you create structure variables.)
float carWeight;

}; What is the data type of CarBMW ?


The data type of CarBMW variable is “struct CarModel”

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Structure member element
www.fastbitlab.com

initialization
struct CarModel
{
unsigned int carNumber;
uint32_t carPrice;
uint16_t carMaxSpeed;
float carWeight;
struct CarModel CarBMW ={2021,15000,220,1330 }; // C89 method . Order is important
};
struct CarModel CarBMW ={.carNumber= 2021,.carWeight =1330 ,.carMaxSpeed =220,.carPrice =15000 };
//C99 method using designated initializers

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Example
• Write a program to create a carModel structure discussed and
create 2 variables of type carModel. Initialize the variables
with the below given data and then print them
1. 2021,15000,220,1330
2. 4031,35000,160,1900.96

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Accessing Structure Members


When a structure variable is created , use a .(
dot) operator to access the member elements

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Example
• Write a program to create a carModel structure discussed and
create 2 variables of type carModel. Initialize the variables
with the user given data and then print all member elements .

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Aligned/un-aligned data
access and structure
padding

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Aligned/un-aligned data access


• For efficiency, the compiler generates
instructions to store variables on their
natural size boundary addresses in the
memory
• This is also true for structures. Member
elements of a structure are located on their
natural size boundary
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Natural size boundary


Char
Address 0403010 0403011 0403012 0403013 0403014 0403015

short
Address 0403010 0403012 0403014 0403016 0403018 040301A

int
Address 0403010 0403014 0403018 040301C 0403020 0403024

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Natural size
www.fastbitlab.com

char aboundary
char b char c char d
Address 0403010 0403011 0403012 0403013 0403014 0403015 0403016 0403017 0403018

short b short c
char a
char a
Address 0403010 0403011 0403012 0403013 0403014 0403015 0403016 0403017 0403018

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Aligned data
char

Padding

For efficiency, the compiler generates instructions int


to store variables on their natural size boundary
addresses in the memory char
Padding
short

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Aligned data
char

Padding

For efficiency, the compiler generates instructions


to store variables on their natural size boundary
int
addresses in the memory
char
Padding
short

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Aligned data
• By default compiler always stores the data inside the memory in
aligned fashion(according to natural size boundary of variables )
• Aligned storage helps to achieve higher performance(in terms of
time & code space) using memory load and store instructions
• Aligned storage leads to generate fewer instructions to read data
from or write data into memory
• Reduces number of memory hits
• Aligned data consumes more data memory due to padding

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Structure padding
Aligned storage

sizeof( struct data) = 12 bytes

0 2 4

4 bytes width

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Packed structure (No
www.fastbitlab.com

padding ) Un-Aligned storage

sizeof( struct data) = 8 bytes 0 2 4


4 bytes width

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Assembly code analysis of packed and
www.fastbitlab.com

non-packed structure access


arm-none-eabi-size packed_Vsnonpacked.elf
text data bss dec hexfilename
5112 108 1596 6816 Un-packed
1aa0packed_Vsnonpacked.elf

arm-none-eabi-size packed_Vsnonpacked.elf
text data bss dec hexfilename
5144 108 1588 6840
1ab8packed_Vsnonpacked.elf packed
Finished building: default.size.stdout

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Typedef with
www.fastbitlab.com
typedef is used to give an alias name to
primitive and user defined data types
structure
typedef struct
struct CarModel {
unsigned int carNumber;
{ uint32_t carPrice;
unsigned int carNumber; uint16_t carMaxSpeed;
uint32_t carPrice; float carWeight;
uint16_t carMaxSpeed;
} CarModel_t;
float carWeight;

};
struct CarModel carBMW, carFord; CardModel_t carBMW, carFord;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Some more points about structure


• A structure type cannot contain itself as a
member
struct CarModel
{
unsigned int carNumber;
uint32_t carPrice;
uint16_t carMaxSpeed;
float carWeight;
struct CarModel carBWM; //Not allowed
};
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com
• structure types can contain pointers to their own type.
• Such self-referential structures are used in implementing linked lists and
binary trees

struct CarModel
{
unsigned int carNumber;
uint32_t carPrice;
uint16_t carMaxSpeed;
float carWeight;
struct CarModel *pcarBWM; //allowed
};

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Nested structure (Structure inside a
www.fastbitlab.com

structure)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Structures and pointers


• Creating pointer variables of a structure
• Reading and writing data with member
elements using structure pointers

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Storage of a structure in
www.fastbitlab.com

memory Base address of the structure in memory also


happens to be the address of the first member
element

Contiguous memory
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

Let's say you have been given with the base address of a
structure variable and asked to change the member
element values what would you do ?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

*(address_of_first_member_element_data1)= 0x55;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Accessing Structure Members


Use dot (.) operator when you use structure variable of
non pointer type
Use arrow (->) operator when you use structure variable
of pointer type

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Passing structure variable to a function


• Pass by value
• Pass by reference (pointer)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Structure serialization and address
www.fastbitlab.com

analysis

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Write a program to decode a given 32bit packet information and print the values of
different fields. Create a structure with member elements as packet fields as shown
below
SHORT_ADDR
ADDR_MODE STATUS

LONG_ADDR SENSOR BAT PAYLOAD CRC

[Bits] 1 2 8 3 3 12 1 2

32 bits

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Re-write the LED toggle application using
structure and bitfields. You have to create a
structure for every peripheral register you use
in this program.
• Access the structure member elements to
configure and access the peripheral registers.
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021
www.fastbitlab.com

In union, all the member elements refer to


the same memory area.
MSB LSB
LONG_ADDR SENSOR BAT PAYLOAD CRC
[Bits] 1 2 8 3 3 12 1 2

32 bits

LSB

MSB

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
In union, all the member elements refer to the
same memory area.

32 bits(uint32_t) of memory area


MSB LSB
packetValue
[Bits]

LSB

MSB

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Bit-fields
SHORT_ADDR
ADDR_MODE STATUS

LONG_ADDR SENSOR BAT PAYLOAD CRC

[Bits] 1 2 8 3 3 12 1 2

32 bits

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

So, can you convert this register information into a structure with bit fields ?

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Creating bit-field structure for
www.fastbitlab.com

peripheral registers

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Create different Bit field structures for different


peripheral registers you use in LED toggle application.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

32 bits width

0x4002_0C0
31 30 GPIOD port mode register 3 2 1 0
0
Register address
pin_15 pin_1 pin_0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

32 bits width

0x4002_0C0
31 30 GPIOD port mode register 3 2 1 0
0
Register address
pin_15 pin_1 pin_0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

32 bits width

0x4002_0C0
31 30 GPIOD port mode register 3 2 1 0
0
Register address
pin_15 pin_1 pin_0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

32 bits width

0x4002_0C0
31 30 GPIOD port mode register 3 2 1 0
0
Register address
pin_15 pin_1 pin_0

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

32 bits width

0x4002_0C0
31 30 GPIOD port mode register 3 2 1 0
0
Register address
pin_15 pin_1 pin_0

Compiler will generate the instructions to program the


(Compiler) appropriate bit positions in the peripheral register address.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Volatile data and structure pointer

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Creating a structure for the MCU
www.fastbitlab.com

peripheral
Update

Peripheral register
Peripheral circuit Configure sets

A peripheral of the MCU

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Creating a structure for the MCU
peripheral
Let's create a generic structure for a particular peripheral and keep
all individual peripheral register structures as member elements.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

GPIO Peripherals in STM32


• STM32F407 has 11 GPIO peripherals
• GPIOA, GPIOB ….. GPIOK (GPIOx , x = A..I/J/K)
• Each GPIO peripheral is used to control 16 different
pins of the port
– E.g. : GPIOA controls PORT-A (pins PA0 to PA15)

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

GPIOA GPIOB GPIOC GPIOD


(Register base address of (Register base address of GPIOB) (Register base address of GPIOC) (Register base address of
GPIOA)
0x4002000 0x4002040 0x4002080 0x40020C0
GPIOD)
0 0 0 0

Every peripheral has its own register sets falling in


specific locations of the processor memory map

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
• Create a generic structure for the GPIO peripherals,
which can be used to configure any GPIO peripheral.
• Keep individual bit field structures created in the
previous lecture as member elements of the above
mentioned generic structure.
• Re-Write the LED toggle application with the above
changes.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Generic structure for
www.fastbitlab.com

GPIOx
Note:
While writing member
elements into this structure,
give attention to offsets of
different registers.
Not maintaining the proper
offset will end up programming
wrong addresses

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com
Register base address of a
32 bits width
peripheral OFFSET
0x0
0x400X_XXXX REG1

0x4 REG2

0x8 REG3

0xC REG4

0x10 REG5

0x14 REG6

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Memory locations

Member_element-1 Member_element-2 Member_element-3 Member_element-4 Member_element-5


32 bits

0x4000_0C00 0x4000_0C04 0x4000_0C08 0x4000_0C0C 0x4000_0C10


(Structure base)

Corresponds to
Address of the Member-element-1 : 0x4000_0C00 REG1
Address of the Member-element-2 : 0x4000_0C04 REG2
Address of the Member-element-3 : 0x4000_0C08 REG3
Address of the Member-element-4 : 0x4000_0C0C REG3
so on . ..

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

unions

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

unions
• A union in ‘C’ is similar to a structure except
that all of its members start at the same
location in memory.
• A union variable can represent the value of
only one of its members at a time.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Difference between union and
www.fastbitlab.com

structure
Structure memory allocation
0xE00 0xE01 0xE02 0xE03 0xE04 0xE05 0xE06 0xE07

union memory allocation


0xE00 0xE01 0xE02 0xE03

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Applicability of unions in Embedded
www.fastbitlab.com

System code
1. Bit extraction
2. Storing mutually exclusive data thus saving
memory

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Unions and bit extraction technique

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


Unions to store mutually exclusive
www.fastbitlab.com

data

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

/* Extended address */
typedef struct typedef uint8 sAddrExt_t[SADDR_EXT_LEN];
{
union /* Combined short/extended device address */
{ typedef struct
uint16 shortAddr; {
ZLongAddr_t extAddr; union
} addr; {
byte addrMode; uint16 shortAddr; /* Short address */
} zAddrType_t; sAddrExt_t extAddr; /* Extended address */
} addr;
uint8 addrMode; /* Address mode */
} sAddr_t;

Some example use cases of unions

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

// Scan Request/Response "ZigBee information" field bitmap


typedef struct
{
unsigned int logicalType:2;
unsigned int rxOnWhenIdle:1;
unsigned int reserved:5;
} zInfoBits_t;

// Scan Request/Response "ZigBee information" field


typedef union
{
zInfoBits_t zInfoBits;
uint8 zInfoByte;
} zInfo_t;

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Optimization

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Exercise
Modify the LED Toggle program by introducing
structure and bit fields to configure and access
the memory mapped peripheral registers.

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Program optimization
• Optimization is a series of actions taken by the compiler
on your program’s code generation process to reduce
– Number of instructions (code space optimization )
– Memory access time (time space optimization )
– Power consumption
• By default, the compiler doesn’t invoke any optimization
on your program
• You can enable the optimization using compiler flags

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


GCC Compiler flags to enable
www.fastbitlab.com

optimization
• -O0
– No optimization .
– Not recommended for productions if you have limited code and ram space
– Has fastest compilation time
– This is debugging friendly and used during development
– A code which works with –O0 optimization may not work with –O0+ optimization levels. Code
needs to verified again.
• -O1
– Moderate optimization to decrease memory access time and code space

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


GCC Compiler flags to enable
www.fastbitlab.com

optimization
-O2 You need to work with different optimization levels to find
• Full optimization out what works for you.
• Slow compilation time For all code exercise we do in this course, we consider –O0
• Not debugging friendly optimization level.

-O3
• Full optimization of –O2 + some more aggressive optimization steps will be
taken by the compiler.
• Slowest compilation time
• May cause bugs in the program
• Not debugging friendly

BHARATI SOFTWARE , CC BY-SA 4.0 , 2021


www.fastbitlab.com

Interfacing projects
Code from scratch using the
concepts of ,
• Pointers
• Memory mapped IOs
• Bitwise operators
• Structures and bit fields
• const and volatile type qualifiers
BHARATI SOFTWARE , CC BY-SA 4.0 , 2021

You might also like