Developing a bicycle speed-o-meter Midterm Review.

Slides:



Advertisements
Similar presentations
Microprocessor or Microcontroller Not just a case of “you say tomarto and I say tomayto” M. Smith, ECE University of Calgary, Canada.
Advertisements

Blackfin BF533 EZ-KIT Control The O in I/O Activating a FLASH memory “output line” Part 3 – New instruction recap Tutorial.
Embedded System Timers Details of independent timers build into the Blackfin Assignment 2-- Watchdog Timer can be used to prevent the OS system from locking.
Assignment Overview Thermal oscillator One of the ENCM415 Laboratory 2 items Oscillator out GND +5V.
Boot Issues Processor comparison TigerSHARC multi-processor system Blackfin single-core.
Daddy! -- Where do instructions come from? Program Sequencer controls program flow and provides the next instruction to be executed Straight line code,
The planned but unexpected Program Sequencer controls program flow and provides the next instruction to be executed Interrupt – causing and handling.
6/2/2015 Labs in ENCM415. Laboratory 2 PF control, Copyright M. Smith, ECE, University of Calgary, Canada 1 Temperature Sensor Laboratory 2 Part 2 – Developing.
Thermal arm-wrestling Design of a video game using two programmable flags (PF) interrupts Tutorial on handling 2 Hardware interrupts from an external device.
Building a simple loop using Blackfin assembly code M. Smith, Electrical and Computer Engineering, University of Calgary, Canada.
Specialized Video (8-bit) and Vector (16-bit) Instructions on the Blackfin There is always a “MAKE-UP-YOUR-QUESTION-AND-ANSWER-IT” Question on a Dr. Smith.
Developing a bicycle speed-o-meter Part 2 A comparison between the Analog Devices ADSP-BF533 (Blackfin) and Motorola MC68332.
Review of Blackfin Syntax Moves and Adds 1) What we already know and have to remember to apply 2) What we need to learn.
Microprocessor or Microcontroller Not just a case of “you say tomarto and I say tomayto” M. Smith, ECE University of Calgary, Canada.
Core Timer Code Development How you could have done the Take- Home Quiz using a test driven development (TDD) approach.
Specialized Video (8-bit) and Vector (16-bit) Instructions on the Blackfin Expand on these ideas for Q9 question and answer on the final.
LCD programming Design and implementation details on the way to a valid SPI-LCD interface driver.
A look at interrupts What are interrupts and why are they needed in an embedded system? Equally as important – how are these ideas handled on the Blackfin.
Developing a bicycle speed-o-meter A comparison between the Analog Devices ADSP-BF533 (Blackfin) and Motorola MC68332.
Timers and Timing Signals Tutorial. 6/18/2015 Timer Control Copyright M. Smith, ECE, University of Calgary, Canada 2 / 31 Temperature Sensor -- Lab 3.
Understanding the Blackfin ADSP-BF5XX Assembly Code Format
Microprocessor or Microcontroller Not just a case of “you say tomarto and I say tomayto” M. Smith, ECE University of Calgary, Canada.
Laboratory 1 – ENCM415 Familiarization with the Analog Devices’ VisualDSP++ Integrated Development Environment.
Blackfin BF533 EZ-KIT Control The O in I/O Activating a FLASH memory “output line” Part 2.
Getting the O in I/O to work on a typical microcontroller Activating a FLASH memory “output line” Part 1 Main part of Laboratory 1 Also needed for “voice.
Just enough information to program a Blackfin Familiarization assignment for the Analog Devices’ VisualDSP++ Integrated Development Environment.
Blackfin BF533 EZ-KIT Control The O in I/O
Microprocessor or Microcontroller Not just a case of “you say tomarto and I say tomayto” M. Smith, ECE University of Calgary, Canada.
Tutorial Essentially all the Blackfin instruction you need for all of ENCM511. The instructions are easy. Its knowing when to use them that is the difficult.
Input Laboratory: GPIO Pin control needed to have the Blackfin accept your commands Re-uses information from ENEL353 and ENCM369 courses and text books.
Blackfin Timers Independent timers build into the processor Watchdog Timer is a major part of Lab. 2 (Code provided to you to use)
A Play Core Timer Interrupts Acted by the Human Microcontroller Ensemble from ENCM511.
Moving Arrays -- 1 Completion of ideas needed for a general and complete program Final concepts needed for Final Review for Final – Loop efficiency.
Handling multiple input signals Version #2 – co-operative scheduler Version #3 – pre-emptive scheduler.
A first attempt at learning about optimizing the TigerSHARC code TigerSHARC assembly syntax.
Building a simple loop using Blackfin assembly code If you can handle the while-loop correctly in assembly code on any processor, then most of the other.
Lab. 1 – GPIO Pin control Using information ENEL353 and ENCM369 text books combined with Blackfin DATA manual.
Assignment 4 / Lab. 3 Convert C++ ISR to ASM AND GET IT TO WORK Doing Assignment 4 / Lab. 3 the Test Driven Development way.
Developing a bicycle speed-o-meter
Moving Arrays -- 1 Completion of ideas needed for a general and complete program Final concepts needed for Final Review for Final – Loop efficiency.
A Play Core Timer Interrupts
SPI Compatible Devices
Thermal arm-wrestling
DMA example Video image manipulation
The planned and expected
Moving Arrays -- 1 Completion of ideas needed for a general and complete program Final concepts needed for Final Review for Final – Loop efficiency.
Moving Arrays -- 2 Completion of ideas needed for a general and complete program Final concepts needed for Final DMA.
Thermal arm-wrestling
Using Arrays Completion of ideas needed for a general and complete program Final concepts needed for Final.
Moving Arrays -- 2 Completion of ideas needed for a general and complete program Final concepts needed for Final DMA.
Expand on these ideas for Q9 question and answer on the final
Thermal arm-wrestling
Concept of TDD Test Driven Development
Blackfin Timers Independent timers build into the Blackfin
Lab. 1 – GPIO Pin control Using information ENEL353 and ENCM369 text books combined with Blackfin DATA manual.
Independent timers build into the processor Basis for Lab. 2
Input Laboratory: GPIO Pin control needed to have the Blackfin accept your commands Re-uses information from ENEL353 and ENCM369 courses and text books.
DMA example Video image manipulation
Developing a bicycle speed-o-meter
Blackfin Timers Independent timers build into the processor
Independent timers build into the processor
Developing a bicycle speed-o-meter
Developing a bicycle speed-o-meter
Thermal arm-wrestling
Building a simple loop using Blackfin assembly code
Developing a bicycle speed-o-meter Part 2
A first attempt at learning about optimizing the TigerSHARC code
Blackfin Syntax Moves and Adds
Blackfin Syntax Stores, Jumps, Calls and Conditional Jumps
Presentation transcript:

Developing a bicycle speed-o-meter Midterm Review

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 2 General Project concept Magnetic Sensor Signal High speed clock signal Blackfin Programmable Flag (PF) Input Motorola Parallel Interface Timer (PIT) Input

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 3 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); // Not ready yet discard_count = CountClockASM(while_MagneticSensorLow); // Not ready yet count_high = CountClockASM(while_MagneticSensorHigh); count_low = CountClockASM(while_MagneticSensorLow); return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency); }

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 4 How many clock ticks pass while magnetic sensor value stays at certain level? 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) { // Either a high magnetic sensor value (1) // or low sensor value (0) needs measuring 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; } // Must assume that clock-signal is MUCH faster than sensor signal

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 5 What we need to know 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?

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 6 Programming model Blackfin Data RegistersR0, R1 …. R7 Address Registers Pointer RegistersP0, P1 … P5 Frame BufferFP Stack PointerSP Special DSP I0-I3, B0-B3, M0-M3, L0-L3

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 7 Syntax examples Blackfin Register to Register Move reg1  reg 2 32 bit operations R1 = R2; (1 500 MHz) Register to Register Move reg1  reg 2 16 bit operations R1.L = R2.L; and also R1.H = R2.L; Register to Register Move reg1  reg 2 8 bit operations Here is some new syntax that convert 8-bit values into 32 bit values R1 = R2.B (X); R1.L = R2.B (Z); R1 = R2.B(X);

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 8 Syntax examples Blackfin Register to Register ADD reg1  reg 2 + reg3 32 bit operations R1 = R2 + R3; (1 500 MHz) Register to Register Move reg1  reg 2 + reg3 16 bit operations R1.L = R2.L + R3.L (NS); (1 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 R1.L = R2.B (X); R0.L = R3.B (X); R1.L = R1.L + R0.L (NS); ( > MHz)

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 9 32-bit Memory Move operations Blackfin Value at memory location 1 placed at memory location 2 P0.H = hi(_MEM1); P0.L = lo(_MEM1); P1.H = hi(_MEM2); P1.L = lo(_MEM2); R0 = [P0]; [P1] = R0; > 6 cycles Multiple moves 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;

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada bit Memory Move operations Blackfin Value at memory location 1 placed at memory location 2 P0.H = hi(_MEM1); P0.L = lo(_MEM1); P1.H = hi(_MEM2); P1.L = lo(_MEM2); R0 =W [P0]; W[P1] = R0; > 6 cycles Multiple moves 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;

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 11 Memory Move operations Blackfin Multiple moves of registers [- - SP] = (R7:5, P5:3); Combination of memory moves and ALU operations Can also do parallel read and write operations together with math operations Syntax looks like this R1 = R2 | | R3 = [P0++] | | [I1++] = R4; Not all operations can be made parallel

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 12 If – then – else constructs Signed tests Blackfin Set the condition code register CC = D1 == D0; CC = D1 < D0; CC = D1 <= D0; Conditional jump IF CC JUMP NEXT_INSTR IF !CC JUMP NEXT_INSTR

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 13 If – then – else constructs Un-signed tests Blackfin Set the condition code register CC = D1 == D0 (IU); CC = D1 < D0 (IU); CC = D1 <= D0 (IU); Conditional jump IF CC JUMP NEXT_INSTR IF !CC JUMP NEXT_INSTR R0 = (signed int)1, R2= (unsigned int) 1 R1 = (signed int) -1, R3 = (unsigned int) 0xFFFFFFFF CC = R1 < R0 (true); CC = R3 < R2 (IU) (false) even though R1 == R3 and R0 == R2

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 14 Example if-then-else code C++ exampleBlackfin IF (A > B) C = D; ELSE C = E; Set A, B, C, D, E to registers R0, R1,.. R4 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;

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 15 Example loop code -- software loop C++ exampleBlackfin sum = 0; for (loop = 0; loop < 6; loop++) sum = sum + loop; 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:

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 16 Example loop code -- Hardware loop C++ exampleBlackfin sum = 0; for (loop = 0; loop < 6; loop++) sum = sum + loop; 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: OUTSIDE THE LOOP Has a capability of 2 hardware (high- speed, zero overhead) loop NO SUBROUTINE CALLS ALLOWED

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 17 Reminder of what we were trying to do General Project concept Magnetic Sensor Signal High speed clock signal Blackfin Programmable Flag (PF) Input Motorola Parallel Interface Timer (PIT) Input

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 18 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; }

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 19 Hardware test – wait while magnetic signal is “high” C++Blackfin Magnetic SignalBit 10 of FIO_FLAG_D register of PF interface while (mag_signal == HIGH) /* wait */ ; #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);

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 20 Required BF533 Assembly Language 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; } _CountClockASM: R0 contains the INPAR R1 = 0; P0.H = hi(FIO_FLAG_D); P0.L = lo(FIO_FLAG_D); WHILE: R2 = W[P0] (Z); R3 = MASKMAG; // SLOW Magnetic Signal on bit 10 R2 = R2 & R3; CC = R2 == R0; IF !CC JUMP ENDWHILE; R3 = MASKCLK; // FAST Clock Signal on bit 11 HIGH: R2 = W[P0] (Z); R2 = R2 & R3; CC = R2 == R3 IF CC JUMP HIGH (BP); LOW : R2 = W[P0] (Z); R2 = R2 & R3; CC = R2 < R3 IF CC JUMP LOW (BP); R1 += 1; JUMP WHILE END_WHILE: R0 = R1; RTS

8/25/2015 Timer Control -- Lab.3, Copyright M. Smith, ECE, University of Calgary, Canada 21 Jump predicted taken (bp) -- Example IF CC JUMP WHILE [--SP] = (R7:0); // Save to stack WHILE: R0 = R1; R2 = R3; CC = R1 < R4; IF CC JUMP WHILE; R6 = R7; R5 = R4; R6 = R7; R5 = R4; R6 = R7; R5 = R4; IF CC JUMP WHILE [--SP] = (R7:0); // Save to stack WHILE: R0 = R1; R2 = R3; CC = R1 < R4; IF CC JUMP WHILE (BP); R6 = R7; R5 = R4; R6 = R7; R5 = R4; R6 = R7; R5 = R4;

8/25/2015 Timer Control -- Lab.3, Copyright M. Smith, ECE, University of Calgary, Canada 22 Processor fetches instruction S before execution

8/25/2015 Timer Control -- Lab.3, Copyright M. Smith, ECE, University of Calgary, Canada 23 Processor fetches 9 new instructions before execution of 1 st instruction is complete UP to 10 instructions being executed in parallel

8/25/2015 Timer Control -- Lab.3, Copyright M. Smith, ECE, University of Calgary, Canada 24 Jump predicted taken (bp) IF CC JUMP WHILE [--SP] = (R7:0); // Save to stack WHILE: R0 = R1; R2 = R3; CC = R1 < R4; IF CC JUMP WHILE; R6 = R7; THESE R5 = R4; ARE R6 = R7; FETCHED R5 = R4; GOOD SPEED R6 = R7; IF NO JUMP R5 = R4; IF CC JUMP WHILE [--SP] = (R7:0); // Save to stack WHILE: R0 = R1; THESE R2 = R3; FETCHED CC = R1 < R4; IF CC JUMP WHILE (bp); R6 = R7; R5 = R4; R6 = R7; R5 = R4; R6 = R7; R5 = R4;

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 25 Subroutine / Function calls C++Blackfin extern “C” int FooASM(int, int, int) C = FooASM(1,2,3).extern _FooASM LINK 20; [SP + 16] = R4; R0 = 1; R1 = 2; R2 = 3; CALL _FooASM; R4 = R0;.. Other code R4 = [SP + 16]; UNLINK; RTS;

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 26 Code conventions for subroutines / functions Blackfin -- VisualDSP Volatile registers Destroyed after CALL R0, R1, R2, R3 P0, P1, P2 Non-volatile registers MUST BE UNCHANGED after CALL to a subroutine R4, R5, R6, R7 P3, P4, P5, FP, SP Subroutine return value is passed in R0 Subroutine OUTPARSOUTPAR1  R0 OUTPAR2  R1 OUTPAR3  R2 OUTPAR4  [SP + 12]

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 27 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); count_high = CountClockASM(while_MagneticSensorHigh); count_low = CountClockASM(while_MagneticSensorLow); return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency); }

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 28 Main Blackfin function concept 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); count_high = CountClockASM(while_MagneticSensorHigh); count_low = CountClockASM(while_MagneticSensorLow); return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency); } _DetermineSpeed: LINK 20 [FP + 8] = R0; [FP + 12] = R1; // Save INPARS [SP + 16] = R4; CALL _SetupInterface; R0 = MASKMAG; CALL _CountClockASM; R0 = 0; CALL _CountClockASM R0 = MASKMAG; CALL _CountClockASM; R4 = R0; // count_high R0 = 0; CALL _CountClockASM R0 = R0 + R4; // high + low. R1 = [FP + 8]; // old INPAR1 R2 = [FP + 12]; // old INPAR2 CALL _CalculateSpeedASM // Return in R0 [SP + 16] = R4; UNLINK RTS

8/25/2015 Motorola Blackfin Comparison Part 2, Copyright M. Smith, ECE, University of Calgary, Canada 29 extern “C” void SetupInterface(void); Blackfin Direction register 0 = input, 1 = output FIO_DIR 16-bits Interrupt control FIO_MASKA_D on any bit Enable input (Power save issue) FIO_INEN on any bit Polarity FIO_POLAR on any bit Edge / Level sensitivity FIO_EDGE FIO_BOTH on any bit Magnetic signal Clock signal Bit 10 MASKMAG 0x200 Bit 11 MASKCLK 0x400

8/25/2015 Motorola Blackfin Comparison Part 2, Copyright M. Smith, ECE, University of Calgary, Canada 30 extern “C” void SetupInterface(void); SPECIFICS Blackfin Magnetic signal Clock signal Bit 10 MASKMAG 0x200 Bit 11 MASKCLK 0x400 Direction register 0 = input, 1 = output R0  FIO_DIR MASK OFF BITS 10, 11 FIO_DIR  R0 Interrupt control R0  FIO_MASKA_D MASK OFF BITS 10, 11 FIO_MASKA_D  R0 Enable input (Power save issue) R0  FIO_INEN OR BITS 10, 11 FIO_INEN  R0 Polarity R0  FIO_POLAR MASK OFF BITS 10, 11 FIO_POLAR  R0 Edge / Level sensitivity FIO_EDGE FIO_BOTH MASK OFF BITS 10, 11

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 31 In class exercise – Write Blackfin code for extern “C” void SetupInterface(void);

8/25/2015 Motorola Blackfin Comparison Part 1, Copyright M. Smith, ECE, University of Calgary, Canada 32 Information taken from Analog Devices On-line Manuals with permission 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.