Motorola / Blackfin Bicycle interface Part 1

Developing a bicycle speed-o-meter
A comparison between
the Analog Devices
ADSP-BF533 (Blackfin)
and Motorola MC68332
General Project concept
Magnetic Sensor Signal
High speed clock signal
2
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Blackfin
Programmable
Flag (PF) Input
Motorola
Parallel
Interface
Timer (PIT)
Input
Main function concept
ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency)
#define ulong unsigned long int;
extern “C” ulong CountClockASM(const int);
// Assembly code interface
extern “C” ulong CalculateSpeedASM(ulong, ulong, ulong);
extern “C” void SetupInterface(void);
ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency) {
// Get to known position on magnetic sensor signal
unsigned long discard_count;
unsigned long count_high, count_low;
SetupInterface( );
discard_count = CountClockASM(while_MagneticSensorHigh);
discard_count = CountClockASM(while_MagneticSensorLow);
3
count_high = CountClockASM(while_MagneticSensorHigh);
count_low = CountClockASM(while_MagneticSensorLow);
return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency);
}
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Required Assembly Language
extern “C” ulong CountClockASM(const int);
// Assembly code interface
extern “C” void SetupInterface(void);
extern “C” ulong CalculateSpeedASM(ulong, ulong, ulong);
ulong CountClockASM(const int high_low) {
ulong clock_count = 0;
while (magnetic_sensor = = high_low) { // if signal is unchanged from start
// Must count just one clock signal low-to-high transition
while (clock_signal = = high) /* wait */;
while (clock_signal = = low) /* wait */; // Changes on low-to-high edge
clock_count++;
}
return clock_count;
}
4
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
What we need to know







5
How can you pass parameters between “C/C++” and assembly
code functions?
How can you return a parameter from assembly code
functions?
What registers are available on the processor?
How do you set up the interface between the processor and the
real world
Many signals are coming into processor, how do you separate
(mask off) the signals you want from those you don’t?
What are the basic operations for accessing memory?
What are the basic ALU operations for this processor?
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Some characteristics of the processor
Data Bus
Instruction Bus
Address bus
6
4/13/2015
Motorola
Blackfin
16 bits
32 bits
This is the “data” bus
24-bits
Accessing “slow”
external memory
64-bits
Can fetch “data” on
one bus and
“instructions” on
another bus at the
same time
32 bits
Has both “fast” internal
memory and “slower”
external memory
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Programming model
MC68332
Blackfin
Data Registers
D0, D1 …. D7
R0, R1 …. R7
Address Registers
A0, A1 …. A6
P0, P1 … P5
Pointer Registers
Frame Buffer
Use A4 or A6
FP
Stack Pointer
SP (A7)
SP
Special DSP
7
4/13/2015
I0-I3, B0-B3, M0-M3, L0-L3
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Syntax examples
MC68332
Blackfin
Register to Register Move MOVE.L D2, D1
reg1  reg 2
(4 cycles @ 8 MHz)
32 bit operations
R1 = R2;
(1 cycle @ 500 MHz)
Register to Register Move MOVE.W D2, D1
reg1  reg 2
16 bit operations
R1.L = R2.L; and also
R1.H = R2.L;
Register to Register Move MOVE.B D2, D1
reg1  reg 2
8 bit operations
MOVE.B D2, D1
EXT.B D1;
(8 cycle @ 8 MHz)
8
4/13/2015
R1 = R2.B (X);
(1 cycle @ 500 MHz)
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Syntax examples
9
MC68332
Blackfin
Register to Register ADD
reg1  reg 2 + reg3
32 bit operations
MOVE.L D2, D1
ADD.L D3, D1
(10 cycles @ 8 MHz)
R1 = R2 + R3;
(1 cycle @ 500 MHz)
Register to Register Move
reg1  reg 2 + reg3
16 bit operations
MOVE.W D2, D1
ADD.W D3, D1
(8 cycles @ 8 MHz)
R1.L = R2.L + R3.L (NS);
(1 cycle @ 500 MHz)
Also R1 = R2 +|- R3;
Means R1.L = R2.L – R3.L;
and R1.H = R2.H + R3.H;
Register to Register Move
reg1  reg 2 + reg3 8 bit
operations
MOVE.B D2, D1
ADD.B D3, D1
R1.L = R2.B (X);
R0.L = R3.B (X);
R1.L = R1.L + R0.L (NS);
( > 3 cycles @ 500 MHz)
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
In class exercise

10
Do what?
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
32-bit Memory Move operations
Motorola
11
Value at memory location 1
placed at memory location 2
MOVE.L #MEM1, A0
MOVE.L #MEM2, A1
MOVE.L (A0), (A1)
36 cycles @ 8 MHz
Multiple moves
MOVE.L #MEM1, A0
MOVE.L #MEM2, A1
MOVE.L (A0)+, (A1)+
MOVE.L (A0)+, (A1)+
MOVE.L (A0)+, (A1)+
4/13/2015
Blackfin
P0.H = hi(MEM1);
P0.L = lo(MEM1);
P1.H = hi(MEM2);
P1.L = lo(MEM2);
R0 = [P0];
[P1] = R0; > 6 cycles
P0.H = hi(MEM1);
P0.L = lo(MEM1);
P1.H = hi(MEM2);
P1.L = lo(MEM2);
R0 = [P0++];
[P1++] = R0;
R0 = [P0++];
[P1++] = R0;
R0 = [P0++];
[P1++] = R0;,
Motorola Blackfin Comparison Part 1
Copyright M. Smith, ECE, University of Calgary, Canada
16-bit Memory Move operations
Motorola
12
Value at memory location 1
placed at memory location 2
MOVE.L #MEM1, A0
MOVE.L #MEM2, A1
MOVE.W (A0), (A1)
36 cycles @ 8 MHz
Multiple moves
MOVE.L #MEM1, A0
MOVE.L #MEM2, A1
MOVE.W(A0)+, (A1)+
MOVE.W(A0)+, (A1)+
MOVE.W (A0)+, (A1)+
4/13/2015
Blackfin
P0.H = hi(MEM1);
P0.L = lo(MEM1);
P1.H = hi(MEM2);
P1.L = lo(MEM2);
R0 =W [P0];
W[P1] = R0; > 6 cycles
P0.H = hi(MEM1);
P0.L = lo(MEM1);
P1.H = hi(MEM2);
P1.L = lo(MEM2);
R0 = W[P0++] (X);
W [P1++] = R0;
R0 = W[P0++] (X);
W[P1++] = R0;
R0 =W [P0++] (X);
W [P1++] = R0;
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Memory Move operations
Motorola
MOVEM.L D0-D3/A0-A5, -(SP)
Multiple moves of
registers
Combination of memory
moves and ALU
operations
Blackfin
[- - SP] = (R7:5, P5:3);
Can also do parallel read and write
operations together with math operations
Syntax looks like this
R1 = R2 | | R3 = [I0++] | | [I1++] = R4;
Not all operations can be made parallel
13
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
In class exercise

14
Do what
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
If – then – else constructs
Signed tests
Motorola
15
Blackfin
Set the condition
code register
CMP.L D0, D1
Conditional jump
BEQ NEXT_INSTR
BLT NEXT_INSTR
BLE NEXT_INSTR
(D1 == D0)
(D1 < D0)
(D1 <= D0)
IF CC JUMP NEXT_INSTR
BNE NEXT_INSTR
BGE NEXT_INSTR
BGT NEXT_INSTR
(D1 <> D0)
(D1 >= D0)
(D1 > D0)
IF !CC JUMP NEXT_INSTR
4/13/2015
CC = D1 == D0;
CC = D1 < D0;
CC = D1 <= D0;
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
If – then – else constructs
Un-signed tests
Motorola
16
Blackfin
Set the condition
code register
CMP.L D0, D1
Conditional jump
BEQ NEXT_INSTR
BLO NEXT_INSTR
BLS NEXT_INSTR
(D1 == D0)
(D1 < D0)
(D1 <= D0)
IF CC JUMP NEXT_INSTR
BNE NEXT_INSTR
BHS NEXT_INSTR
BHI NEXT_INSTR
(D1 <> D0)
(D1 >= D0)
(D1 > D0)
IF !CC JUMP NEXT_INSTR
4/13/2015
CC = D1 == D0 (UI);
CC = D1 < D0 (UI);
CC = D1 <= D0 (UI);
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Example if-then-else code
C++ example
IF (A > B) C = D;
ELSE C = E;
Motorola
Blackfin
Set A, B, C, D, E
to registers D0, D1, .. D4
Set A, B, C, D, E
to registers R0, R1, .. R4
CMP.L D1, D0
BLE ELSE
MOVE.L D3, D2
JMP END_IF
ELSE: MOVE.L D4, D2
END_IF:
CC = R1 < R0;
IF !CC JUMP ELSE;
R2 = R3;
JUMP END_IF;
ELSE: R2 = R4;
END_IF:
CC = R1 < R0;
IF CC R2 = R3;
IF !CC R2 = R4;
17
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Example loop code -- software loop
C++ example
sum = 0;
for (loop = 0; loop < 6; loop++)
sum = sum + loop;
Motorola
Set D0 = sum , D1 = loop
MOVE.L #0, D0
MOVE.L #0, D1
LOOP: CMP.L #6, D1
BGE PAST_LOOP
ADD.L D1, D0
ADD.L #1, D1
BRA LOOP
PAST_LOOP:
18
4/13/2015
Blackfin
Set R0 = sum , R1 = loop
R0 = 0;
R1 = 0;
R2 = 6;
LOOP: CC = R2 <= R1;
IF !CC JUMP PAST_LOOP;
R0 = R0 + R1;
R1 += 1;
JUMP LOOP
PAST_LOOP:
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Example loop code -- Harware loop
C++ example
sum = 0;
for (loop = 0; loop < 6; loop++)
sum = sum + loop;
Motorola
Set D0 = sum , D1 = loop
MOVE.L #0, D0
MOVE.L #0, D1
LOOP: CMP.L #6, D1
BGE PAST_LOOP
ADD.L D1, D0
ADD.L #1, D1
BRA LOOP
PAST_LOOP:
Blackfin
Set R0 = sum , R1 = loop
R0 = 0;
R1 = 0;
P1 = 6;
LSETUP(LSTART, LEND) LC1 = P1;
LSTART:
R0 = R0 + R1;
LEND:
R1 += 1;
PAST_LOOP:
Has a capability of 2 hardware (highspeed, zero overhead) loop
19
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Hardware test – wait while magnetic
signal is “high”
C++
Magnetic Signal
Motorola
Bit 1 of PADR register of Bit 10 of FIO_FLAG_D
PI/T interface
register of PF interface
MASK EQU 0x1
while
(mag_signal ==
HIGH)
/* wait */ ;
MOVE.L #PITBASE, A0
WHILE:
MOVE.B PADR(A0), D0
AND.B #MASK, D0
CMP.B #MASK, D0
BEQ WHILE
20
4/13/2015
Blackfin
#define MASK 0x400
P0.H = hi(FIO_FLAG_D);
P0.L = lo(FIO_FLAG_D);
R1 = MASK;
WHILE:
R0 = W[P0] (Z);
R0 = R0 & R1;
CC = R0 == R1;
IF CC JUMP WHILE (BP);
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Subroutine / Function calls
C++
Motorola
extern “C”
int FooASM(int, int, int)
C = FooASM(1,2,3)
.IMPORT _FooASM
FP EQU A6
LINK FP, -16
MOVE.L D4, 12(SP)
MOVE.L #1, 0(SP)
MOVE.L #2, 4(SP)
MOVE.L #3, 8(SP)
JSR _FooASM
MOVE.L D0, D4
.. Other code
MOVE.L 12(SP), D4
UNLINK
RTS
21
4/13/2015
Blackfin
.extern _FooASM
LINK 20;
[SP + 16] = R4;
R0 = 1;
R1 = 2;
R2 = 3;
CALL _FooASM;
R4 = R0;
.. Other code
R4 = [SP + 16];
UNLINK;
RTS;
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Code conventions for
subroutines / functions
Motorola -- SDS
22
Blackfin -- VisualDSP
Volatile registers
D0, D1
A0, A1
R0, R1, R2, R3
P0, P1, P2
Non-volatile registers
D2, D2, D4, D5, D6, D7
A2, A3, A4, A5, A6, A7
R4, R5, R6, R7
P3, P4, P5, FP, SP
Subroutine return value is
passed in
D0
R0
Subroutine OUTPARS
OUTPAR1  0(SP)
OUTPAR2  4(SP)
OUTPAR3  8(SP)
OUTPAR4  12(SP)
OUTPAR1  R0
OUTPAR2  R1
OUTPAR3  R2
OUTPAR4  12(SP)
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
In class exercise

23
Do what?
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada

Information taken from Analog Devices On-line Manuals
with permission
http://www.analog.com/processors/resources/technicalLibrary/manuals/

24
Information furnished by Analog Devices is believed to be accurate
and reliable. However, Analog Devices assumes no responsibility for
its use or for any infringement of any patent other rights of any third
party which may result from its use. No license is granted by
implication or otherwise under any patent or patent right of Analog
Devices. Copyright  Analog Devices, Inc. All rights reserved.
4/13/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada