C in a Nutshell - California University of Pennsylvania
Download
Report
Transcript C in a Nutshell - California University of Pennsylvania
‘C’ in a Nutshell
A “crash course” in C...
...with designs for embedded systems
by J. S. Sumey
Part I: intro, variables, constants, operators
REFERENCE:
The C Programming Language (2nd ed.)
Brian W. Kernighan
Dennis M. Ritchie
Prentice Hall Software Series
'C' in a Nutshell by J. Sumey
2 of 27
Low-Level (Assembly) Programming
pros:
object code is smaller and runs faster
important in embedded systems!
programmer has total control over system
hardware
cons:
need to know processor and hardware intimately
more tedious & time consuming
not portable!
'C' in a Nutshell by J. Sumey
3 of 27
High-Level Programming
pros:
source code is highly portable
more streamlined development, quicker
increased programmer productivity
support of structured design techniques
more readable code, easier maintenance
better math handling support
cons:
increased overhead
'C' in a Nutshell by J. Sumey
4 of 27
“Mixed” Approach
can use HLL like ‘C’ for bulk of project and
use assembly for select parts
time-sensitive functions
interrupt handling
special instructions, ex: fuzzy logic
creates linkage issues
calling assembly routines from C
parameter passing & return results
'C' in a Nutshell by J. Sumey
5 of 27
C Background
created in ‘70s by Dennis Ritchie at Bell Labs
a general-purpose “systems” programming
language, multi-domain
applications
compilers
operating systems
platform & architecture independent
standardized in late ‘80s by ANSI “ANSI C”
is actually known as a mid-level language
most commonly used language in industry
'C' in a Nutshell by J. Sumey
6 of 27
Overview 1
a ‘typed’ language
fundamental: characters, integers, floating-point
derived: pointers, arrays, structures, unions
“basic” arithmetic & logical operations only
typical control-flow constructs
statement grouping
decision
selection
looping
'C' in a Nutshell by J. Sumey
7 of 27
Overview 2
functions:
may return anything (or nothing)
no nesting
may be recursive
may exist in separate source files compiled
individually or combined into a single file
variable scope (declarations, actually):
local to a function
local to a source file, global to all functions within
global to entire program
'C' in a Nutshell by J. Sumey
8 of 27
Overview 3
uses a “preprocessor” during compilation
macro substitution
include files
conditional compilation
depends on libraries for everything else!
input / output
file access
composite object manipulation
i.e., arrays, lists, strings
dynamic memory allocation
'C' in a Nutshell by J. Sumey
9 of 27
I. Data Types & Operations
- representation of information
& how to manipulate it
Constants - 1
integers
use suffix to override default int
ex: 999999999L – forces interpretation as long
ex: 32767U – forces unsigned interpretation
prefixes to override default base (10)
ex: 037 = 0x1f = 31
ex: 0XFUL = ???
some compilers also support binary constants:
#define MASK 0b11110000
floats
contain ‘.’ or ‘e’, default is double
ex: 1e-1L – forces long interpretation
'C' in a Nutshell by J. Sumey
11 of 27
Constants - 2
characters
a single character within single quotes
ex: ‘A’ = 0x41 = 65
can represent certain control characters via
“escape sequences”
ex: ‘\n’, ‘\b’, ‘\f’, ‘\g’, ‘\r’, ‘\t’, ‘\\’
can also represent characters in octal & hex
ex: #define LF ‘\012’
ex: #define CR ‘\0x0d’
'C' in a Nutshell by J. Sumey
12 of 27
Constants - 3
sting literals
zero or more characters within double quotes
terminating null byte (‘\0’) is assumed
ex: “a 21 character string”
gotcha:
‘t’ “t”
'C' in a Nutshell by J. Sumey
13 of 27
Variables
represent named storage locations in memory
must be declared before use
associates a data type to the variable
letters, numbers, & underscore
must start with letter or ‘_’
library routines typically start variables with ‘_’
convention: all UPPERCASE for symbolic constants;
lower or mixed upper/lower for variables
minimum 31 characters significant
don’t use reserved words (if, else, int, etc.)
'C' in a Nutshell by J. Sumey
14 of 27
Data Types
Basic data types:
char – holds a single character (ASCII)
typically consumes 1 byte per char
has same characteristics as ints
int – integer only number
typically 16 or 32 bits, depends on architecture
float – ‘single precision’ floating point
typically 32 bits, depends on architecture
double – ‘double precision’ floating point
typically 64 bits, depends on architecture
'C' in a Nutshell by J. Sumey
15 of 27
Data Type ‘Qualifiers’
modify the basic properties of the data type
long & short – apply to integers to force them to
more or less dynamic range
ex: short int loopctr;
‘int’ may be omitted
signed & unsigned – applies to chars & ints
ex: unsigned char uc; range of ‘uc’ is 0..255
ex: signed char sc; range of ‘sc’ is -128..+127
long double – extended-precision floating point
standard headers define sizes for given system
<limits.h> & <float.h>
'C' in a Nutshell by J. Sumey
16 of 27
Sample program: sizes.c
#include <stdio.h>
#include <limits.h>
#include <float.h>
main()
{
printf( "\n--- SIZES OF BASIC DATA TYPES ON A COLDFIRE v1 ---\n\n" );
printf( "number of bits in a char: %i\n", CHAR_BIT );
printf( "range of a unsigned char: %u..%u\n", 0, UCHAR_MAX );
printf( "range of a
signed char: %i..%i\n", SCHAR_MIN, SCHAR_MAX );
printf( "range of a plane ol char: %i..%i\n", CHAR_MIN, CHAR_MAX );
puts( "" );
printf( "number of bits in a short: %i\n", sizeof(short)*8);
printf( " range of a short integer: %i..%i\n", SHRT_MIN, SHRT_MAX );
printf( "
an unsigned short: %u..%u\n", 0, USHRT_MAX );
puts( "" );
printf( " number of bits in a int: %i\n", sizeof(int)*8 );
printf( " range of a plane integer: %i..%i\n", INT_MIN, INT_MAX );
printf( "
an unsigned int: %u..%u\n", 0, UINT_MAX );
puts( "" );
printf( " number of bits in a long: %i\n", sizeof(long)*8 );
printf( " range of a long integer: %li..%li\n", LONG_MIN, LONG_MAX );
printf( "
an unsigned long: %lu..%lu\n", 0L, ULONG_MAX );
puts( "" );
printf( " number of bits in a long long: %i\n", sizeof(long long)*8 );
printf( " range of a long long int: %lli..%lli\n", LLONG_MIN, LLONG_MAX );
printf( "
an unsigned long long: %llu..%llu\n", 0LL, ULLONG_MAX );
puts( "" );
printf( " number of digits in a float: %i\n", FLT_DIG );
printf( "
range of a plane ol float: %E..%E\n", FLT_MIN, FLT_MAX );
puts( "" );
printf( "number of digits in a double: %i\n", DBL_DIG );
printf( " range of a plane ol double: %.15E..%.15E\n", DBL_MIN, DBL_MAX );
}
'C' in a Nutshell by J. Sumey
17 of 27
Sample run on a ColdFire v1 MCU
--- SIZES OF BASIC DATA TYPES ON A COLDFIRE v1 --number of bits in a
range of a unsigned
range of a
signed
range of a plane ol
char:
char:
char:
char:
8
0..255
-128..127
0..255
number of bits in a short: 16
range of a short integer: -32768..32767
an unsigned short: 0..65535
number of bits in a int: 32
range of a plane integer: -2147483648..2147483647
an unsigned int: 0..4294967295
number of bits in a long: 32
range of a long integer: -2147483648..2147483647
an unsigned long: 0..4294967295
number of bits in a long long: 64
range of a long long int: -9223372036854775808..9223372036854775807
an unsigned long long: 0..18446744073709551615
number of digits in a float: 6
range of a plane ol float: 1.175494E-38..3.402823E+38
number of digits in a double: 15
range of a plane ol double: 2.225073858507201E-308..1.797693134862316E+308
'C' in a Nutshell by J. Sumey
18 of 27
Data Types for Embedded Systems
very useful in embedded systems:
byte-sized (8-bit) data
Byte, uchar, uint8, byte: 0..255
sByte, schar, sint8: -128..+127
16-bit data
Word, uint, uint16, word: 0..65535
sWord, sint, sint16: -32768..+32767
32-bit data
LWord, ulong, uint32, dword: 0..4294967295
sLWord, slong, sint32: -2147483648..2147483647
Boolean
bool: TRUE/FALSE
these are defined in stdtypes.h, derivative.h, etc.
'C' in a Nutshell by J. Sumey
19 of 27
“Extended” Data Types
additional data types derived from or
extending the basic types:
array
pointer
structure
union
function
will save for part III
'C' in a Nutshell by J. Sumey
20 of 27
Variable ‘Storage’ Attributes
define where variables are stored and how
they may be used / accessed
auto (default) – in a “stack frame”
register – kept in a processor register if possible
const – a variable that doesn’t change after
initialization
should be stored in ROM
volatile – a variable that can change “on its own”
I/O registers, semaphores
extern – a variable defined outside the module it
is referenced from
'C' in a Nutshell by J. Sumey
21 of 27
Declarations
variables must be declared before use
specifies a data type to each variable
ex: int first, last, inc;
ex: short Circuit;
may also include an initializer
ex: char esc = ‘\0x1b’;
the “const” qualifier declares a read-only
variable (cannot be subsequently changed)
ex: const float pi = 3.14159;
'C' in a Nutshell by J. Sumey
22 of 27
Operators - 1
arithmetic
+, -, *, /, % (modulus, ints only)
equality
== (equal), != (not equal)
relational
<, <=, =>, >
logical – normally used in if statements
&& (and), || (or), ! (not)
'C' in a Nutshell by J. Sumey
23 of 27
Operators - 2
increment / decrement
++, -be careful of prefix vs. postfix use!
bitwise
perform bit manipulation on char/integers only
& (AND), | (OR), ^ (EOR)
<< (shift left), >> (shift right)
~ (1’s complement)
these operators can be very useful for
embedded programming!
ex…
'C' in a Nutshell by J. Sumey
24 of 27
Assignment Operators
many binary operators have a corresponding
“assignment operator”
e1 op= e2 is equivalent to e1 = e1 op e2
ex: step += 2
this works for +, -, *, /, %, <<, >>, &, ^, |
increases efficiency in embedded
programming! (how?)
ex: porta |= 4;
ex: portb &= ~4;
'C' in a Nutshell by J. Sumey
25 of 27
Conditional Expressions
uses the ternary operator “?:” and three
expressions
expr1 ? expr2 : expr3
means: expr2 if expr1 is true (non-0), else expr3
ex: z = ( a < b ) ? a : b;
is equivalent to:
if (a < b) z = a; else z = b;
i.e., z = min( a, b) !
'C' in a Nutshell by J. Sumey
26 of 27
Precedence
PREC.
hi
determines order of
expression evaluation;
hence result!
association determines
binding of operators
may always be
overridden with parens
ex:
if (porta & 0x80 == 0)
bomb = 17 / 0;
OOPS!
what’s really wrong here?
lo
'C' in a Nutshell by J. Sumey
OPERATOR
ASSOC.
() [] -> .
l-to-r
! ~ ++ -- + - (unary)
* & (type) sizeof
r-to-l
*/%
l-to-r
+ - (binary)
l-to-r
<< >>
l-to-r
< <= >= >
l-to-r
== !=
l-to-r
&
l-to-r
^
l-to-r
|
l-to-r
&&
l-to-r
||
l-to-r
?:
r-to-l
= op=
r-to-l
,
l-to-r
27 of 27