Embedded Processor Basics (I)

Embedded Processor Basics (I) James Barnes ([email protected]) Colorado State University Department of Electrical and Computer Engineering...
Author: Agnes Mosley
1 downloads 0 Views 3MB Size
Embedded Processor Basics (I)

James Barnes ([email protected])

Colorado State University Department of Electrical and Computer Engineering

January 2013

Colorado State University, Department of Electrical and Computer Engineering

1

Outline 1)

Overview of Two Processors (ATmel ATmega328P, AT91SAM)

2)

Development Environments –

3)

Exercise 1: Install Development Environment

Block Diagram, Instruction and Data Flow, Clocking and Reset –

Exercise 2: Compile and Upload Programs

4)

Memory Organization

5)

Number Representations –

6)

Exercise 3: Develop code to detect integer overflow

Instruction Set and Program Flow –

January 2013

Exercise 4: Trace program flow for simple function call Colorado State University, Department of Electrical and Computer Engineering

2

References Used • ATmega328P datasheet (AVR core) – www.atmel.com/devices/atmega328p.aspx

• AT91SAM datasheet (ARM Cortex core) – www.atmel.com/products/microcontrollers/arm/default.aspx



Introduction to Embedded Systems Using ANSI C and the Arduino Development Environment, David J. Russell, ISBN 9781608454990 ebook – one in a series of books, all downloadable from Morgan Library, listed in bibliography

• History of the AVR cpu core, Atmel involvement, links to Arduino – en.wikipedia.org/wiki/Atmel_AVR

• Wikipedia article on AVR cpu core – en.wikipedia.org/wiki/Atmel_AVR_instruction_set

January 2013

Colorado State University, Department of Electrical and Computer Engineering

3

Why These Processors? • Both used in Arduino boards http://www.arduino.cc/ “Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments “ –



Another useful reference re Arduinohttp://en.wikipedia.org/wiki /Arduino

– Gives history of Arduino going back to Processing open project at MIT Media Lab and the Wiring Language and IDE which Arduino uses

January 2013

Colorado State University, Department of Electrical and Computer Engineering

4

Atmel ATmega328P Arduino Boards used in EECL 

Seeeduino Stalker board – Zigbee communication, battery-powered – Used in building monitor project to track building occupancy



Arduino Ethernet board – Ethernet communication, POE (Power Ever Ethernet) – Used in Integrid resource monitoring

January 2013

Colorado State University, Department of Electrical and Computer Engineering

5

AT91SAM Arduino Board • Arduine Due board [Ref: http://arduino.cc/en/Main/ArduinoBoardDue]

• Has 32b ARM Cortex core (Atmega328P has 8b “AVR” core) – Not suited for battery power – Used in future projects which require more processing power than the 328P can deliver

January 2013

Colorado State University, Department of Electrical and Computer Engineering

6

Atmel ATmega328P Datasheet

Ref: http://www.atmel.com/Images/doc8161.pdf January 2013

Colorado State University, Department of Electrical and Computer Engineering

7

Atmel ATmega328P Datasheet (cont’d)

Ref: http://www.atmel.com/Images/doc8161.pdf January 2013

Colorado State University, Department of Electrical and Computer Engineering

8

ATmel AT91SAM Datasheet

Ref: http://www.atmel.com/Images/doc11057.pdf January 2013

Colorado State University, Department of Electrical and Computer Engineering

9

ATmel AT91SAM Datasheet (cont’d)

Ref: http://www.atmel.com/Images/doc11057.pdf January 2013

Colorado State University, Department of Electrical and Computer Engineering

10

Outline 1)

Overview of Two Processors (ATmel ATmega328P, AT91SAM)

2)

Development Environments –

3)

Exercise 1: Install Development Environment

Block Diagram, Instruction and Data Flow, Clocking and Reset –

Exercise 2: Compile and Upload Programs

4)

Memory Organization

5)

Number Representations –

6)

Exercise 3: Develop code to detect integer overflow

Instruction Set and Program Flow –

January 2013

Exercise 4: Trace program flow for simple function call Colorado State University, Department of Electrical and Computer Engineering

11

Arduino Development Environments

Original Arduino Environment • • •

Reads in *.pde file format Does not allow creation of custom libraries Complete package, includes compile tools

January 2013

Eclipse IDE with Arduino plug-in • • • •

Reads in eclipse project setup file and standard C++ files Allows development of custom libraries Requires installation of AVR gcc compiler and Arduino libraries. Requires a bit more work to write and compile programs (well documented by Sam Kemp)

Colorado State University, Department of Electrical and Computer Engineering

12

Simple Arduino Program (“Blink”) Using WIRING Library Ref: Russell, op. cit., pp 82-85

#include “Arduino.h” #include

// This file only in Arduino-1.0, not -0022

int ledPin = 13; void setup () { pinMode(ledPin , OUTPUT);

// pinMode()is an Arduino library function // OUTPUT defined in Arduino.h include

} void loop ()

{

// HIGH is defined in Arduino.h include

digitalWrite(ledPin , HIGH); // digitaWrite()is Arduino library function delay(1000); // delay()is an Arduino library function digitalWrite(ledPin , LOW); delay(1000);

}

January 2013

Colorado State University, Department of Electrical and Computer Engineering

13

What’s happening behind the scene (both IDEs) Ref: Russell, op. cit., pp195-198

The Arduino IDE or Eclipse plug-in adds a wrapper to the user code #include … #include “WProgram.h” void setup(); void loop();

// user includes, global variable declarations moved by IDE

int main(void) { init(); setup(); for (;;) { loop(); } return 0; }

// main() and execution loop added by Arduino library // Eveutually we will dispnese with all of this // by creating our own libs

void setup(void) { … }

// user-defined code

void loop(void) { … }

// user-defined code

January 2013

// prototype declarations added by IDE

Colorado State University, Department of Electrical and Computer Engineering

14

What’s happening behind the scene (both IDEs) Program Compilation and Upload

Commands run when you click “build” {PATH}/bin/avr-gcc -g -Wall -O2 -mmcu=atmega328p -c .c {PATH}/bin/avr-gcc -g -Wall -O2 -mmcu=atmega328p –o .elf .o {PATH}/bin/avr-objcopy -j .text -j .data -O ihex .elf .hex

Command run when you click “upload” {PATH}/bin/avrdude -C [conf file] -p m328p -c stk500v1 -P [serialport] –b 57600 -D –U flash:w:.hex:i

Extra: command to disassemble (for looking at assembly code created) {PATH}/bin/avr-objdump -h -S .elf > .lst

January 2013

Colorado State University, Department of Electrical and Computer Engineering

15

Debugging Using Serial Interface

• Standard debuggers such as gdb do not work with cross compilation – Need a special hardware translator to give necessary status information to gdb • Lacking that, debugging for embedded processors relies on “print” statements placed in core. The “printing” is done to the serial interface. January 2013

Colorado State University, Department of Electrical and Computer Engineering

16

Exercise 1 – Setup Development Environment – Part 1

• Complete the first section, “Download and Installation” of the document Eclipse_Install.pdf

January 2013

Colorado State University, Department of Electrical and Computer Engineering

17

Outline 1)

Overview of Two Processors (ATmel ATmega328P, AT91SAM)

2)

Development Environments –

3)

Exercise 1: Install Development Environment

Block Diagram, Instruction and Data Flow, Clocking and Reset –

Exercise 2: Compile and Upload Programs

4)

Memory Organization

5)

Number Representations –

6)

Exercise 3: Develop code to detect integer overflow

Instruction Set and Program Flow –

January 2013

Exercise 4: Trace program flow for simple function call Colorado State University, Department of Electrical and Computer Engineering

18

ATmega328P Top-level Block Diagram



328P is really an “SOC” (system on a chip) – CPU PLUS clock generator, memory, ADC, timer/counters, EEPROM, serial ports.

January 2013



“Harvard” architecture (separate program and data memory).



Peripheral blocks communicate with CPU via 8b DATABUS



Configuration of peripherals through Control/Status Regs (CSRs).



Memory-mapped addresses. Read/write to a memory location.

Colorado State University, Department of Electrical and Computer Engineering

19

ATmega328P AVR Core Block Diagram •

ALU operates only on GP Reg values. – Load/store instructions to get data between SRAM and GP regs.



32KB flash prog memory, but 2KB reserved for bootloader. – Bootloader configures serial port for loading programs, also jumps to program start location after load, reset, or power cycle. – If the bootloader memory section is corrupted, the board cannot be loaded. Need special hardware to restore functionality.





January 2013

Only 2KB to store variables (“data memory”). C long integer and C float are expensive memory-wise. Variable values which must persist after power off can be saved to the 1KB EEPROM.

Colorado State University, Department of Electrical and Computer Engineering

20

Instruction Fetch/Decode/Execute Cycle

• Overlapping instr fetch and execute of previous instruction • Instruction addresses can come from program counter or GP reg array • Execute operation takes one clock cycle January 2013

Colorado State University, Department of Electrical and Computer Engineering

21

Data Memory R/W Access Cycle • One clock cycle to decode address and drive word line. • One clock cycle to transfer SRAM CP register file

January 2013

Colorado State University, Department of Electrical and Computer Engineering

22

System Clocking •

Five possible clock sources – Some can be shut down for power savings



Default clock source for CPU is calibrated RC oscillator but can be overridden by flash fuses (by board manufacturer) – Stalker board uses 8MHz crystal oscillator or can use internal RC oscillator for power savings – Ethernet board uses 16MHz crystal

January 2013

Colorado State University, Department of Electrical and Computer Engineering

23

System Reset • Loaded program executes after reset • Reset occurs when – Power applied – Recovery from voltage droop (“brownout”) – Program upload completes – External reset button pushed

January 2013

Colorado State University, Department of Electrical and Computer Engineering

24

Exercise 2 – Compile and Upload Programs • Complete the final three sections of the document Eclipse_Install.pdf – “Building the Library” – Since we may be using different Arduino boards, you may need help choosing which library to build. – “Generating An Executable” - Choose at least the “Hello World” example, on the next slide, as it shows serial communication between the board and your computer. If you have time, create a new project and build the “Blink” example, also on the next slide – “Upload the Project to Target Device”

January 2013

Colorado State University, Department of Electrical and Computer Engineering

25

Example Programs “Hello World” Main.cpp

“Blink” Main.cpp

#include #include "Arduino.h”

#include #include "Arduino.h"

void setup() { Serial.begin(9600); }

#define LED 9

void loop() { String msg = "Hello World Number "; static uint8_t i = 0; char sint[5]; itoa(i,sint,10); Serial.println(msg+sint); i++; delay(1000); }

January 2013

// Nbr will vary

void setup() { // initialize the digital pin as output. // Pin 9 has an LED on THIS Arduino board pinMode(LED, OUTPUT); }

void loop() { // turn the LED on digitalWrite(LED, HIGH); // wait for a second delay(1000); // turn the LED off digitalWrite(LED, LOW); // wait for a second delay(1000); }

Colorado State University, Department of Electrical and Computer Engineering

26

Outline 1)

Overview of Two Processors (ATmel ATmega328P, AT91SAM)

2)

Development Environments –

3)

Exercise 1: Install Development Environment

Block Diagram, Instruction and Data Flow, Clocking and Reset –

Exercise 2: Compile and Upload Programs

4)

Memory Organization

5)

Number Representations –

6)

Exercise 3: Develop code to detect integer overflow

Instruction Set and Program Flow –

January 2013

Exercise 4: Trace program flow for simple function call Colorado State University, Department of Electrical and Computer Engineering

27

Program Memory Organization 









January 2013

AVR instructions are all 16b or 32b wide Program memory organized as 16K x 16b words (upper 1K words for bootloader) 14b Instruction Address Register (addresses entire flash, including bootloader, but bootloader section is “protected”). Prog memory R/W access is via 64 word Pages. Temporary buffer used to build pages before writing. A page is erased before writing prog memory from the temp buffer. Bootloader will load IAR with Addr 0 after program load, PON, or reset.

Colorado State University, Department of Electrical and Computer Engineering

28

Data Memory Organization

• Holds ALL program variables • SRAM memory, byte-addressable •

The 32 8b CPU general purpose registers and 224 8b control registers are memory-mapped starting at address 0.

January 2013



GP Regs and control regs (CSRs) can be read/written using short (16b) pointers to the address (examples later).



Gray region is accessible via “extended addressing”. Instruction address field is only capable of directly addressing white region.



Generally the AVR-GCC compiler can handle GP Reg access.



Setup of MOST common peripheral functions can be done through WIRED library routines which handle the low-level CSR access, but occasionally it is necessary to use pointer access.

Colorado State University, Department of Electrical and Computer Engineering

29

GP Register File • The X, Y, and Z registers are used for indirect addressing of the data memory space. • X,Y,Z regs appear in some of the machine instructions and must be used for extended addressing.

January 2013

Colorado State University, Department of Electrical and Computer Engineering

30

Control/Status Register Example: Status Register (SREG)

• • • •

Bit Bit Bit Bit

7 6 5 4

– – – –

January 2013

I: T: H: S:

Global Interrupt Enable Bit Copy Storage Half Carry Flag Sign Bit, S = N ⊕ V

• • • •

Bit 3 Flag Bit 2 Bit 1 Bit 0

– V: Two’s Complement Overflow – N: Negative Flag – Z: Zero Flag – C: Carry Flag

Colorado State University, Department of Electrical and Computer Engineering

31

Stack and Stack Pointer Register 







January 2013

Stack is used to store temporary data, local variables, context (for interrupt calls), and return addresses for function and interrupt calls

Stack starts at highest address of Data Memory and grows downward Stack pointer (0x5E,0x5D) is 16b wide (14b are used) and points to top of stack (lowest occupied address minus 1). Every time a byte is pushed on stack, the SP is decremented.

Colorado State University, Department of Electrical and Computer Engineering

32

Stack Pointer Experiment #include "Arduino.h” #define HEX 16 #define SPH_ADDR 0x5E #define SPL_ADDR 0x5D signed int my_add(int, int); signed int my_add3(int, int, int); void print_sp(); void print_spl();

void setup() { Serial.begin(9600); Serial.print("Starting "); print_sp(); signed int a; signed int b; signed int c; signed int d; // not good style a=2; b=3; c=4; // not good style Serial.print("after c=4; "); print_sp(); d=my_add(a,b); Serial.print("Return from d=my_add(a,b) "); print_sp(); d = my_add3(a,b,c); Serial.print("Return from d=my_add3(a,b,c) "); print_sp(); Serial.println(); } void loop() { } signed int my_add(int x, int y) { Serial.print("In my_add "); print_sp(); return x+y; } signed int my_add3(int x, int y, int z) { Serial.print("In my_add3 "); print_sp(); return x+y+z; }

January 2013

Colorado State University, Department of Electrical and Computer Engineering

33

Function print_sp() and Output of Program void print_sp() { unsigned char * sph = (unsigned char *) SPH_ADDR ; unsigned char * spl = (unsigned char *) SPL_ADDR ; Serial.print(*sph,HEX); Serial.print("\t"); Serial.print(*spl,HEX); Serial.println(); }

Starting after c=4; In my_add Return from d=my_add(a,b) In my_add3 Return from d=my_add3(a,b,c)

January 2013

8 8 8 8 8 8

F3 F3 ED F3 EB F3

Colorado State University, Department of Electrical and Computer Engineering

34

Direct Access of Control Registers: ANSI C Version of “Blink” Ref: Russell, op. cit., pp 82-85

#include “Arduino.h” #include void setup () { unsigned char * portDDRB ; portDDRB = (unsigned char *) 0x24; *portDDRB |= 0x20; // Equiv to *portDDRB = *portDDRB | 0x20 }

void loop () { unsigned char * portB ; portB = (unsigned char *) 0x25; *portB |= 0x20; // 0x20 = 0010 0000 MyDelay (1000); *portB &= 0xDF; MyDelay (1000); } void MyDelay (unsigned long mSecondsApx ) { volatile unsigned long i; unsigned long endTime = 1000 * mSecondsApx ; for (i = 0; i < endTime ; i++); }

January 2013

Colorado State University, Department of Electrical and Computer Engineering

36

PORTB/DDRB Registers Ref: Russell, op. cit., p 108

January 2013

Colorado State University, Department of Electrical and Computer Engineering

37

Port B Data Pin Connections to Board Connector (Seeeduino Stalker V2.0)

January 2013

Colorado State University, Department of Electrical and Computer Engineering

38

Stalker Board Schematic

January 2013

Colorado State University, Department of Electrical and Computer Engineering

39

Seeeduino Stalker V2.0Schematic (Zoomed View of uProc and Connector Pins)

January 2013

Colorado State University, Department of Electrical and Computer Engineering

40

Outline 1)

Overview of Two Processors (ATmel ATmega328P, AT91SAM)

2)

Development Environments –

3)

Exercise 1: Install Development Environment

Block Diagram, Instruction and Data Flow, Clocking and Reset –

Exercise 2: Compile and Upload Programs

4)

Memory Organization

5)

Number Representations –

6)

Exercise 3: Develop code to detect integer overflow

Instruction Set and Program Flow –

January 2013

Exercise 4: Trace program flow for simple function call Colorado State University, Department of Electrical and Computer Engineering

41

Arduino Data Types Type

Width (bytes)

Range

bool

1

0 to 1

byte

1

0 to 255

char, signed char, int8_t, signed int8_t

1

-128 to 127

unsigned char, uint8_t, unsigned int8_t

1

0 to 255

short, signed short

2

-32,768 to 32,767

unsigned short

2

0 to 65,535

int, signed int, int16_t, signed int16_t

2

-32,768 to 32,767

unsigned int, uint8_t, unsigned int8_t

2

0 to 65,535

long, signed long, int32_t, signed int32_t

4

-2,147,483,648 to 2,147,483,647

unsigned long, uint32_t, unsigned int32_t

4

0 to 4,294,967,295

float

4

-3.4028235E+38 to 3.4028235E+38

double

4

-3.4028235E+38 to 3.4028235E+38

January 2013

Colorado State University, Department of Electrical and Computer Engineering

42

Conserving Data Memory • long, float, and double are expensive in mem usage (and float/double arithmetic is slow) • bool type does not save memory over byte or char because mem is byte-addressable • Arrays of bool do not pack; each bit requires one byte of mem

January 2013

Colorado State University, Department of Electrical and Computer Engineering

43

Overflow vs Carryout for Integers For simplicity, assume 4 bit integers (not a defined C variable type) unsigned 5 4

6

3

2 1

7 8

0 F

9 A

• Can’t do subtraction with both operands unsigned. • For addition, overflow occurs when carryout occurs.

E

signed 2’s complement 5 4 3 2 6 1 7 0

-8 -7 -6

B C D



-1 -2 -5 -4 -3

• •

Can only get overflow when both ops have same sign. Overflow occurs when result has different sign from ops. Carryout does not matter

Ref: Russell p 13



Test for overflow: ((a+b) < a) or ((a+b) < b) Works for both signed and unsigned integers

January 2013

Colorado State University, Department of Electrical and Computer Engineering

44

Casting (Type Conversion) • Casting is conversion from one data type to another. Conversion to a wider type is done according to padding rules and is relatively safe (if you understand the padding rules) – unsigned to unsigned unsigned int8_t a = 0xFF; unsigned int16_t b; b = (unsigned int16_t) a; // b = 0x00FF, i.e. zero padding of upper bits

– signed to signed signed int8_t a = 0xFF; signed int16_t b; b = (signed int16_t) a; // b = 0xFFFF, i.e. sign extension of upper bits

• Casting to a narrower type involves truncation of upper bits and can result in error if the upper bits were not created by padding or sign extension • Casting from signed to unsigned or vice versa can lead to unexpected results – Ex: signed negative to unsigned results in a large positive number – Ex: unsigned positive large number to signed results in small negative number. January 2013

Colorado State University, Department of Electrical and Computer Engineering

45

IEEE Single Precision Floating Point Format

• Single precision has 6-8 decimal places of precision • The actual exponent used in computation is 2e-127 so the real range of the exponent is [2-127, 2128] • The mantissa has an implied 1, i.e. all 0’s in the mantissa field implies 1.00000000… • The floating point hardware does the adjustments on the exponent and mantissa before doing an floating point operation. The adjustments are undone before writing a result back to memory January 2013

Colorado State University, Department of Electrical and Computer Engineering

46

Categories of IEEE Floating Point Numbers

• Only Normal and Zero are considered valid floating point numbers. A processor used in general purpose computing will throw a floating point exception for the other types. • The AVR processor apparently does support the IEEE standard, although it may not enforce Normal – The maximum number is 3.4028235E+38 , which equals (2 – 2-23)*2127 January 2013

Colorado State University, Department of Electrical and Computer Engineering

47

Exercise 3 • Write a simple function my_add() to test for signed and unsigned integer addition overflow. Return both the overflow test result (True/False) and the sum. Hint: you will need to use a pointer. Verify proper operation, including, for the signed case, both positive and negative operands.

January 2013

Colorado State University, Department of Electrical and Computer Engineering

48

Outline 1)

Overview of Two Processors (ATmel ATmega328P, AT91SAM)

2)

Development Environments –

3)

Exercise 1: Install Development Environment

Block Diagram, Instruction and Data Flow, Clocking and Reset –

Exercise 2: Compile and Upload Programs

4)

Memory Organization

5)

Number Representations –

6)

Exercise 3: Develop code to detect integer overflow

Instruction Set and Program Flow –

January 2013

Exercise 4: Trace program flow for simple function call Colorado State University, Department of Electrical and Computer Engineering

49

Instruction Set and Assembly Language • Why care about this? – Rarely, need to code in assembly because the compiler code is not “good” enough (small enough, fast enough, or both). • Inline assembly (short sections embedded in mostly C/C++) allows selective use of assembly in a mostly C/C++ environment

– Probably more useful in debugging, since we don’t have software debugger. Can see exactly what the chip is doing.

• References – Atmel ATmega328p Datasheet http://www.atmel.com/Images/doc8161.pdf – AVR Instruction Set Manual http://www.atmel.com/images/doc0856.pdf – Russell, Chapter 11.

January 2013

Colorado State University, Department of Electrical and Computer Engineering

50

Compilation Process • The compiler output file.s is human-readable “assembly language”. • Programming in assembly gives ultimate control over the hardware. • Assembly language may have some concessions for the human programmer, but there is a 1 to 1 relationship between assembly lines and machine operations • Machine instruction set  assembly language set

January 2013

Colorado State University, Department of Electrical and Computer Engineering

51

Sample of Binary Instruction Format

• These 16b words are divided into instruction and operand fields. They are decoded by logic to access registers, control ALU operations, etc. January 2013

Colorado State University, Department of Electrical and Computer Engineering

52

Assembly Language Summary in AVR Document

January 2013

Colorado State University, Department of Electrical and Computer Engineering

53

AVR Assembly Language Reference • Good reference: http://www.atmel.com/images/doc0856.pdf

January 2013

Colorado State University, Department of Electrical and Computer Engineering

54

Exercise 4: Trace Assembly Language Data Flow for Function Call my_add() (Handout) #include "Arduino.h" #define HEX 16 #define SPH_ADDR 0x5E #define SPL_ADDR 0x5D signed int my_add(int, int); void print_sp(); void setup() { Serial.begin(9600); Serial.print("Starting "); print_sp(); signed int a; signed int b; signed int c; signed int d; // not good style a=0x1234; b=0x2345; c=0x3456; d=0x4567; // not good style Serial.print("after d=.. "); print_sp(); d=my_add(a,b); Serial.print("Return from d=my_add(a,b) "); print_sp(); Serial.print(c,HEX); Serial.println(); } void loop() { } signed int my_add(int x, int y) { Serial.print("In my_add "); print_sp(); return x+y; } void print_sp() { unsigned char * sph = (unsigned char *) SPH_ADDR ; unsigned char * spl = (unsigned char *) SPL_ADDR ; Serial.print(*sph,HEX); Serial.print("\t"); Serial.print(*spl,HEX); Serial.println(); }

January 2013

Colorado State University, Department of Electrical and Computer Engineering

55