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