Professional Documents
Culture Documents
Derrick Klotz
Regional Field Applications Engineer
TM
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective
owners. Freescale Semiconductor, Inc. 2010.
Agenda
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Embedded C versus Desktop C
C for Embedded Systems Programming
TM
Introduction
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Why Change to C?
C retains the basic philosophy that programmers know what they are doing.
C only requires that they state their intentions explicitly.
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Why Not C?
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Embedded versus Desktop Programming
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Assembly Language versus C
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Knowing the Environment Compiler & Linker
C for Embedded Systems Programming
TM
Compilers little Details
Inline Assembly
Interrupt Functions
Assembly Language Generation
Standard Libraries
Startup code
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Compiler Requirements
.asm
.asm
.o
.o
.c.c Compiler
+ .h listing
listing
.cpp .h
.cpp
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Compiler Internal view
Front End reading th program:
Source Code Identifies the language (C, C++ )
Prevents syntax errors
Takes account of the preprocessing directives
(macros and typedef resolutions, conditional
compilation etc...)
Front End Code Generator:
Generate ROM-able code
Code Generate optimized code according to
the requested compiler options
Generator
Generate re-entrant code
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Overview
After compiling process is done, the linker works with the object files
generated in order to link the final application
The linker parameter file could be used to do some useful tricks that
will aid during the development process
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Linker Requirements
.o
.o
.s19
.s19
Linker
.o
.o
.map
.map
.o
.o
Target
description
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Target Description S08
Direct Page
0x00FF
MC9S08QE32 MC9S08LL64
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Target Description S12X and ColdFire
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Memory Models
Memory models have a meaning depending on the target used
HC(S)12
Model HC(S)08 Data Function
S12X
All data, including stack, must fit 8-bits 16-bits
Tiny into the zero page pointers have unless
8-bit addresses unless is explicitly specified
specified with __far
All pointers and functions have Data and functions are accessed by 16-bits 16-bits
Small 16-bit addresses. Code and data default with 16- bit addresses, code unless
shall be located in a 64Kb and data fit in 64 KB specified
address space
This model uses the Memory Data is also accessed with 16-bit 16-bits 24-bits
Banked Management Unit (MMU), addresses, functions are called
allowing the extension of program using banked calls
space beyond the 64 KB
Both code and data are accessed 24-bits 24-bits
Large using paged conventions
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Tying Everything Together
.asm
.asm
.o.o .s19
.s19
.c.c Compiler Linker
+ .h.h listing
listing .map
.cpp .map
.cpp
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Far and Near
The keywords far and near in C are intended to refer to data (either code or
variables) within the same memory block or outside of the memory block
Depending on the architecture, the memory block can mean different things
Applied to functions
__far and __near specify the calling convention. Far function calls can cross
pages. Near function calls must stay in the same page
void main(void) void __far MyFunction (void); void __near MyFunction (void);
{
MyFunction(); CALL MyFunction, PAGE(MyFunction) JSR MyFunction
}
Applied to variables
A variable declared __near is considered by the compiler to be allocated in the
memory section that can be accessed with direct addressing (first 256 bytes for
S08, first 64 KB for S12 and S12X) accessing variables in the zero page
generates less code and executes faster since the address is only 8-bits
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Using near and far
For variables
#pragma DATA_SEG <segment name>
Compiler
For code char var;
#pragma CODE_SEG <segment name> var++; ldhx #var
inc ,x
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
MC9S08LL64 Linker Parameter File (.prm)
NAMES
NAMES END
END /*
/* CodeWarrior
CodeWarrior will
will pass
pass all
all the
the needed
needed files
files to
to the
the linker
linker by
by command
command line.
line. But
But
SEGMENTS
SEGMENTS /*
/* Here
Here all
all RAM/ROM
RAM/ROM areas
areas of
of the
the device
device are
are listed.
listed. Used
Used in
in PLACEMENT
PLACEMENT below.
below. */
*/
Z_RAM
Z_RAM == READ_WRITE
READ_WRITE 0x0060
0x0060 TO
TO 0x00FF;
0x00FF;
RAM
RAM == READ_WRITE
READ_WRITE 0x0100
0x0100 TO
TO 0x0FFF;
0x0FFF;
/*
/* unbanked
unbanked FLASH
FLASH ROM
ROM */
*/
ROM
ROM == READ_ONLY
READ_ONLY 0x18A1
0x18A1 TO
TO 0x7FFF;
0x7FFF;
SEGMENTS SECTION ROM1
ROM1 == READ_ONLY
READ_ONLY 0x103C
0x103C TO
TO 0x17FF;
0x17FF;
Defines the memory available in the MCU, ROM2
ROM2 == READ_ONLY
READ_ONLY 0xC000
0xC000 TO
TO 0xFFAB;
0xFFAB;
providing full control over memory allocation. ROM3
ROM3 == READ_ONLY
READ_ONLY 0xFFC0
0xFFC0 TO
TO 0xFFD1;
0xFFD1;
/*
/* banked
banked FLASH
FLASH ROM
ROM */
*/
This is essentially a translation of the data sheet. PPAGE_0 == READ_ONLY 0x008002 TO 0x00903B; /*
PPAGE_0 READ_ONLY 0x008002 TO 0x00903B; /* PAGE
PAGE partially
partially containe
containe
PPAGE_0_1
PPAGE_0_1 == READ_ONLY
READ_ONLY 0x009800
0x009800 TO
TO 0x0098A0;
0x0098A0;
PPAGE_2
PPAGE_2 == READ_ONLY
READ_ONLY 0x028000
0x028000 TO
TO 0x02BFFF;
0x02BFFF;
/*
/* PPAGE_1
PPAGE_1 == READ_ONLY
READ_ONLY 0x018000
0x018000 TO
TO 0x01BFFF;
0x01BFFF; PAGE
PAGE already
already contained
contained in
in
/*
/* PPAGE_3
PPAGE_3 == READ_ONLY
READ_ONLY 0x038000
0x038000 TO
TO 0x03BFFF;
0x03BFFF; PAGE
PAGE already
already contained
contained in
in
END
END
PLACEMENT
PLACEMENT /*
/* Here
Here all
all predefined
predefined and
and user
user segments
segments are
are placed
placed into
into the
the SEGMENTS
SEGMENTS defined
defined above
above
DEFAULT_RAM,
DEFAULT_RAM, /*
/* non-zero
non-zero page
page variables
variables */
*/
INTO
INTO RAM;
RAM;
_PRESTART,
_PRESTART, STARTUP,
STARTUP, /*
/* startup
startup code
code and
and data
data structures
structures */
*/
ROM_VAR,
ROM_VAR, /*
/* constant
constant variables
variables */
*/
PLACEMENT SECTION STRINGS,
STRINGS, /*
/* string
string literals
literals */
*/
Provides the ability to assign each section from VIRTUAL_TABLE_SEGMENT,
VIRTUAL_TABLE_SEGMENT, /*
/* C++
C++ virtual
virtual table
table segment
segment */
*/
NON_BANKED,
NON_BANKED, /*
/* runtime
runtime routines
routines which
which must
must not
not be
be banked
banked */
*/
the application to specific memory segments. DEFAULT_ROM,
DEFAULT_ROM,
The names identified in this section are used in COPY
COPY /*
/* copy
copy down
down information:
information: how
how to
to initialize
initialize variable
variable
the source code, for example: INTO
INTO ROM;
ROM; /*
/* ,ROM1,ROM2,ROM3:
,ROM1,ROM2,ROM3: To
To use
use "ROM1,ROM2,ROM
"ROM1,ROM2,ROM
#pragma DATA_SEG MY_ZEROPAGE
PAGED_ROM
PAGED_ROM /*
/* routines
routines which
which can
can be
be banked
banked */
*/
INTO
INTO PPAGE_2,ROM1,ROM2,ROM3,PPAGE_0,PPAGE_0_1;
PPAGE_2,ROM1,ROM2,ROM3,PPAGE_0,PPAGE_0_1;
_DATA_ZEROPAGE,
_DATA_ZEROPAGE, /*
/* zero
zero page
page variables
variables */
*/
MY_ZEROPAGE
MY_ZEROPAGE INTO
INTO Z_RAM;
Z_RAM;
END
END
STACKSIZE is one way to reserve a portion of
memory for stack usage. STACKSIZE
STACKSIZE 0x100
0x100
VECTOR
VECTOR 00 _Startup
_Startup /*
/* Reset
Reset vector:
vector: this
this is
is the
the default
default entry
entry point
point for
for an
an application.
application. */
*/
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Controlling the Location of the Stack
SEGMENTS SEGMENTS
Z_RAM = READ_WRITE 0x0060 TO 0x00FF; Z_RAM = READ_WRITE 0x0060 TO 0x00FF;
RAM = READ_WRITE 0x0100 TO 0x0FFF; RAM = READ_WRITE 0x0100 TO 0x0EFF;
END STACK_RAM = READ_WRITE 0x0F00 TO 0x0FFF;
END
PLACEMENT
SSTACK INTO STACK_RAM;
END
0x0000
or 0x0000
0x00FF 0x00FF
0x0100 0x0100
#pragma DATA_SEG DEFAULT_RAM variables #pragma DATA_SEG DEFAULT_RAM variables
stack
SP
RAM RAM
0x0F00
0x0FFF 0x0FFF
stack
SP
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
ColdFire MCF51QE128 Linker Control File (.lcf)
## Sample
Sample Linker
Linker Command
Command File
File for
for CodeWarrior
CodeWarrior for
for ColdFire
ColdFire MCF51QE128
MCF51QE128
## Memory
Memory ranges
ranges
MEMORY
MEMORY {{
MEMORY SEGMENT code
code (RX)
(RX) :: ORIGIN
ORIGIN == 0x00000410,
0x00000410, LENGTH
LENGTH == 0x0001FBF0
0x0001FBF0
Describes the available memory userram
userram (RWX)
(RWX) :: ORIGIN
ORIGIN == 0x00800000,
0x00800000, LENGTH
LENGTH == 0x00002000
0x00002000
}}
SECTIONS
SECTIONS {{
## Heap
Heap and
and Stack
Stack sizes
sizes definition
definition
___heap_size
___heap_size == 0x0400;
0x0400;
___stack_size
___stack_size == 0x0400;
0x0400;
## MCF51QE128
MCF51QE128 Derivative
Derivative Memory
Memory map
map definitions
definitions from
from linker
linker command
command files:
files:
## ___RAM_ADDRESS,
___RAM_ADDRESS, ___RAM_SIZE,
___RAM_SIZE, ___FLASH_ADDRESS,
___FLASH_ADDRESS, ___FLASH_SIZE
___FLASH_SIZE linker
linker
## symbols
symbols must
must be
be defined
defined in
in the
the linker
linker command
command file.
file.
SECTIONS SEGMENT
Defines the contents of memory sections and ## 88 Kbytes
Kbytes Internal
Internal SRAM
SRAM
global symbols ___RAM_ADDRESS
___RAM_ADDRESS == 0x00800000;
0x00800000;
___RAM_SIZE
___RAM_SIZE == 0x00002000;
0x00002000;
## 128
128 KByte
KByte Internal
Internal Flash
Flash Memory
Memory
___FLASH_ADDRESS
___FLASH_ADDRESS == 0x00000000;
0x00000000;
___FLASH_SIZE
___FLASH_SIZE == 0x00020000;
0x00020000;
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
How can we verify where the Linker put our code and data?
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
The Map File
*********************************************************************************************
*********************************************************************************************
TARGET
TARGET SECTION
SECTION
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
TARGET SECTION Processor
Processor :: Freescale
Freescale HC08
HC08
Memory
Memory Model:
Model: SMALL
SMALL
Names the target processor and memory model File
File Format
Format :: ELF\DWARF
ELF\DWARF 2.0
2.0
Linker
Linker :: SmartLinker
SmartLinker V-5.0.39
V-5.0.39 Build
Build 10132,
10132, May
May 13
13 2010
2010
*********************************************************************************************
*********************************************************************************************
FILE
FILE SECTION
SECTION
FILE SECTION ---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
main.obj
main.obj Model:
Model: SMALL,
SMALL, Lang:
Lang: ANSI-C
ANSI-C
Lists the names of all files from which objects
start08.obj
start08.obj Model:
Model: SMALL,
SMALL, Lang:
Lang: ANSI-C
ANSI-C
were used mc9s08ll64.obj
mc9s08ll64.obj Model:
Model: SMALL,
SMALL, Lang:
Lang: ANSI-C
ANSI-C
*********************************************************************************************
*********************************************************************************************
STARTUP
STARTUP SECTION
SECTION
STARTUP SECTION ---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
Lists the prestart code and the values used to Entry
Entry point:
point: 0x191C
0x191C (_Startup)
(_Startup)
_startupData
_startupData is
is allocated
allocated at
at 0x1925
0x1925 and
and uses
uses 66 Bytes
Bytes
initialize the startup descriptor _startupData. extern
extern struct
struct _tagStartup
_tagStartup {{
The startup descriptor is listed member by unsigned
unsigned nofZeroOut
nofZeroOut 11
member with the initialization data at the right _Range
_Range pZeroOut
pZeroOut 0x60
0x60 11
hand side of the member name _Copy
_Copy *toCopyDownBeg
*toCopyDownBeg 0x1945
0x1945
}} _startupData;
_startupData;
*********************************************************************************************
*********************************************************************************************
SECTION-ALLOCATION
SECTION-ALLOCATION SECTION
SECTION
Section
Section Name
Name Size
Size Type
Type From
From To
To Segment
Segment
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
.init
.init 132
132 RR 0x18A1
0x18A1 0x1924
0x1924 ROM
ROM
SECTION-ALLOCATION SECTION .startData
.startData 14
14 RR 0x1925
0x1925 0x1932
0x1932 ROM
ROM
.text
.text 18
18 RR 0x1933
0x1933 0x1944
0x1944 ROM
ROM
Lists those segments for which at least one .copy 22 RR 0x1945 0x1946 ROM
.copy 0x1945 0x1946 ROM
object was allocated MY_ZEROPAGE
MY_ZEROPAGE 11 R/W
R/W 0x60
0x60 0x60
0x60 Z_RAM
Z_RAM
.abs_section_0
.abs_section_0 11 N/I
N/I 0x0
0x0 0x0
0x0 .absSeg0
.absSeg0
.abs_section_1
.abs_section_1 11 N/I
N/I 0x1
0x1 0x1
0x1 .absSeg1
.absSeg1
.abs_section_2
.abs_section_2 11 N/I
N/I 0x2
0x2 0x2
0x2 .absSeg2
.absSeg2
.abs_section_3
.abs_section_3 11 N/I
N/I 0x3
0x3 0x3
0x3 .absSeg3
.absSeg3
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
The Map File
Linker
Linker Parameter
Parameter file
file
*********************************************************************************************
*********************************************************************************************
TARGET
TARGET SECTION
SECTION
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
PLACEMENT /*
/* Here
Processor
PLACEMENT
ProcessorHere::all predefined
Freescale
all HC08and
HC08
predefined
Freescale and user
user segments
segments are
are placed
placed into
into the
the SEGMENTS
SEGMENTS defined
defined above.
above. */
*/
.init = _PRESTART DEFAULT_RAM,
Memory
Memory Model:
Model: SMALL
DEFAULT_RAM, SMALL /*
/* non-zero
non-zero page
page variables
variables */
*/
.startData = STARTUP File
File Format
Format :: ELF\DWARF
ELF\DWARF 2.0
2.0 INTO
INTO RAM;
RAM;
Linker
Linker :: SmartLinker
SmartLinker V-5.0.39
V-5.0.39 Build
Build 10132,
10132, May
May 13
13 2010
2010
.text = DEFAULT_ROM _PRESTART, /*
_PRESTART, /* startup
startup code
code */
*/
.copy = COPY STARTUP,
STARTUP, /*
/* startup
startup data
data structures
structures */
*********************************************************************************************
*/
*********************************************************************************************
.stack = SSTACK ROM_VAR,
FILE
FILE SECTION
ROM_VAR,
SECTION /*
/* constant
constant variables
variables */*/
.data = DEFAULT_RAM STRINGS, /*
/* string
string literals
literals */
---------------------------------------------------------------------------------------------
STRINGS, */
---------------------------------------------------------------------------------------------
VIRTUAL_TABLE_SEGMENT,
main.obj
VIRTUAL_TABLE_SEGMENT,
main.obj /*
/* C++
C++ virtual
Model:
virtual
Model: table
table segment
SMALL,
SMALL, */
Lang:
segment */ ANSI-C
Lang: ANSI-C
.common = DEFAULT_RAM NON_BANKED, /*
start08.obj
NON_BANKED,
start08.obj /* runtime
Model:routines
Model:
runtime SMALL, which
SMALL,
routines which must
Lang:
must not
Lang: be
be banked
banked */
ANSI-C
not
ANSI-C */
DEFAULT_ROM,
mc9s08ll64.obj
DEFAULT_ROM,
mc9s08ll64.obj Model:
Model: SMALL,
SMALL, Lang:
Lang: ANSI-C
ANSI-C
COPY
COPY /*
/* copy
copy down
down information:
information: how
how to
to initialize
initialize variables
variables */
*/
INTO
INTO ROM;
ROM; /*
/* ,ROM1,ROM2,ROM3:
,ROM1,ROM2,ROM3: To To use
use "ROM1,ROM2,ROM3"
"ROM1,ROM2,ROM3" as
*********************************************************************************************
********************************************************************************************* as
Every variable allocated with an absolute STARTUP
STARTUP SECTION
SECTION
syntax of the kind: PAGED_ROM /*
/* routines
routines which
which can
can be
be banked
banked */
---------------------------------------------------------------------------------------------
PAGED_ROM */
---------------------------------------------------------------------------------------------
type variablename @0xABCD; Entry
Entry point:
point: 0x191C
0x191C (_Startup)
(_Startup) INTO
INTO PPAGE_2,ROM1,ROM2,ROM3,PPAGE_0,PPAGE_0_1;
PPAGE_2,ROM1,ROM2,ROM3,PPAGE_0,PPAGE_0_1;
_startupData
_startupData isis allocated
allocated at
at 0x1925
0x1925 and
and uses
uses 66 Bytes
Bytes
will have a section and a segment assigned _DATA_ZEROPAGE, /*
extern
extern struct
struct _tagStartup
_DATA_ZEROPAGE, _tagStartup {{ /* zero
zero page
page variables
variables */
*/
for its own. MY_ZEROPAGE
unsigned
unsigned nofZeroOut
MY_ZEROPAGE nofZeroOut 11 INTO
INTO Z_RAM;
Z_RAM;
END
END _Range
_Range pZeroOut
pZeroOut 0x60
0x60 11
All MCU registers are declared this way. This _Copy
_Copy *toCopyDownBeg
*toCopyDownBeg 0x1945
0x1945
}} _startupData;
_startupData;
is why we have one abs_section for every
MCU register. *********************************************************************************************
*********************************************************************************************
SECTION-ALLOCATION
SECTION-ALLOCATION SECTION
SECTION
Section
Section Name
Name Size
Size Type
Type From
From To
To Segment
Segment
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
.init
.init 132
132 RR 0x18A1
0x18A1 0x1924
0x1924 ROM
ROM
SECTION-ALLOCATION SECTION .startData
.startData 14
14 RR 0x1925
0x1925 0x1932
0x1932 ROM
ROM
.text
.text 18
18 RR 0x1933
0x1933 0x1944
0x1944 ROM
ROM
Lists those segments for which at least one .copy 22 RR 0x1945 0x1946 ROM
.copy 0x1945 0x1946 ROM
object was allocated MY_ZEROPAGE
MY_ZEROPAGE 11 R/W
R/W 0x60
0x60 0x60
0x60 Z_RAM
Z_RAM
.abs_section_0
.abs_section_0 11 N/I
N/I 0x0
0x0 0x0
0x0 .absSeg0
.absSeg0
.abs_section_1
.abs_section_1 11 N/I
N/I 0x1
0x1 0x1
0x1 .absSeg1
.absSeg1
.abs_section_2
.abs_section_2 11 N/I
N/I 0x2
0x2 0x2
0x2 .absSeg2
.absSeg2
.abs_section_3
.abs_section_3 11 N/I
N/I 0x3
0x3 0x3
0x3 .absSeg3
.absSeg3
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
The Map File
.stack
.stack 256
256 R/W
R/W 0x100
0x100 0x1FF
0x1FF RAM
RAM
.vectSeg188_vect
.vectSeg188_vect 22 RR 0xFFFE
0xFFFE 0xFFFF
0xFFFF .vectSeg188
.vectSeg188
SECTION-ALLOCATION SECTION Summary: Summary
Summary of
of section
section sizes
sizes per
per section
section type:
type:
READ_ONLY = Flash READ_ONLY
READ_ONLY (R):
(R): A8
A8 (dec:
(dec: 168)
168)
READ_WRITE = RAM READ_WRITE
READ_WRITE (R/W):
(R/W): 101
101 (dec:
(dec: 257)
257)
NO_INIT = Registers NO_INIT
NO_INIT (N/I):
(N/I): CD
CD (dec:
(dec: 205)
205)
*********************************************************************************************
*********************************************************************************************
VECTOR-ALLOCATION
VECTOR-ALLOCATION SECTION
SECTION
VECTOR-ALLOCATION SECTION
Address
Address InitValue
InitValue InitFunction
InitFunction
Lists each vectors address and to where it ---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
points (ie., interrupt service routine) 0xFFFE
0xFFFE 0x191C
0x191C _Startup
_Startup
*********************************************************************************************
*********************************************************************************************
OBJECT-ALLOCATION
OBJECT-ALLOCATION SECTION
SECTION
Name
Name Module
Module Addr
Addr hSize
hSize dSize
dSize Ref
Ref Section
Section RLIB
RLIB
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
MODULE:
MODULE: --
-- main.obj
main.obj --
--
-- PROCEDURES:
PROCEDURES:
main
main 1933
1933 12
12 18
18 11 .text
.text
-- VARIABLES:
VARIABLES:
nn 60
60 11 11 22 MY_ZEROPAGE
MY_ZEROPAGE
MODULE:
MODULE: --
-- start08.obj
start08.obj --
--
-- PROCEDURES:
PROCEDURES:
OBJECT-ALLOCATION SECTION loadByte
loadByte 18A1
18A1 EE 14
14 55 .init
.init
Contains the name, address and size of every Init
Init 18AF
18AF 6D
6D 109
109 11 .init
.init
_Startup
_Startup 191C
191C 99 99 00 .init
.init
allocated object and groups them by module -- VARIABLES:
VARIABLES:
_startupData
_startupData 1925
1925 66 66 44 .startData
.startData
-- LABELS:
LABELS:
__SEG_END_SSTACK
__SEG_END_SSTACK 200
200 00 00 11
MODULE:
MODULE: --
-- mc9s08ll64.obj
mc9s08ll64.obj --
--
-- PROCEDURES:
PROCEDURES:
-- VARIABLES:
VARIABLES:
_PTAD
_PTAD 00 11 11 00 .abs_section_0
.abs_section_0
_PTADD
_PTADD 11 11 11 00 .abs_section_1
.abs_section_1
_PTBD
_PTBD 22 11 11 00 .abs_section_2
.abs_section_2
_PTBDD
_PTBDD 33 11 11 00 .abs_section_3
.abs_section_3
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
The Map File
UNUSED-OBJECTS SECTION: *********************************************************************************************
*********************************************************************************************
Shows all of the variables declared but not used UNUSED-OBJECTS
UNUSED-OBJECTS SECTION
SECTION
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
after the optimizer did its job
*********************************************************************************************
*********************************************************************************************
COPYDOWN
COPYDOWN SECTION
SECTION
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
COPYDOWN SECTION -------
------- ROM-ADDRESS:
ROM-ADDRESS: 0x1945
0x1945 ----
---- SIZE
SIZE 22 ---
---
Lists each pre-initialized variable and its value Filling
Filling bytes
bytes inserted
inserted
0000
0000
*********************************************************************************************
*********************************************************************************************
OBJECT-DEPENDENCIES
OBJECT-DEPENDENCIES SECTION
SECTION
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
OBJECT-DEPENDENCIES SECTION Init
Init USES
USES _startupData
_startupData loadByte
loadByte
Lists for every function and variable that uses _Startup
_Startup USES
USES __SEG_END_SSTACK
__SEG_END_SSTACK Init
Init main
main
other global objects the names of these global main
main USES
USES _PTCD
_PTCD _PTCDD
_PTCDD _SRS
_SRS nn
objects *********************************************************************************************
*********************************************************************************************
DEPENDENCY
DEPENDENCY TREE
TREE
*********************************************************************************************
*********************************************************************************************
main
main and
and _Startup
_Startup Group
Group
||
DEPENDENCY TREE +-
+- main
main
Using a tree format, shows all detected ||
dependencies between functions. Overlapping +-
+- _Startup
_Startup
local variables are also displayed at their ||
+-
+- Init
Init
defining function || ||
|| +-
+- loadByte
loadByte
||
+-
+- main
main (see
(see above)
above)
*********************************************************************************************
*********************************************************************************************
STATISTIC
STATISTIC SECTION
SECTION
STATISTICS SECTION ---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
Delivers information like the number of bytes of ExeFile:
ExeFile:
code in the application Number
Number of
of blocks
blocks to
to be
be downloaded:
downloaded: 44
Total
Total size
size of
of all
all blocks
blocks to
to be
be downloaded:
downloaded: 168
168
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Configuring the Map File
The information displayed in the Map File can be configured by adding a MAPFILE
in the .prm file. Only the modules listed will be displayed. For example:
ALL Generates a map file containing all available information NONE Generates no map file
Writes information about the initialization value for objects Shows the allocation of overlapped variables
COPYDOWN DEPENDENCY_TREE
allocated in RAM (COPYDOWN section) (DEPENDENCY TREE section)
Includes information about the files building the application Includes information about the sections used in the
FILE SEC_ALLOC
(FILE section) application (SECTION ALLOCATION section)
Includes information about the allocated objects (OBJECT Includes information about the startup structure (STARTUP
OBJ_ALLOC STARTUP_STRUCT
ALLOCATION section) section)
Generates a list of all allocated objects, sorted by address Includes information about how much ROM/RAM specific
SORTED_OBJECT_LIST MODULE_STATISTIC
(OBJECT LIST SORTED BY ADDRESS section) modules (compilation units) use
Includes a list of all unused objects (UNUSED OBJECTS Includes statistic information about the link session
OBJ_UNUSED STATISTIC
section) (STATISTICS section)
Includes a list of dependencies between the objects in the Includes information about the target processor and
OBJ_DEP TARGET
application (OBJECT DEPENDENCY section) memory model (TARGET section)
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Lab1
byte
byte n;
n;
byte
byte var;
var;
void
void main(void)
main(void)
{{
EnableInterrupts;
EnableInterrupts;
//
// initialize
initialize LEDs
LEDs
PTCD
PTCD == 0xFF;
0xFF; //
// set
set default
default value
value for
for Port
Port CC
PTCDD
PTCDD == 0b00111100;
0b00111100; //
// set
set LED
LED port
port pins
pins as outputs
as outputs
for
for (;;)
(;;)
{{
__RESET_WATCHDOG();
__RESET_WATCHDOG(); /*
/* feeds
feeds the
the dog
dog */
*/
for
for (n=0;;n++)
(n=0;;n++)
{{
PTCD++;
PTCD++; //
// blink
blink LEDs
LEDs
var++;
var++;
}}
}} /*
/* loop
loop forever
forever */
*/
/*
/* please
please make
make sure
sure that
that you
you never
never leave
leave main
main */
*/
}}
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Lab1
#pragma
#pragma DATA_SEG
DATA_SEG MY_ZEROPAGE
MY_ZEROPAGE
byte
byte near n;
near n;
#pragma
#pragma DATA_SEG
DATA_SEG DEFAULT_RAM
DEFAULT_RAM
byte
byte far var
far var == 7;
7;
void
void main(void)
main(void)
{{
EnableInterrupts;
EnableInterrupts;
//
// initialize
initialize LEDs
LEDs
PTCD
PTCD == 0xFF;
0xFF; //
// set
set default
default value
value for
for Port
Port CC
PTCDD
PTCDD == 0b00111100;
0b00111100; //
// set
set LED
LED port
port pins
pins as outputs
as outputs
for
for (;;)
(;;)
{{
__RESET_WATCHDOG();
__RESET_WATCHDOG(); /*
/* feeds
feeds the
the dog
dog */
*/
for
for (n=0;;n++)
(n=0;;n++)
{{
PTCD++;
PTCD++; //
// blink
blink LEDs
LEDs
var++;
var++;
}}
}} /*
/* loop
loop forever
forever */
*/
/*
/* please
please make
make sure
sure that
that you
you never
never leave
leave main
main */
*/
}}
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Start08.c Startup Routine
INIT_SP_FROM_STARTUP_DESC(); // initialize SP
__asm jmp main; // jump into main()
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
DHJK 03-Feb-05
Variable Data Types
C for Embedded Systems Programming
TM
Variables
The type of a variable determines what kinds of values it may take on.
In other words, selecting a type for a variable is closely connected to the
way(s) we'll be using that variable.
There are only a few basic data types in C:
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
CodeWarrior Data Types
TheANSI standard does not precisely define the size of its native types,
but CodeWarrior does
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Data Type Facts
The greatest savings in code size and execution time can be made by
choosing the most appropriate data type for variables
For example, the natural data size for an 8-bit MCU is an 8-bit variable
In 16-bit and 32-bit architectures it is possible to have ways to address either 8- or 16-bits
data efficiently but it is also possible that they are not addressed efficiently
Simple concepts like choosing the right data type or memory alignment can result into big
improvements
Double precision and floating point should be avoided wherever efficiency is important
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Data Type Selection
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Data Type Selection
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Data Type Naming Conventions
Basic CodeWarrior Stationary: Processor Expert CodeWarrior Stationary: Another Popular Technique:
/* Types definition */ #ifndef __PE_Types_H typedef unsigned char __uint8__;
typedef unsigned char byte; #define __PE_Types_H typedef unsigned char __byte__;
typedef unsigned int word; typedef signed char __int8__;
typedef unsigned long dword; /* Types definition */ typedef unsigned short __uint16__;
typedef unsigned long dlong[2]; typedef unsigned char bool; typedef signed short __int16__;
typedef unsigned char byte; typedef unsigned long __uint32__;
typedef unsigned int word; typedef signed long __int32__;
typedef unsigned long dword;
typedef unsigned long dlong[2];
// other stuff
#endif /* __PE_Types_H */
Recall:
C retains the basic philosophy that programmers know what they are doing
C only requires that they state their intentions explicitly
C provides a lot of flexibility; this can be good or bad
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Memory Alignment
8 8
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Variable Types
Global
Global storage and global scope
Static
Global storage and local scope
Local
Local storage and local scope
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Storage Class Modifiers
static
volatile
const
These three key words, together, allow us to write not only better code,
but also tighter and more reliable code
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
42
Static Variables
A variable declared static within the body of a function maintains its value between
function invocations
A variable declared static within a module, but outside the body of a function, is
accessible by all functions within that module
Note that static variables are stored globally, and not on the stack
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
43
Static Variable Example
FILE1.c FILE2.c
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
44
Static Functions
Features:
Good structured programming practice
Can result in smaller and/or faster code
Advantages:
Since the compiler knows at compile time exactly what functions can call a
given static function, it may strategically place the static function such that it
may be called using a short version of the call or jump instruction
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
45
Static Functions An Example
stuff.c
main.c stuff.c
// Local prototypes =================
//
static byte InternalFunction1 (byte);
static byte InternalFunction2 (byte);
static byte InternalFunction1 (byte)
// External functions ===============
{
//do_something;
byte ExternalFunction (byte)
}
extern byte ExternalFunction (byte); {
InternalFunction1(param1);
InternalFunction2(param2);
static byte InternalFunction2 (byte)
void main (void)
{ return_something;
{ } do_something_else;
byte n;
}
// Local functions ==================
n = ExternalFunction (byte); //
} static byte InternalFunction1
byte ExternalFunction (byte) (byte)
{
{
do_something;
InternalFunction1(param1);
} InternalFunction2(param2);
return_something;
static
} byte InternalFunction2 (byte)
{
do_something_else;
}
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
46
Volatile Variables
A volatile variable is one whose value may be change outside the normal
program flow
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
47
CodeWarrior Declaration for PORT A Data Register
/*** PTAD - Port A Data Register; 0x00000000 ***/
typedef union {
byte Byte;
struct {
byte PTAD0 :1; /* Port A Data Register Bit 0 */
byte PTAD1 :1; /* Port A Data Register Bit 1 */
byte PTAD2 :1; /* Port A Data Register Bit 2 */
byte PTAD3 :1; /* Port A Data Register Bit 3 */
byte PTAD4 :1; /* Port A Data Register Bit 4 */
byte PTAD5 :1; /* Port A Data Register Bit 5 */
byte PTAD6 :1; /* Port A Data Register Bit 6 */
byte PTAD7 :1; /* Port A Data Register Bit 7 */
} Bits;
} PTADSTR;
extern volatile PTADSTR _PTAD @0x00000000;
#define PTAD _PTAD.Byte
#define PTAD_PTAD0 _PTAD.Bits.PTAD0
#define PTAD_PTAD1 _PTAD.Bits.PTAD1
#define PTAD_PTAD2 _PTAD.Bits.PTAD2
#define PTAD_PTAD3 _PTAD.Bits.PTAD3
#define PTAD_PTAD4 _PTAD.Bits.PTAD4
#define PTAD_PTAD5 _PTAD.Bits.PTAD5
#define PTAD_PTAD6 _PTAD.Bits.PTAD6
#define PTAD_PTAD7 _PTAD.Bits.PTAD7
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Volatile Variables are Never Optimized
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
49
Const Variables
It is safe to assume that a parameter along with the keyword const means
a read-only parameter.
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
50
Keyword Const
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
51
Lab2
#pragma
#pragma DATA_SEG
DATA_SEG MY_ZEROPAGE
MY_ZEROPAGE
byte
byte near n;
near n;
#pragma
#pragma DATA_SEG
DATA_SEG DEFAULT_RAM
DEFAULT_RAM
byte
byte far var
far var == 7;
7;
void
void main(void)
main(void)
{{
EnableInterrupts;
EnableInterrupts;
//
// initialize
initialize LEDs
LEDs
PTCD
PTCD == 0xFF;
0xFF; //
// set
set default
default value
value for
for Port
Port CC
PTCDD
PTCDD == 0b00111100;
0b00111100; //
// set
set LED
LED port
port pins
pins as outputs
as outputs
for
for (;;)
(;;)
{{
__RESET_WATCHDOG();
__RESET_WATCHDOG(); /*
/* feeds
feeds the
the dog
dog */
*/
for
for (n=0;;n++)
(n=0;;n++)
{{
PTCD++;
PTCD++; //
// blink
blink LEDs
LEDs
var++;
var++;
}}
}} /*
/* loop
loop forever
forever */
*/
/*
/* please
please make
make sure
sure that
that you
you never
never leave
leave main
main */
*/
}}
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Lab2
#pragma
#pragma DATA_SEG
DATA_SEG DEFAULT_RAM
DEFAULT_RAM
byte
byte far var;
far var;
void
void main(void)
main(void)
{{
#pragma
#pragma DATA_SEG
DATA_SEG MY_ZEROPAGE
MY_ZEROPAGE
static
static byte
byte near
near n;
n;
EnableInterrupts;
EnableInterrupts;
//
// initialize
initialize LEDs
LEDs
PTCD
PTCD == 0xFF;
0xFF; //
// set
set default
default value
value for
for Port
Port CC
PTCDD
PTCDD == 0b00111100;
0b00111100; //
// set
set LED
LED port
port pins
pins as outputs
as outputs
for
for (;;)
(;;)
{{
__RESET_WATCHDOG();
__RESET_WATCHDOG(); /*
/* feeds
feeds the
the dog
dog */
*/
for
for (n=0;;n++)
(n=0;;n++)
{{
PTCD++;
PTCD++; //
// blink
blink LEDs
LEDs
var++;
var++;
}}
}} /*
/* loop
loop forever
forever */
*/
/*
/* please
please make
make sure
sure that
that you
you never
never leave
leave main
main */
*/
}}
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Very Basic Software Flow
Reset
Subroutine_1() Interrupt_Service_Routine_1()
Subroutine_2()
Interrupt_Service_Routine_2()
Subroutine_3()
Interrupt_Service_Routine_3()
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
DHJK 03-Feb-05
Project Software Architecture
C for Embedded Systems Programming
TM
Project Software Architecture
Application Project 1
main.c
Translation
Foundation
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
DHJK 03-Feb-05
Project Software Architecture
main.c main.c
Translation
Foundation
Files that are consistent Peripheral Linker ANSI C Replace Peripheral Linker ANSI C
with MCU documentation Definitions Parameters Libraries Definitions Parameters Libraries
and typically need
no modification by the user
mcu.h target.prm ansixx.lib mcu.h target.prm ansixx.lib
Start08.c Start12.c
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
DHJK 03-Feb-05
Modular File Organization
main.c system.h
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Example system.h
/***********************************************************************************************\
/***********************************************************************************************\
** Project
Project Name
Name
\***********************************************************************************************/
\***********************************************************************************************/
system.h #ifndef
#ifndef _SYSTEM_H_
_SYSTEM_H_
#define
#define _SYSTEM_H_
_SYSTEM_H_
#include
#include <hidef.h>
<hidef.h> /*
/* for
for EnableInterrupts
EnableInterrupts macro
macro */
*/
#include
#include "derivative.h"
"derivative.h" /*
/* include
include peripheral
peripheral declarations
declarations */
*/
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public type
type definitions
definitions
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************
/***********************************************************************************************
**
**
**
** Variable
Variable type
type definition:
definition: BIT_FIELD
BIT_FIELD
*/
*/
typedef union
typedef union
{{
byte
byte Byte;
Byte;
struct
struct {{
byte
byte _0
_0 :1;
:1;
byte
byte _1
_1 :1;
:1;
byte _2
byte _2 :1;
:1;
byte _3
byte _3 :1;
:1;
byte _4
byte _4 :1;
:1;
byte _5
byte _5 :1;
:1;
byte _6
byte _6 :1;
:1;
byte _7
byte _7 :1;
:1;
}} Bit;
Bit;
}} BIT_FIELD;
BIT_FIELD;
/***********************************************************************************************
/***********************************************************************************************
**
**
**
** Variable
Variable type
type definition:
definition: tword
tword
*/
*/
typedef
typedef union
union
{{
unsigned
unsigned short
short Word;
Word;
struct
struct
{{
byte
byte hi;
hi;
byte
byte lo;
lo;
}} Byte;
Byte;
}} tword;
tword;
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Example system.h
/***********************************************************************************************\
/***********************************************************************************************\
** Project
Project includes
includes
\***********************************************************************************************/
\***********************************************************************************************/
system.h #include
#include "mma845x.h"
"mma845x.h" //
// MMA845xQ
MMA845xQ macros
macros
#include
#include "iic.h"
"iic.h" //
// IIC
IIC macros
macros
#include
#include "sci.h"
"sci.h" //
// SCI
SCI macros
macros
#include
#include "spi.h"
"spi.h" //
// SPI
SPI macros
macros
#include
#include "terminal.h"
"terminal.h" //
// Terminal
Terminal interface
interface macros
macros
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public macros
macros
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************
/***********************************************************************************************
**
**
**
** General
General System
System Control
Control
**
**
** 0x1802 SOPT1
** 0x1802 SOPT1 System
System Options
Options Register
Register 11
**
** 0x1803
0x1803 SOPT2
SOPT2 System
System Options
Options Register
Register 22
**
** 0x1808
0x1808 SPMSC1
SPMSC1 System
System Power
Power Management
Management Status
Status and
and Control
Control 11 Register
Register
**
** 0x1809
0x1809 SPMSC2
SPMSC2 System
System Power
Power Management
Management Status
Status and
and Control
Control 22 Register
Register
** 0x180B SPMSC3
** 0x180B SPMSC3 System Power Management Status and Control 3 Register
System Power Management Status and Control 3 Register
** 0x180E SCGC1
** 0x180E SCGC1 System Clock Gating Control 1 Register
System Clock Gating Control 1 Register
**
** 0x180F
0x180F SCGC2
SCGC2 System
System Clock
Clock Gating
Gating Control
Control 22 Register
Register
** 0x000F IRQSC
** 0x000F IRQSC Interrupt
Interrupt Pin
Pin Request
Request Status
Status and
and Control
Control Register
Register
*/
*/
#define
#define init_SOPT1
init_SOPT1 0b01000010
0b01000010
/*
/* 1100001U
1100001U == reset
reset
**
** |||xxx||
|||xxx||
**
** |||
||| |+--
|+-- RSTPE
RSTPE =0
=0 :: RESET
RESET pin
pin function
function disabled
disabled
**
** |||
||| +---
+--- BKGDPE
BKGDPE =1
=1 :: Background
Background Debug
Debug pin
pin enabled
enabled
**
** ||+-------
||+------- STOPE
STOPE =0
=0 :: Stop
Stop Mode
Mode disabled
disabled
**
** |+--------
|+-------- COPT
COPT =1
=1 :: Long
Long COP
COP timeout
timeout period
period selected
selected
**
** +---------
+--------- COPE
COPE =0
=0 :: COP
COP Watchdog
Watchdog timer
timer disabled
disabled
*/
*/
#define
#define init_SOPT2
init_SOPT2 0b00000010
0b00000010
/*
/* 00000000
00000000 == reset
reset
**
** |x||x|||
|x||x|||
**
** || ||
|| ||+--
||+-- ACIC1
ACIC1 =0
=0 :: ACMP1
ACMP1 output
output not
not connected
connected to
to TPM1CH0
TPM1CH0 input
input
**
** || ||
|| |+---
|+--- IICPS
IICPS =1
=1 :: SDA
SDA on
on PTB6;
PTB6; SCL
SCL on
on PTB7
PTB7
**
** || ||
|| +----
+---- ACIC2
ACIC2 =0
=0 :: ACMP2
ACMP2 output
output not
not connected
connected to
to TPM2CH0
TPM2CH0 input
input
**
** || |+------
|+------ TPM1CH2PS
TPM1CH2PS =0
=0 :: TPM1CH2
TPM1CH2 on
on PTA6
PTA6
**
** || +-------
+------- TPM2CH2PS
TPM2CH2PS =0
=0 :: TPM2CH2
TPM2CH2 on
on PTA7
PTA7
**
** +---------
+--------- COPCLKS
COPCLKS =0
=0 :: COP
COP clock
clock source
source is
is internal
internal 1kHz
1kHz reference
reference
*/
*/
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Example system.h
/***********************************************************************************************
/***********************************************************************************************
**
**
**
** Port
Port I/O
I/O
system.h **
**
**
** 0x0000
0x0000 PTAD
PTAD Port
Port AA Data
Data Register
Register
**
** 0x0001
0x0001 PTADD
PTADD Port
Port AA Data
Data Direction
Direction Register
Register
**
** 0x0002
0x0002 PTBD
PTBD Port
Port BB Data
Data Register
Register
**
** 0x0003
0x0003 PTBDD
PTBDD Port
Port BB Data
Data Direction
Direction Register
Register
**
** 0x0004
0x0004 PTCD
PTCD Port
Port CC Data
Data Register
Register
**
** 0x0005
0x0005 PTCDD
PTCDD Port
Port CC Data
Data Direction
Direction Register
Register
**
** 0x0006
0x0006 PTDD
PTDD Port
Port DD Data
Data Register
Register
**
** 0x0007
0x0007 PTDDD
PTDDD Port
Port DD Data
Data Direction
Direction Register
Register
**
** 0x1840
0x1840 PTAPE
PTAPE Port
Port AA Pull
Pull Enable
Enable Register
Register
**
** 0x1841
0x1841 PTASE
PTASE Port
Port AA Slew
Slew Rate
Rate Enable
Enable Register
Register
**
** 0x1842
0x1842 PTADS
PTADS Port
Port AA Drive
Drive Strength
Strength Selection
Selection Register
Register
**
** 0x1844
0x1844 PTBPE
PTBPE Port
Port BB Pull
Pull Enable
Enable Register
Register
** 0x1845 PTBSE
** 0x1845 PTBSE Port B Slew Rate Enable Register
Port B Slew Rate Enable Register
**
** 0x1846
0x1846 PTBDS
PTBDS Port
Port BB Drive
Drive Strength
Strength Selection
Selection Register
Register
** 0x1848 PTCPE
** 0x1848 PTCPE Port
Port CC Pull
Pull Enable
Enable Register
Register
** 0x1849 PTCSE
** 0x1849 PTCSE Port C Slew Rate Enable Register
Port C Slew Rate Enable Register
**
** 0x184A
0x184A PTCDS
PTCDS Port
Port CC Drive
Drive Strength
Strength Selection
Selection Register
Register
*/
*/
#define
#define init_PTAD
init_PTAD 0b10000000
0b10000000
//
// 00000000
00000000 == reset
reset
#define
#define init_PTADD
init_PTADD 0b10000000
0b10000000
//
// 00000000
00000000 == reset
reset
#define
#define init_PTAPE
init_PTAPE 0b00000110
0b00000110
//
// 00000000
00000000 == reset
reset
#define
#define init_PTASE
init_PTASE 0b00000000
0b00000000
//
// 00000000
00000000 == reset
reset
#define
#define init_PTADS
init_PTADS 0b00000000
0b00000000
//
// 00000000
00000000 == reset
reset
/*
/* ||||||||
||||||||
**
** |||||||+--
|||||||+-- X_OUT
X_OUT
**
** ||||||+---
||||||+--- Y_OUT
Y_OUT -- MMA845x
MMA845x INT1
INT1
**
** |||||+----
|||||+---- Z_OUT
Z_OUT -- MMA845x
MMA845x INT2
INT2
**
** ||||+-----
||||+----- DIS_MCU
DIS_MCU
**
** |||+------
|||+------ BKGD
BKGD
**
** ||+-------
||+------- RESET
RESET
**
** |+--------
|+-------- EXTRA_AD
EXTRA_AD
**
** +---------
+--------- LEDB_BB
LEDB_BB -- Blue
Blue LED
LED cathode
cathode
*/
*/
#define
#define INT1_IS_ACTIVE
INT1_IS_ACTIVE (PTAD_PTAD1
(PTAD_PTAD1 ==
== 0)
0)
#define
#define LED_BlueOn
LED_BlueOn (PTAD_PTAD7
(PTAD_PTAD7 == 0)
0)
#define
#define LED_BlueOff
LED_BlueOff (PTAD_PTAD7
(PTAD_PTAD7 == 1)
1)
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Example system.h
#define
#define init_PTCD
init_PTCD 0b10111011
0b10111011
//
// 00000000
00000000 == reset
reset
#define
#define init_PTCDD
init_PTCDD 0b10110111
0b10110111
system.h //
// 00000000
00000000 == reset
reset
#define
#define init_PTCPE
init_PTCPE 0b01000000
0b01000000
//
// 00000000
00000000 == reset
reset
#define
#define init_PTCSE
init_PTCSE 0b00000000
0b00000000
//
// 00000000
00000000 == reset
reset
#define
#define init_PTCDS
init_PTCDS 0b00000000
0b00000000
//
// 00000000
00000000 == reset
reset
/*
/* ||||||||
||||||||
**
** |||||||+--
|||||||+-- LEDG_BB
LEDG_BB -- Green
Green LED
LED cathode
cathode
**
** ||||||+---
||||||+--- SLEEP
SLEEP -- MMA845x
MMA845x CS
CS
**
** |||||+----
|||||+---- G_SEL_2
G_SEL_2 -- MMA845x
MMA845x SA0
SA0
**
** ||||+-----
||||+----- G_SEL_1
G_SEL_1
**
** |||+------
|||+------ LEDR_BB
LEDR_BB -- Red
Red LED
LED cathode
cathode
**
** ||+-------
||+------- BUZZER_BB
BUZZER_BB
**
** |+--------
|+-------- PUSH_BUTTON
PUSH_BUTTON
**
** +---------
+--------- LED_OB
LED_OB -- Yellow
Yellow LED
LED cathode
cathode
*/
*/
#define
#define LED_GreenOn
LED_GreenOn (PTCD_PTCD0
(PTCD_PTCD0 == 0)
0)
#define
#define LED_GreenOff
LED_GreenOff (PTCD_PTCD0
(PTCD_PTCD0 == 1)
1)
#define
#define SENSOR_SHUTDOWN
SENSOR_SHUTDOWN (PTCD_PTCD1
(PTCD_PTCD1 == 0)
0)
#define
#define SENSOR_ACTIVE
SENSOR_ACTIVE (PTCD_PTCD1
(PTCD_PTCD1 == 1)
1)
#define
#define LED_RedOn
LED_RedOn (PTCD_PTCD4
(PTCD_PTCD4 == 0)
0)
#define
#define LED_RedOff
LED_RedOff (PTCD_PTCD4
(PTCD_PTCD4 == 1)
1)
#define
#define LED_YellowOn
LED_YellowOn (PTCD_PTCD7
(PTCD_PTCD7 == 0)
0)
#define
#define LED_YellowOff
LED_YellowOff (PTCD_PTCD7
(PTCD_PTCD7 == 1)
1)
#define
#define SA0_PIN
SA0_PIN (PTCD_PTCD2)
(PTCD_PTCD2)
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public memory
memory declarations
declarations
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public prototypes
prototypes
\***********************************************************************************************/
\***********************************************************************************************/
#endif
#endif /*
/* _SYSTEM_H_
_SYSTEM_H_ */
*/
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Example sci.h
/***********************************************************************************************\
/***********************************************************************************************\
** Project
Project name
name
**
sci.h ** Filename:
Filename: sci.h
sci.h
**
\***********************************************************************************************/
\***********************************************************************************************/
#ifndef
#ifndef _SCI_H_
_SCI_H_
#define
#define _SCI_H_
_SCI_H_
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public macros
macros
\***********************************************************************************************/
\***********************************************************************************************/
#define
#define BUFFER_RX_SIZE
BUFFER_RX_SIZE 10
10
#define
#define BUFFER_TX_SIZE
BUFFER_TX_SIZE 200
200
/***********************************************************************************************
/***********************************************************************************************
**
**
**
** Serial
Serial Communications
Communications Interface
Interface (SCI)
(SCI)
**
**
** 0x0020 SCIBDH
** 0x0020 SCIBDH SCI
SCI Baud Rate Register High
Baud Rate Register High
**
** 0x0021
0x0021 SCIBDL
SCIBDL SCI
SCI Baud
Baud Rate
Rate Register
Register Low
Low
** 0x0022 SCIC1
** 0x0022 SCIC1 SCI Control Register
SCI Control Register 1 1
** 0x0023 SCIC2
** 0x0023 SCIC2 SCI Control Register
SCI Control Register 2 2
**
** 0x0024
0x0024 SCIS1
SCIS1 SCI
SCI Status
Status Register
Register 11
** 0x0025 SCIS2
** 0x0025 SCIS2 SCI
SCI Status
Status Register
Register 22
**
** 0x0026
0x0026 SCIC3
SCIC3 SCI
SCI Control
Control Register
Register 33
**
** 0x0027
0x0027 SCID
SCID SCI
SCI Data
Data Register
Register
**
**
**
** SCI
SCI target
target baudrate
baudrate == 115.2k
115.2k
**
** MCU
MCU bus
bus frequency
frequency == 9.216MHz
9.216MHz
**
**
**
** SCI
SCI Baud
Baud Rate
Rate Register
Register == 55
**
**
**
** SCI
SCI baudrate
baudrate == bus
bus // (16
(16 ** BR)
BR)
**
** == 9.216MHz
9.216MHz // (16
(16 ** 5)
5)
**
** == 115.2k
115.2k
*/
*/
#define
#define init_SCIBDH
init_SCIBDH 0x00
0x00
#define
#define init_SCIBDL
init_SCIBDL 0x05
0x05
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Example sci.h
#define
#define ASCII_BS
ASCII_BS 0x08
0x08
#define
#define ASCII_LF
ASCII_LF 0x0A
0x0A
sci.h #define
#define ASCII_CR
ASCII_CR 0x0D
0x0D
#define
#define ASCII_DEL
ASCII_DEL 0x7F
0x7F
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public type
type definitions
definitions
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public memory
memory declarations
declarations
\***********************************************************************************************/
\***********************************************************************************************/
#pragma
#pragma DATA_SEG
DATA_SEG MY_ZEROPAGE
MY_ZEROPAGE
extern
extern byte
byte BufferRx[BUFFER_RX_SIZE];
BufferRx[BUFFER_RX_SIZE];
#pragma
#pragma DATA_SEG
DATA_SEG DEFAULT
DEFAULT
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public prototypes
prototypes
\***********************************************************************************************/
\***********************************************************************************************/
void
void SCIControlInit
SCIControlInit (void);
(void);
void
void SCISendString
SCISendString (byte
(byte *pStr);
*pStr);
void
void SCI_CharOut(byte
SCI_CharOut(byte data);
data);
void
void SCI_NibbOut(byte data);
SCI_NibbOut(byte data);
void
void SCI_ByteOut(byte
SCI_ByteOut(byte data);
data);
void
void SCI_putCRLF
SCI_putCRLF (void);
(void);
byte
byte SCI_CharIn(void);
SCI_CharIn(void);
byte
byte SCI_ByteIn(void);
SCI_ByteIn(void);
void
void SCI_s12dec_Out
SCI_s12dec_Out (tword
(tword data);
data);
void
void SCI_s8dec_Out(tword
SCI_s8dec_Out(tword data);
data);
void
void SCI_s12int_Out
SCI_s12int_Out (tword
(tword data);
data);
void
void SCI_s12frac_Out
SCI_s12frac_Out (tword
(tword data);
data);
byte
byte isnum
isnum (byte
(byte data);
data);
byte
byte ishex
ishex (byte
(byte data);
data);
byte
byte tohex
tohex (byte
(byte data);
data);
void
void hex2ASCII
hex2ASCII (byte
(byte data,
data, byte*
byte* ptr);
ptr);
#endif
#endif /*
/* _SCI_H_
_SCI_H_ */
*/
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Example terminal.h
/***********************************************************************************************\
/***********************************************************************************************\
** Project
Project Name
Name
**
terminal.h ** Filename:
Filename: terminal.h
terminal.h
**
\***********************************************************************************************/
\***********************************************************************************************/
#ifndef
#ifndef _TERMINAL_H_
_TERMINAL_H_
#define
#define _TERMINAL_H_
_TERMINAL_H_
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public macros
macros
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public type
type definitions
definitions
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public memory
memory declarations
declarations
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public prototypes
prototypes
\***********************************************************************************************/
\***********************************************************************************************/
void
void TerminalInit
TerminalInit (void);
(void);
void
void ProcessTerminal
ProcessTerminal (void);
(void);
void
void OutputTerminal
OutputTerminal (byte
(byte BlockID,
BlockID, byte
byte *ptr);
*ptr);
#endif
#endif /*
/* _TERMINAL_H_
_TERMINAL_H_ */
*/
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
Example terminal.c
/***********************************************************************************************\
/***********************************************************************************************\
** Project
Project Name
Name
**
terminal.c ** Filename:
Filename: terminal.c
terminal.c
**
\***********************************************************************************************/
\***********************************************************************************************/
#include
#include "system.h"
"system.h"
/***********************************************************************************************\
/***********************************************************************************************\
** Private
Private macros
macros
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Private
Private type
type definitions
definitions
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Private
Private prototypes
prototypes
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Private
Private memory
memory declarations
declarations
\***********************************************************************************************/
\***********************************************************************************************/
#pragma
#pragma DATA_SEG
DATA_SEG MY_ZEROPAGE
MY_ZEROPAGE
#pragma
#pragma DATA_SEG
DATA_SEG DEFAULT_RAM
DEFAULT_RAM
/***********************************************************************************************\
/***********************************************************************************************\
** Public
Public functions
functions
\***********************************************************************************************/
\***********************************************************************************************/
/***********************************************************************************************\
/***********************************************************************************************\
** Private
Private functions
functions
\***********************************************************************************************/
\***********************************************************************************************/
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective TM
owners. Freescale Semiconductor, Inc. 2010.
TM