µc/os-ii - fujitsu ·

28
Micriμm Empowering Embedded Systems μC/OS-II and The Fujitsu MB91403 (FR) (Using the MB91943EB Evaluation Board) Application Note AN-1403 www.Micrium.com

Upload: others

Post on 10-Jan-2020

20 views

Category:

Documents


1 download

TRANSCRIPT

Micriµm Empowering Embedded Systems

µC/OS-II

and The Fujitsu MB91403 (FR) (Using the MB91943EB Evaluation Board)

Application Note AN-1403

www.Micrium.com

Micriµm µC/OS-II and the Fujitsu MB91403

Table of Contents 1.00 Introduction 4 1.01 Softune Workbench V6 5 1.02 Emulator 5 2.00 Directories and Files 7 3.00 Project Setup 9 3.01 Project Settings 10 3.01.01 Project Settings, MCU tab 11 3.01.02 Project Settings, C/C++ Compiler tab 11 3.01.03 Project Settings, Assembler tab 13 3.01.04 Project Settings, Linker tab 14 3.02 Debugging 17 3.02 Setting up a new Debug configuration 19 4.00 Test Code 21 4.01 Test Code, app.c 21 4.02 Test Code, app_cfg.h 23 4.03 Test Code, app_vect.asm 23 4.04 Test Code, includes.h 23 4.05 Test Code, os_cfg.h 24 4.06 Test Code, OS.* 24 5.00 Board Support Package (BSP) 25 5.01 Board Support Package, bsp.c 26 5.02 Board Support Package, bsp.h 27 5.03 Board Support Package, bsp_a.asm 27 References 28 Contact Information 28

2

Micriµm µC/OS-II and the Fujitsu MB91403

3

Micriµm µC/OS-II and the Fujitsu MB91403

1.00 Introduction 1.00 Introduction This document describes example code for using µC/OS-II with the Fujitsu FR series of processors. To test the code, we used an MB91943EB evaluation board, which contains an MB91403 processor, as shown in Figure 1-1.

RS-232C

EthernetEmulator Pod

Emulator Interface

Power

MB91403

8 User LEDs

Figure 1-1, MB91943EB Evaluation Board with Emulator Pod

This example uses the µC/OS-II port which is described in AN-1015. The details of the port itself will not be described in this application note, just what needs to be done to get µC/OS-II working on this evaluation board.

4

Micriµm µC/OS-II and the Fujitsu MB91403

1.01 Softune Workbench V6 1.01 Softune Workbench V6 We used the Fujitsu Softune Workbench V60L3 (a Microsoft Windows-based tool) to test the code presented in this application note. Softune is a complete Edit – Compile – Link - Debug environment which is used to develop products using the Fujitsu line of microprocessors. Softune was installed in its default directory (C:\Softune6). The CPU information file (i.e. 911.csv) was updated from the standard Softune release to include information about the MB91403. Consult Fujitsu if you are planning on using the MB91403 and the version of Softune does not contain information on the MB91403.

1.02 Emulator Fujitsu provided us with the MB2198-01 Emulator (see Figure 1-2) to test code on the MB91943EB. The emulator connects to a Windows-based PC via a USB cable.

USB to PC Power

Cable to Pod

Figure 1-2, MB2198-01 Emulator

Figure 1-3 shows the Emulator connected to the Emulator Pod and the MB91943EB.

5

Micriµm µC/OS-II and the Fujitsu MB91403

MB2198-01 Emulator

Emulator Pod

MB92943 Evaluation Board

Figure 1-3, MB2198-01 Emulator, Pod and MB91943EB

6

Micriµm µC/OS-II and the Fujitsu MB91403

2.00 Directories and Files The code for this application note is placed in a directory structure according to “AN-2002, µC/OS-II Directory Structure”. Specifically, the files are placed in the following directories:

µC/OS-II: \Micrium\Software\uCOS-II\Source

This directory contains the processor independent code for µC/OS-II. The version used was 2.81.

\Micrium\Software\uCOS-II\Ports\FR\Softune

This directory is the main directory for Fujitsu FR port. Refer to Micriµm’s AN-1015 for details on this port.

This directory contains the standard processor specific files for a µC/OS-II port assuming the Softune toolchain. Specifically, this directory contains the following files: os_cpu.h os_cpu_a.asm os_cpu_i.asm os_cpu_c.c os_dbg_c

Application Code:

\Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\OS This directory contains the source code for an example running on the MB91943EB Evaluation Board. This directory contains: app_vect.asm app.c app_cfg.h includes.h os_cfg.h os.* app.c contains the test code, app_vect.asm contains the interrupt vector table for the MB91403 processor and app_cfg.h contains application specific configuration information, such as task priorities, stack sizes, etc. includes.h contains a master include file used by the application, and os_cfg.h is the µC/OS-II configuration file. os.* are the Softune Workbench project files.

7

Micriµm µC/OS-II and the Fujitsu MB91403

\Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\BSP

This directory contains the Board Support Package (BSP) for the MB91943EB Evaluation Board. This directory contains a few file provided by Micriµm: bsp_a.asm bsp.c bsp.h bsp_a.asm is an assembly language file that contains BSP_TickISR() which is the µC/OS-II tick interrupt service routine. In fact, you need to model ALL your ISRs from the code provided in this file. bsp.c contains functions to initialize the BSP, LED access functions, the µC/OS-II tick interrupt handler (BSP_TickISR_Handler()) and other BSP related functions. Files were also provided by Fujitsu: _fr_a.asm startup.asm _fr.c _fr.h mb91403.h FR70E.inc mb91403_a.inc lib911if.lib

_fr_a.asm, _fr.c and _fr.h are standard Fujitsu FR file which include the appropriate header files for the processor being used. In this case, they make reference to mb91403.h. mb91403.h contains the register and I/O definitions for the MB91403 processor. FR70E.inc contains equates used for assembly language applications. lib911if.lib contains run-time library functions. startup.asm is the startup code. This file initialized the MB91403 processor following a cold start. Note that this code was modified by Micriµm as follows:

1) The very first two lines of code following the ‘start:’ label were changed to disable ALL interrupts instead of enabling them as the original code had. We did this because we wanted to make sure we would not be getting any interrupts until we were ready to process them.

2) We set the vector table base register to _AppVectTbl. _AppVectTbl is

declared in the application code’s app_vect.asm.

3) We removed references to calling a function called __TIME which is the tick ISR handler for an RTOS other than µC/OS-II.

8

Micriµm µC/OS-II and the Fujitsu MB91403

3.00 Project Setup

This section describes how we setup the Softune Workbench. We first created a workspace and then a project, both called OS (for Operating System). The necessary files were included as shown in Figure 3-1. Note that we created sub-folders to keep everything organized as opposed to putting everything in the ‘Source Files’ folder.

Figure 3-1, OS Project

9

Micriµm µC/OS-II and the Fujitsu MB91403

3.01 Project Settings 3.01 Project Settings

This section describes how we configured the tools. You get to the project setup screen by clicking on the ‘Project’ menu item and then the ‘Setup…’ sub-item as shown in Figure 3-2.

Figure 3-2, Setting up the project options

This opens the dialog box shown in Figure 3-3.

Project (OS.prj) and its path

Figure 3-3, General Settings

10

Micriµm µC/OS-II and the Fujitsu MB91403

The project is found in the following directory (called OS.prj): The project is found in the following directory (called OS.prj): C:\Micrium\SOFTWARE\EvalBoards\Fujitsu\MB91943EB\Softune\OS\OS.prj C:\Micrium\SOFTWARE\EvalBoards\Fujitsu\MB91943EB\Softune\OS\OS.prj

3.01.01 Project Settings, MCU tab 3.01.01 Project Settings, MCU tab

As shown in Figure 3-4, the MCU tab determines the type of CPU (FR) and the specific part used (MB91403). If you are also using this CPU and the MB91403 is not listed in the pulldown, you might want to contact your Fujitsu representation and have them send you the 911.csv file which contains the definitions of that processor (you’d place that in C:\Softune6\lib\911).

MCU tab

Select the FR Class of Chips

We used the MB91403

Figure 3-4, MCU Settings

3.01.02 Project Settings, C/C++ Compiler tab

The C/C++ Compiler tab is shown in Figure 3-5. You will note that there are actually six (6) sub-categories of settings (see Category:) to chose from:

General Define Macros Include Path Optimize C++ Language

When you click on the C/C++ Compiler tab, the General category is presented and it should be set as shown in Figure 3-5. We didn’t have any macros to define and thus, didn’t need to do anything with the Define Macros category.

11

Micriµm µC/OS-II and the Fujitsu MB91403

Because we place source files in multiple directories, the Include Path category was set as shown in Figure 3-6 and contains the following entries: Because we place source files in multiple directories, the Include Path category was set as shown in Figure 3-6 and contains the following entries: C:\Micrium\Software\uCOS-II\Source C:\Micrium\Software\uCOS-II\Source C:\Micrium\Software\uCOS-II\Ports\FR\Softune C:\Micrium\Software\uCOS-II\Ports\FR\Softune C:\Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\OS C:\Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\OS C:\Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\BSP C:\Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\BSP

Figure 3-5, C/C++ Compiler, General category

Click here to add

new paths

Project Paths

Figure 3-6, C/C++ Compiler, Include Path category

The Optimize, C++ and Language categories were not changed from their defaults.

12

Micriµm µC/OS-II and the Fujitsu MB91403

3.01.03 Project Settings, Assembler tab

The Assembler tab is shown in Figure 3-7. You will note that there are actually five (5) sub-categories of settings (see Category:) to chose from:

General Define Macro Include Path Target Depend Output List

When you click on the Assembler tab, the General category is presented and it should be set as shown in Figure 3-7.

Figure 3-7, Assembler, General We didn’t have any macros to define and thus, didn’t need to do anything with the Define Macro category. Because we place source files in multiple directories, the Include Path category was set as shown in Figure 3-8 and contains the following entries: C:\Micrium\Software\uCOS-II\Ports\FR\Softune C:\Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\OS C:\Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\BSP The Target Depend and Output List categories were not changed from their defaults.

13

Micriµm µC/OS-II and the Fujitsu MB91403

Click here to add

new paths

Project Paths

Figure 3-8, Assembler, Include Path

3.01.04 Project Settings, Linker tab

The Linker tab is shown in Figure 3-9. You will note that there are actually six (6) sub-categories of settings (see Category:) to chose from:

General Disposition/Connection Define Symbol Output List Absolute Assembly List Control Library

When you click on the Linker tab, the General category is presented and it should be set as shown in Figure 3-9. You’ll notice that we added the –sc @INIT-CS7ROM option in the Other Option: section.

Figure 3-10 shows the Disposition/Connection sub-category. This is an important section since it defines the memory map of the project and the different linker sections.

Section Start Address Stop Address Type Size CS7ROM 0x80000000 0x801FFFFF ROM 2M _INRAM02 0x0003F800 0x0003FFFF RAM 32K CS1RAM 0x00100000 0x0010FFFF RAM 64K IO_I2C 0x010F0000 0x010FFFFF RAM 64K SMI 0x01100000 0x0113FFFF RAM 256K

IO_EXIF 0x01140000 0x0114FFFF RAM 64K

14

Micriµm µC/OS-II and the Fujitsu MB91403

Click here to add new options

Figure 3-9, Linker, General

Sets Memory

Map

Figure 3-10, Linker, Disposition/Connection

The Define Symbol category was not changed from its default.

15

Micriµm µC/OS-II and the Fujitsu MB91403

The Output List category is shown in Figure 3-11. Here, we selected to generate a link map, create a memory usage list and provide information about each memory section. The Output List category is shown in Figure 3-11. Here, we selected to generate a link map, create a memory usage list and provide information about each memory section.

Generate Link Map

Each memory

section will be detailed

Create a Memory

Usage List

Figure 3-11, Linker, Disposition/Connection

16

Micriµm µC/OS-II and the Fujitsu MB91403

3.02 Debugging 3.02 Debugging

The example code provided in this application note contains all the setup files you need to start debugging. Assuming the MB91943EB is connected as shown in Figure 1-3, you can:

1) Press the ‘Build All’ button as shown below

Build ALL

2) Assuming there are no compiler errors, then you can start debugging by clicking on the Debug menu item and the Start debug sub-menu item as shown in Figure 3-12.

Figure 3-12, Starting the Debugger

3) If everything loaded correctly, you should see something similar to the screen shown in

Figure 3-13.

4) If you click on the Run continuously icon, the 8 LEDs on the MB91943EB should be blinking from left-to-right and back (or up-and-down depending on the orientation of the board).

17

Micriµm µC/OS-II and the Fujitsu MB91403

Start Execution

startup.asm code window

Figure 3-13, Ready to Run test application

18

Micriµm µC/OS-II and the Fujitsu MB91403

3.02 Setting up a new Debug configuration The example code provided in this application note contains all the setup files you need to start debugging. However, if you need to setup a new debug session, you will need to follow these steps: Create a Debug Setup Right-mouse click on the Debug folder in the project window as shown in Figure 3-14 (you must not already be in a debug session in order to do this).

Figure 3-14, Setting up a New debug configuration

Enter a name for the debug settings as shown in Figure 3-15.

Figure 3-15, Creating a new debug configuration

19

Micriµm µC/OS-II and the Fujitsu MB91403

Run the Setup Wizard Then follow the setup wizard which will ask you questions about your debug environment.

Figure 3-16 Follow the Setup Wizard

In our case, we selected the following options when prompted by the wizard: Debug Type: Emulator Debugger ICE type: MB2198 Monitor program auto-loading Device type: USB Batch file: C:\Micrium\SOFTWARE\EvalBoards\Fujitsu\MB91943EB\Softune\mb91403_init.prc Before: C:\Micrium\SOFTWARE\EvalBoards\Fujitsu\MB91943EB\Softune\mb91403_init.prc After: Select All item

20

Micriµm µC/OS-II and the Fujitsu MB91403

4.00 Test Code 4.00 Test Code As mentioned previously, the test code for this board is found in the following directories and will be briefly described: \Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\OS

4.01 Test Code, app.c

The test code is found in app.c and will be described in this section. Listing 4-1, main() void main (void) (1) { INT8U err; BSP_IntDisAll(); (2) OSInit(); (3) OSTaskCreateExt(AppTaskStart, (4) (void *)0, (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1],

See APP_CFG.H

For task stack sizes

APP_TASK_START_PRIO, APP_TASK_START_PRIO, (OS_STK *)&AppTaskStartStk[0], APP_TASK_START_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); #if OS_TASK_NAME_SIZE > 13 OSTaskNameSet(APP_TASK_START_PRIO, "Startup", &err); (5)

See APP_CFG.H

For task priorities

#endif OSStart(); (6) }

L4-1(1) As with most C applications, the code starts in main(). L4-1(2) We start off by calling a BSP function (see bsp.c) that will disable all interrupts. We

do this to ensure that initialization doesn’t get interrupted in case we do a ‘warm restart’.

L4-1(3) As with all µC/OS-II applications, you need to call OSInit() before creating any

tasks or other kernel objects. L4-1(4) We then create at least one task (in this case we used OSTaskCreateExt() to

specify additional information about the task to µC/OS-II). It turns out that µC/OS-II creates one and possibly two tasks in OSInit(). As a minimum, µC/OS-II creates an idle task (OS_TaskIdle() which is internal to µC/OS-II) and OS_TaskStat() (if you set OS_TASK_STAT_EN to 1 in OS_CFG.H). OS_TaskStat() is also an internal task in µC/OS-II.

21

Micriµm µC/OS-II and the Fujitsu MB91403

L4-1(5) As of V2.6x, you can now name µC/OS-II tasks (and other kernel objects) and be

able to display task names at run-time or with a debugger. In this case, we name our first task.

L4-1(6) We finally start µC/OS-II by calling OSStart(). µC/OS-II will then start executing

AppStartTask() since that’s the highest priority task created. Listing 4-2, AppTaskStart() static void AppStartTask (void *p_arg) { INT8U I; (void)p_arg; BSP_Init(); (1) #if OS_TASK_STAT_EN > 0 OSStatInit(); (2) #endif #if OS_VIEW_MODULE > 0 OSView_Init(38400); (3) OSView_TerminalRxSetCallback(AppTerminalRx); (4) #endif LED_Off(0); (5) AppTaskCreate(); (6)

while (TRUE) { (7) for (i = 1; i <= 8; i++) { LED_On(i); OSTimeDlyHMSM(0, 0, 0, 50); LED_Off(i); } for (i = 1; i <= 8; i++) { LED_On(9 - i); OSTimeDlyHMSM(0, 0, 0, 50); LED_Off(9 - i); } } } L4-2(1) BSP_Init() is called to initialize the Board Support Package – the I/Os, the tick

interrupt, and so on. BSP_Init() will be discussed in the next section. L4-2(2) OSStatInit() is used to initialize µC/OS-II’s statistic task. This only occurs if you

enable the statistic task by setting OS_TASK_STAT_EN to 1 in OS_CFG.H. The statistic task measures overall CPU usage (expressed as a percentage) and also performs stack checking for all the tasks that have been created with OSTaskCreateExt() with the stack checking option set.

L4-2(3) OSView_Init() is called to initialize the µC/OS-View module (assuming you have

purchased this optional module to µC/OS-II). Here we need to specify the baud rate of the RS-232C port connecting the µC/OS-View ‘viewer’.

22

Micriµm µC/OS-II and the Fujitsu MB91403

L4-2(4) OSView_TerminalRxSetCallback() allows you to specify the name of a function that will be called by µC/OS-View when characters are typed on the ‘Terminal Window’ of the µC/OS-View viewer.

L4-2(5) This BSP function allows all of the board’s LEDs to be turned off. L4-2(6) We then create all of the application tasks by calling AppTaskCreate(). In our

case, we don’t have any other tasks. However, it’s cleaner to have a function to create other task, if you decide to add more tasks.

L4-2(7) As with ALL tasks managed by µC/OS-II, the task must either enter an infinite loop,

‘waiting’ for some event to occur, or terminate itself. We decided to simply blink the 8 LEDs on the MB91943EB in sequence.

4.02 Test Code, app_cfg.h

This file is used to configure:

the µC/OS-II task priorities of each of the tasks in your application the stack size for each task

The reason this is done here is to make it easier to configure your application from a single file.

4.03 Test Code, app_vect.asm

This file contains ALL the interrupt vectors for the MB91403 processor. However, only a few entries are used: RESET vector (INT #0) µC/OS-II‘s tick interrupt using Timer #0 (INT #24) µC/OS-II‘s context switch (INT #64) The other entries in the table are filled with ‘AppIllegal()’ and will thus vector to this location should one of the non-configured interrupts occur. If you need to add additional interrupt service routines, you will need to add the appropriate entry in this table.

4.04 Test Code, includes.h

includes.h is a ‘master’ header file that contains #include directives to include other header files. This is done to make the code cleaner to read and easier to maintain.

23

Micriµm µC/OS-II and the Fujitsu MB91403

4.05 Test Code, os_cfg.h

This file is used to configure µC/OS-II and defines the maximum number of tasks that your application can have, the services that will be enabled (semaphores, mailboxes, queues, etc.), the size of the idle and statistic task, and more. In all, there are about 60 or so constants that you can set in this file. Each entry is commented, and additional information about the purpose of each #define can be found in the µC/OS-II book. os_cfg.h assumes you have µC/OS-II V2.81 or higher, but it could also works with previous versions of µC/OS-II.

4.06 Test Code, OS.*

These files are Softune workbench project files.

24

Micriµm µC/OS-II and the Fujitsu MB91403

5.00 Board Support Package (BSP)

BSP stands for Board Support Package and provides functions to encapsulate common I/O access functions in order to make it easier for you to port your application code. In fact, you should be able to create other applications using the MB91943EB evaluation board and reuse these functions, thus saving you a lot of time. The BSP performs the following functions:

- Configure the I/Os for the MB91943EB - Control the board’s LEDs - Handle interrupts - Handling of µC/OS-II’s tick timer

The BSP for the MB91943EB board is found in the follow directory. \Micrium\Software\EvalBoards\Fujitsu\MB91943EB\Softune\BSP The BSP files are: bsp.c bsp.h

bsp_a.asm

Other common files provided by Fujitsu are placed in the \BSP directory. These are:

_fr_a.asm startup.asm _fr.c _fr.h mb91403.h FR70E.inc mb91403_a.inc lib911if.lib

25

Micriµm µC/OS-II and the Fujitsu MB91403

5.01 Board Support Package, bsp.c We will not be discussing every aspect of the BSP but only cover topics that require special attention. Your application code must call BSP_Init() to initialize the BSP but it must be called from within a µC/OS-II task and not from main(). BSP_Init() in turn calls other functions as needed. Listing 5-1, BSP_Init() void BSP_Init (void) { BSP_IO_Init(); (1) LED_Init(); (2) BSP_TickISR_Init(); (3) __set_il(31); (4) } L5-1(1) We call BSP_IO_Init() to initialize the I/O ports which basically sets up 8 of the

GPIO lines for outputs since those are used to drive the 8 LEDs on the MB91943EB. L5-1(2) We initialize the LED services provided by the BSP. At this point, your application

can call LED_On(), LED_Off() or LED_Toggle() to turn on, off and toggle the board’s LEDs, respectively.

L5-1(3) We then call BSP_TickISR_Init() which will initialize Timer #0 to generate

interrupts for the µC/OS-II clock tick. The code for this function is described below. Listing 5-2, BSP_TickISR_Init() void Tmr_TickInit (void) { IO_TMRLR0 = 0xFFFF; IO_TMCSR0.hword = 0x001B; IO_ICR[8].byte = 0x16; /* interrupt priority reload timer 0 "level 16" */ ICR8 = 30; }

We setup timer #0 as a free-running timer (i.e. counts from 0xFFFF down to 0x0000). We selected free-running mode because we are planning on adding µC/OS-View for the FR and we’ll be using the same timer to make time measurements. The tick rate is given by: Tick Rate = ------------------ = 125.89 Hz

Crystal Freq / 4

Timer Reload Value Where, Crystal Freq is 33 MHz for the MB91943EB and Timer Reload Value is 65536 because of the free-running mode. The tick rate is thus 125.89 Hz.

26

Micriµm µC/OS-II and the Fujitsu MB91403

When Timer #0 counts down to 0x0000, the timer is reloaded with 0xFFFF and an interrupt is generated. If interrupts are enabled, the CPU pushes the PS and PC onto the current task’s stack and jumps to the vector stored at INT #24 (see APP_VECT.ASM). In this case, the vector is the address of BSP_TickISR() and the code for this function is found in BSP_A.ASM (see section 5.03). BSP_TickISR() saves the the remaining processor registers and calls BSP_TickISR_Handler() which services the interrupt using C code instead of assembly language. The code for BSP_TickISR_Handler() is shown in Listing 5-3. Listing 5-3, BSP_TickISR_Handler() void Tmr_TickISR_Handler (void) { IO_TMCSR0.bit.UF = 0x00; /* request clear */ IO_TMCSR0.bit.INTE = 0x00; /* timer request disable */ OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */ IO_TMCSR0.bit.INTE = 0x01; /* timer request enable */ }

5.02 Board Support Package, bsp.h bsp.h is the header file declaring the functions that bsp.c defines.

5.03 Board Support Package, bsp_a.asm bsp_a.asm is an assembly language file that contains BSP_TickISR() which is the µC/OS-II tick interrupt service routine. BSP_TickISR() is modeled as what is described in AN-1015 for ISRs on the FR. bsp_a.asm should ONLY contain BSP_TickISR() unless we provide BSP functions for other modules that require ISRs. BSP_TickISR() calls BSP_TickISR_Handler() which is declared in bsp.c as described in section 5.01.

27

Micriµm µC/OS-II and the Fujitsu MB91403

References µC/OS-II, The Real-Time Kernel, 2nd Edition Jean J. Labrosse R&D Technical Books, 2002 ISBN 1-57820-103-9 Embedded Systems Building Blocks Jean J. Labrosse R&D Technical Books, 2000 ISBN 0-87930-604-1

Contact Information CMP Books, Inc. 6600 Silacci Way Gilroy, CA 95020 USA Phone Orders: 1-800-500-6875 or 1-408-848-3854 Fax Orders: 1-408-848-5784 e-mail: [email protected]: http://www.cmpbooks.com

Micriµm 949 Crestview Circle Weston, FL 33327 USA 954-217-2036 954-217-2037 (FAX) e-mail: [email protected]: www.Micrium.com

28