Bitwise Operators Pointers Functions Structs Interrupts (in C)

Post on 19-Dec-2015

225 views 0 download

transcript

Bitwise Operators

Pointers

Functions

Structs

Interrupts

(in C)

table_07_00

Bitwise operators: useful for dealing with signals of different widths;NOTE: these are LOGICAL operators and variables are declared UNSIGNED—why?(example: homework 1, problem 1)

Additional useful reference: http://www.cs.cf.ac.uk/Dave/C/node13.html

fig_07_00

Examples of c operations at the byte level

fig_07_01

Example of c program—”portShadow” mirrors what is on port;Note use of parentheses to guarantee order of bitlevel operations (even if we are using default order)

fig_07_02

Using shift operators (remember these are logical):

fig_07_03

Redoing the previous problem with shifts:

fig_07_04

Getting data from the port:

fig_07_05

Using bitlevel operations for arithmetic;Are there any problems with this approach?

C: on signed data, left shift undefined if overflow occurs, right shift is implementation-dependent;Java: all integers are signed

fig_07_06

Can use shifts for slightly more complex multiplies and divides;More complex operations (e.g., with 3 1’s in multiplier or divider) are probably not efficient

fig_07_07

Pointers: example data

fig_07_09

Example instruction:

fig_07_10

Example 2 of Instruction execution

fig_07_11

Example: what is output?

fig_07_12a

Pointer arithmetic—not for beginners!

fig_07_12b

Pointer arithmetic: additional examples

fig_07_13

Constant pointers:

fig_07_14

Using constants and constant pointers:

fig_07_14

Note: pointers can be “generic” or NULL:

Generic:Type void: pointer can point to a variable of any type

example: 7.3, p. 265

NULL:Pointer needs to be assigned a valid address before dereferencing, otherwise hard-to-find bugs can occur

Address 0 is not acceptable

Solution: use null pointer address, (void*) 0

fig_07_15

C functions:

fig_07_16

Example:

fig_07_17

Function call: note order of parameters on stack

fig_07_18

Using stack to return result:

Function body in memory:

fig_07_20

Pass by value (default in c):

fig_07_21

Pass by reference:

fig_07_22

Information hiding: static qualifier prevents visibility outside this file (even to linker):

fig_07_23

Function documentation: template for header

fig_07_24

We can also define pointers to functions:

Dereferencing methods:

fig_07_26

Example:

fig_07_27

Example 2:

fig_07_28

Pointing to add:

fig_07_29

Pointing to subtract: pointer does not know functionality, only address

fig_07_31

User-defined data structure: struct

fig_07_30

User-defined data structure: struct

Example:

fig_07_34

Can also define a type and use it repeatedly:

fig_07_35

Syntax for using struct:

fig_07_36

Example: define a rectangle

fig_07_37

One struct using another:

fig_07_38

C code for this example:

fig_07_39

Definign the rectangle type:

fig_07_40

Using point and rectangle definitions:

fig_07_41

Rectangle functions:

fig_07_42

Example program:

fig_07_43

Example: passing a struct to a function:

fig_07_44

Interrupt service routines: ISR—needs to be SHORT and SIMPLE

fig_07_45

How an interrupt occurs:

Interrupt may be disabled under certain conditions

fig_07_46

Enable / disable control mechanisms:

Global

Maskingmethod 1: use prioritiesmethod 2: use mask register

(bitwise masks)

Note: interrupts are transient, if we choose to ignore one we may not be able to service it later