Ucos + Arm

Download as pdf or txt
Download as pdf or txt
You are on page 1of 33

Micrim

Empowering Embedded Systems

C/OS-II C/Probe C/LCD


and the
NXP LPC2148 Processor (Using the IAR LPC2148-SK Evaluation Board) Application Note
AN-1148

www.Micrium.com

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

About Micrim
Micrim provides high-quality embedded software components in the industry by way of engineer-friendly source code, unsurpassed documentation, and customer support. The companys world-renowned realtime operating system, the Micrim C/OS-II, features the highest-quality source code available for today's embedded market. Micrim delivers to the embedded marketplace a full portfolio of embedded software components that complement C/OS-II. A TCP/IP stack, USB stack, CAN stack, File System (FS), Graphical User Interface (GUI), as well as many other high quality embedded components. Micrims products consistently shorten time-to-market throughout all product development cycles. For additional information on Micrim, please visit www.micrium.com.

About C/OS-II
C/OS-II is a preemptive, real-time, multitasking kernel. C/OS-II has been ported to over 45 different CPU architectures. C/OS-II is small yet provides all the services youd expect from an RTOS: task management, time and timer management, semaphore and mutex, message mailboxes and queues, event flags an much more. You will find that C/OS-II delivers on all your expectations and you will be pleased by its ease of use.

Licensing
C/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful research. If you plan on using C/OS-II in a commercial product you need to contact Micrim to properly license its use in your product. We provide ALL the source code with this application note for your convenience and to help you experience C/OS-II. The fact that the source is provided DOES NOT mean that you can use it without paying a licensing fee. Please help us continue to provide the Embedded community with the finest software available. Your honesty is greatly appreciated.

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

About C/Probe Demo Version


C/Probe is a Windows application that allows a user to display and change the value (at run-time) of virtually any variable or memory location on a connected embedded target. The user simply populates C/Probes graphical environment with gauges, tables, graphs, and other components, and associates each of these with a variable or memory location. Once the application is loaded onto the target, the user can begin C/Probes data collection, which will update the screen with variable values fetched from the target. C/Probe retrieves the values of global variables from a connected embedded target and displays the values in an engineer-friendly format. The supported data-types are: booleans, integers, floats and ASCII strings. C/Probe can have any number of data screens where these variables are displayed. This allows to logically grouping different views into a product. This C/Probe demo version can only retrieve information from RS-232C or J-LINK interfaces and is limited up to 15 symbols. The demo version of C/Probe is available on the Micrim website: http://www.micrium.com/products/probe/probe.html

About C/Probe Full Version


The full version of C/Probe allows you to use a TCP/IP is a Windows application that allows a user to display and change the value (at run-time) of virtually any variable or memory location on a connected embedded target. The user simply populates C/Probes graphical environment with gauges, tables, graphs, and other components, and associates each of these with a variable or memory location. Once the application is loaded onto the target, the user can begin C/Probes data collection, which will update the screen with variable values fetched from the target.

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Manual Version
If you find any errors in this document, please inform us and we will make the appropriate corrections for future releases. Version V.1.00 V.1.01 V.1.02 Date 2007/07/02 2007/08/24 2008/08/18 By BAN BAN FT Description Initial version. Fixed typographical errors. Updated for C/Probe v 2.20

Software Versions
This document may or may not have been downloaded as part of an executable file, Micrium-NXP-uCOSII-LCD-LPC2148.exe, containing the code and projects described here. If so, then the versions of the Micrim software modules in the table below would be included. In either case, the software port described in this document uses the module versions in the table below Module C/OS-II C/Probe C/LCD Version V2.86 V2.20 V3.00 Comment

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Document Conventions Numbers and Number Bases


Hexadecimal numbers are preceded by the 0x prefix and displayed in a monospaced font. Example: 0xFF886633. Binary numbers are followed by the suffix b; for longer numbers, groups of four digits are separated with a space. These are also displayed in a monospaced font. Example: 0101 1010 0011 1100b. Other numbers in the document are decimal. prevailing where the number is used. These are displayed in the proportional font

Typographical Conventions
Hexadecimal and binary numbers are displayed in a monospaced font. Code excerpts, variable names, and function names are displayed in a monospaced font. Functions names are always followed by empty parentheses (e.g., OS_Start()). Array names are always followed by empty square brackets (e.g., BSP_Vector_Array[]). File and directory names are always displayed in an italicized serif font. /Micrium/Sofware/uCOS-II/Source/. Example:

A bold style may be layered on any of the preceding conventionsor in ordinary textto more strongly emphasize a particular detail. Any other text is displayed in a sans-serif font.

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Table of Contents
1. 2. 2.01 2.02 2.03 2.03.01 2.03.02 2.04 2.04.01 2.04.02 3. 4. 4.01 4.02 5. 5.01 5.02 5.03 5.04 6. 7. Licensing References Contacts Introduction Getting Started Setting up the Hardware Directory Tree Using the IAR Projects Project Options C/OS-II Kernel Awareness Example Applications Application Information Additional Application Information Directories and Files Application Code app.c os_cfg.h Board Support Package (BSP) IAR EWARM v4.4x-Specific BSP Files IAR EWARM v5.1x-Specific BSP Files BSP, bsp.c and bsp.h Processor Initialization Functions C/Probe C/LCD 7 9 9 10 11 11 13 15 15 16 18 21 21 24 25 25 25 26 27 29 32 33 33 33

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

1.

Introduction

This document, AN-1148, explains example code for using C/OS-II. C/Probe and C/LCD with the NXP LPC2148 (ARM7TDMI-S) processor on the IAR LPC2148-SK evaluation board, shown in Figure 1. The LPC2148 includes a 512-kB flash and 32-kB SRAM and operates at clock speeds as high as 60-MHz. 2 Peripherals for several communications busses are provided on-chip, including UARTs, I C, SPI, SSP and USB. Two eight-channel A/D converters, two 32-bit general-purpose timers and up to 45 GPIOs round out the features on the chip. The LPC2148 has two RS-232 ports and a 20-pin JTAG for debugging and loading the processor. The interface components include two user push buttons, a 2- x 16-character LCD and a potentiometer. USB SD/MMC Card Holder

20-Pin JTAG

NXP LPC2148

RS-232 (for C/Probe)

9VDC Power

2x16 LCD

User PBs User PBs

Potentiometer

Figure 1-1. IAR LPC2148-SK Evaluation Board

If this appnote was downloaded in a packaged executable zip file, then it should have been found in the directory /Micrium/Appnotes/AN1xxx-RTOS/AN1148-uCOS-II-NXP-LPC2148 and the code files referred to herein are located in the directory structure displayed in Section 2.02; these files are described in Section 3.

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

The executable zip also includes example workspaces for C/Probe. C/Probe is a Windows program which retrieves the value of variables form a connected embedded target and displays the values in an engineer-friendly format. It interfaces with the LPC2148 via RS-232C. For more information, including instructions for downloading a trial version of the program, please refer to Section 6.

Figure 1-3. C/Probe (with Target Output Window)

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

2.

Getting Started

The following sections step through the prerequisites for using the demonstration application described in this document, AN-1148. First, the setup of the hardware will be outlined. Second, the use and setup of the IAR Embedded Workbench project will be described. Thirdly, the steps to build the projects and load the application onto the board through a JTAG will be described. Lastly, instructions will be provided for using the example application.

2.01

Setting up the Hardware

The evaluation board can either be powered through an external DC adapter or through a JTAG (such as a J-Link). As shown in Figure 2-1, configure the board appropriately for the method chosen. The processor on the evaluation board can be programmed and debugged through the 20-pin JTAG port using a JTAG emulator, such as a J-Link (which we used for the IAR projects). This jumper should be placed.

If powering the board through USB, connect pins 6-5. If powering the board through a J-Link, connect pins 4-3. Otherwise, if using an external supply (as shown), connect pins 2-1.

Figure 2-1. Evaluation Board Configuration


To use C/Probe with the LPC2148, download and install the trial version of the program from the Micrim website as discussed in Section 6. After programming your target with one of the included example projects, connect a RS-232 cable between your PC and the evaluation board, configure the RS232 options (also covered in Section 6), and start running the program. The open data screens should update, as shown in Figure 1-2. The LPC2148 example application is configured to use UART1, the RS232C connector labeled RS-232 for C/Probe in Figure 1-1.

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

2.02

Directory Tree

If this file were downloaded as part of an executable zip file (which should have been named MicriumAtmel-uCOS-II-LCD-LPC2148.exe), then the code files referred to herein are located in the directory structure shown in Figure 2-2.

Licensing agreements (If C/OS-II is used commercially) Contact www.Micrium.com for pricing

AN-1014

AN-1148 AN-9913

C/LCD LCD Driver C/LIB Run-Time Libraries

IAR Example Project (with C/Probe) C/OS-II The Real Time Kernel

C/Probe Real-Time Monitor Target Communication

ARM7 / ARM9 C/OS-II port C/OS-II processor independent source code

RS-232 Communication C/Probe LPC21xx Port C/Probe IAR Kickstart Kits Demo AN-9913

Figure 2-2. Directory Structure

10

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

2.03

Using the IAR Projects

Two IAR projects are located in the directory (marked IAR Example Project (with C/Probe) in Figure 23): /Micrium/Software/EvalBoards/NXP/LPC2148-SK/IAR/OS-Probe The first example project, LPC2148-SK-OS-Probe-LCD.ewp, is intended for EWARM v4.4x. To view this example, start an instance of IAR EWARM v4.4x, and open the workspace file LPC2148-SK-OS-ProbeLCD.eww. To do this, select the Open menu command under the File menu, select the Workspace submenu command and select the workspace file after navigating to the project directory. The project tree shown in Figure 2-4 should appear. (In addition, the workspace should be openable by doubleclicking on the file itself in a Windows Explorer window.) The second example project, LPC2148-SK-OS-Probe-LCD-v5-2.ewp, is intended for EWARM v5.2x. To view this example, start an instance of IAR EWARM v5.2x, and open the workspace file LPC2148-SK-OSProbe-LCD-v5-2.eww. To do this, select the Open menu command under the File menu, select the Workspace submenu command and select the workspace file after navigating to the project directory. The project tree for this project will be essentially identical to the project tree for the EWARM v5.2x project. IAR EWARM Versions Be certain to open the proper project for your version of EWARM. IAR EWARM v4.4x will NOT open a v5.2x project. And though IAR EWARM v5.2x will open a v4.4x project, many errors will be generated upon compilation.

2.03.01

Project Options

The IAR projects are setup to compile in ARM mode. However, both could be re-configured to generate 16-bit Thumb instructions wherever possible, thereby reducing code size. This setting may be changed by opening the project settings dialog box. To display this dialog box, choose the Options menu item from the Project menu. The location of the configuration option within this dialog is different for EWARM v4.4x and EWARM v5.2x; Figures 2-3 highlight this location for both toolchain versions.

11

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Figure 2-3. IAR EWARM Project Tree for LPC2148-SK-OS-Probe-LCD.ewp.


Once the connections described in Section 2.01 are made between your PC and the LPC2148-SK Evaluation Board, the code can be built and loaded onto the board. To build the code, choose the Rebuild All menu item from the Project menu. To load the code through the J-TAG debugger onto the connected evaluation board, select the Debug menu item from the Project menu. The project is setup to use a J-Link debugger; if you wish to use a different debugger, please select the appropriate DLL in the project options dialog box (select Debugger in the list box).

12

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Figure 2-4. Project Options: ARM/Thumb Selection. EWARM v4.4x (left); EWARM v5.2x (right) 2.03.02 C/OS-II Kernel Awareness

When running the IAR C-Spy debugger, the C/OS-II Kernel Awareness Plug-In can be used to provide useful information about the status of C/OS-II objects and tasks. If the C/OS-II Kernel Awareness Plug-In is currently enabled, then a C/OS-II menu should be displayed while debugging. Otherwise, the plug-in can be enabled. Stop the debugger (if it is currently active) and select the Options menu item from the Project menu. Select the Debugger entry in the list box and then select the Plugins tab pane. Find the C/OS-II entry in the list and select the check box beside the entry, as shown in Figure 24. When the code is reloaded onto the evaluation board, the C/OS-II menu should appear. Options are included to display lists of kernel objects such as semaphores, queues, and mailboxes, including for each entry the state of the object. Additionally, a list of the current tasks may be displayed, including for each task pertinent information such as used stack space, task status, and task priority, in addition to showing the actively executing task. An example task list for this project is shown in Figure 2-5.

13

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Figure 2-5. Enabling the C/OS-II Kernel Awareness Plug-In (v4.4x)

Figure 2-6. C/OS-II Task List for LPC2148-SK-OS-Probe-LCD.ewp

14

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

2.04

Example Applications

The example applications contain application tasks which respond to the push buttons and toggle the LEDs. In addition, either can be used with the Micrims real-time monitor, C/Probe, as covered in Section 6.

2.04.01

Application Information

When the example application is started, a summary of the current C/OS-II state is displayed on the LCD screen (as shown in Figure 2-7). Successive presses of PB1 will progress the LCD through a series of screens, shown in Figures 2-8 through 2-11. If the push button is pressed after Screen 5, shown in Figure 2-11 is reached, Screen 1 will again be shown. Screen 2 displays the version of C/OS-II currently running on the target and its tick timer frequency. Screen three shows the percent CPU usage and CPU clock speed. Two cumulative measures are shown in Screen 4: the number of ticks and the number of context switches that have occurred since C/OS-II began running. S Pressing PB2 will toggle the LCD backlight.

Figure 2-7, Screen 1

Figure 2-8, Screen 2: C/OS-II Version Number and Tick Rate

Figure 2-9, Screen 3: CPU Usage and CPU Speed

Figure 2-10, Screen 4: Cumulative Ticks and Context Switches

Figure 2-11, Screen 5: Evaluation Board Inputs

15

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Stack Out of Range Notification While debugging this project (or any other C/OS-II project), IAR may log a SVC stack pointer out-of-range notification in the Debug Log window. This is actually normal behavior and does NOT indicate an error. IAR EWARM does not understand that the SVC stack pointer points to the stack for the current task stack.

2.04.02

Additional Application Information

The project is configured so that code is loaded into Flash and the stacks and data are loaded into RAM, as shown in Table 2-1. The tasks that run in the example application are listed in Table 2-2. Memory Range 0x00000000-0x0007CFFF 0x40000000-0x40007FFF Size 500 kB 32 kB Segment(s) Code (in Flash) Stacks and data (in RAM)

Table 2-1. Memory Setup


Task Name App_TaskStart() Start Task App_TaskKbd() Keyboard App_TaskUserIF() User I/F uC/Probe OS KSD LED Task Probe RS-232 uC/OS-II Tmr uC/OS-II Stat uC/OS-II Idle Priority 5 6 7 8 10 11 29 30 31 Function Initializes C/Probe; reads potentiometer input. Reads status of push buttons, passing new input to AppTaskUserIF(). Updates LCD. Updates CPU usage for C/Probe. IAR Kickstart kit demo example for demo version of C/Probe Parses packets from C/Probe. Manages timers. Collect stack usage statistics. Executes when no other task is executing.

Table 2-2. Example Application Tasks

16

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

PB1 PB2 Pot.

GPIO0.15 GPIO0.16 GPIO0.30 (AD0.1)

UART1 GPIO0.8-9

C/Probe

LPC2148

GPIO0.31

DATA R/W

Figure 2-11. Example Application Hardware Use

GPIO0.10-13

GPIO0.23

GPIO0.21

LCD

GPIO0.26 17

RS

Light

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

3.

Directories and Files

Application Notes
\Micrium\AppNotes\AN1xxx-RTOS\AN1014-uCOS-II-ARM This directory contains AN-1014.pdf, the application note describing the ARM port for C/OS-II, and AN-1014-PPT.pdf, a supplement to AN-1014.pdf. \Micrium\AppNotes\AN1xxx-RTOS\AN1148-uCOS-II-NXP-LPC2148 This directory contains this application note, AN-1148.pdf.

Licensing Information
\Micrium\Licensing Licensing agreements are located in this directory. Any source code accompanying this appnote is provided for evaluation purposes only. If you choose to use C/OS-II in a commercial product, you must contact Micrim regarding the necessary licensing.

C/OS-II Files
\Micrium\Software\uCOS-II\Doc This directory contains documentation for C/OS-II. \Micrium\Software\uCOS-II\Ports\ARM\Generic\IAR This directory contains the standard processor-specific files for the generic C/OS-II ARM port assuming the IAR toolchain . These files could easily be modified to work with other toolchains (i.e., compiler/assembler/linker/locator/debugger); however, the modified files should be placed into a different directory. The following files are in this directory: os_cpu.h os_cpu_a.asm os_cpu_c.c os_dcc.c os_dbg.c With this port, C/OS-II can be used in either ARM or Thumb mode. Thumb mode, which drastically reduces the size of the code, was used in this example, but compiler settings may be switched (as discussed in Section 2.30) to generate ARM-mode code without needing to change either the port or the application code. The ARM/Thumb port is described in application note AN1014 which is available from the Micrium web site. \Micrium\Software\uCOS-II\Source This directory contains the processor-independent source code for C/OS-II.

C/Probe Files
\Micrium\Software\uC-Probe\Communication\Generic\ This directory contains the C/Probe generic communication module, the target-side code responsible for responding to requests from the C/Probe Windows application (including requests over RS-232). \Micrium\Software\uC-Probe\Communication\Generic\Source 18

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

This directory contains probe_com.c and probe_com.h, the source code for the generic communication module. \Micrium\Software\uC-Probe\Communication\Generic\OS\uCOS-II This directory contains probe_com_os.c, which is the C/OS-II port for the C/Probe generic communication module. \Micrium\Software\uC-Probe\Communication\Generic\Source\RS-232 This directory contains the RS-232 specific code for C/Probe generic communication module, the target-side code responsible for responding to requests from the C/Probe Windows application over RS-232 \Micrium\Software\uC-Probe\Communication\Generic\Source\RS-232\Source This directory contains probe_rs232.c and probe_rs232.h, the source code for the generic communication module RS-232 code. \Micrium\Software\uC-Probe\Communication\Generic\Source\RS-232\Ports\NXP\LPC21XX This directory contains probe_rs232c.c and probe_rs232c.h, the NXP LPC21xx port for the RS-232 communications. \Micrium\Software\uC-Probe\Communication\Generic\Source\RS-232\OS\uCOS-II This directory contains probe_rs232_os.c, which is the C/OS-II port for the C/Probe RS-232 communication module. \Micrium\Software\uC-Probe\Target\Demo\KSD\Source This directory contains ksd.c and ksd.h, the source code for the IAR Kickstart kits demo example for the demo version of C/Probe. \Micrium\Software\uC-Probe\Target\Demo\KSD\Workspace This directory contains OS-Probe-Kickstart-Demo-Workspace.wsp which is the generic C/Probe workspace the IAR Kickstart kits demo example for the demo version of C/Probe.

C/LCD Files
\Micrium\Software\uC-LCD\Source This directory contains the processor- and RTOS-independent source code for C/LCD. \Micrium\Software\uC-LCD\OS\uCOS-II This directory contains the C/OS-II port for C/LCD.

C/CPU Files
\Micrium\Software\uC-CPU This directory contains cpu_def.h, which declares #define constants for CPU alignment, endianness, and other generic CPU properties.

\Micrium\Software\uC-CPU\ARM\IAR This directory contains cpu.h and cpu_a.s. cpu.h defines the Micrim portable data types for 8-, 16-, and 32-bit signed and unsigned integers (such as CPU_INT16U, a 16-bit unsigned integer). These allow code to be independent of processor and compiler word size definitions. cpu_a.s contains generic assembly code for ARM7 and ARM9 processors which is used to enable and 19

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

disable interrupts within the operating system. This code is called from C with OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL().

C/LIB Files
\Micrium\Software\uC-LIB This directory contains lib_def.h, which provides #defines for useful constants (like DEF_TRUE and DEF_DISABLED) and macros. \Micrium\Software\uC-LIB\Doc This directory contains the documentation for C/LIB.

Application Code
\Micrium\Software\EvalBoards\NXP\LPC2148-SK\IAR\OS-Probe-LCD This directory contains the source code for the C/OS-II, C/Probe and C/LCD example application: app.c contains the test code for the example application including calls to the functions that start multitasking within C/OS-II, register tasks with the kernel, and update the user interface (the LCD). app_cfg.h is a configuration file specifying stack sizes and priorities for all user tasks and #defines for important global application constants. includes.h is the master include file used by the application. os_cfg.h is the C/OS-II configuration file. LPC2148-SK-OS-Probe-LCD-Workspace.wsp is an example C/Probe workspace. LPC2148-SK-OS-Probe-LCD.* are the IAR EWARM v4.4x project files. LPC2148-SK-OS-Probe-LCD-v5.* are the IAR EWARM v5.1x project files. LPC2148-SK-OS-Probe-LCD-v5-2.* are the IAR EWARM v5.2x project files. OS-Probe-Kickstart-Demo-Workspace.wsp is the IAR Kickstart Kits Demo C/Probe workspace.

\Micrium\Software\EvalBoards\NXP\LPC2148-SK\IAR\BSP This directory contains the Board Support Package for the LPC2148-SK evaluation board: bsp.c contains the board support package functions which initialize critical processor functions (e.g., the PLL) and provide support for peripherals such as the push buttons and LCD. bsp.h contains prototypes for functions that may be called by the user. cstartup.s79 is the IAR EWARM v4.4x startup file. This file performs critical processor initialization (such as the initialization of task stacks), readying the platform to enter main(). cstartup.s is the IAR EWARM v5.xx startup file. This file performs critical processor initialization (such as the initialization of task stacks), readying the platform to enter main(). LPC2148_Flash.xcl is a IAR EWARM v4.4x linker file which contains information about the placement of data and code segments in the processors memory map. LPC2148_Flash.icf is a IAR EWARM v5.xx linker file which contains information about the placement of data and code segments in the processors memory map.

20

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

4.

Application Code

The example application described in this appnote, AN-1148, is a simple demonstration of C/OS-II and C/Probe for the NXP LPC2148 processor on the LPC2148-SK evaluation board. The basic procedure for setting up and using each of these can be gleaned from an inspection of the application code contained in app.c, which should serve as a beginning template for further use of these software modules. Being but a basic demonstration of software and hardware functionality, this code will make evident the power and convenience of C/OS-II The Real-Time Kernel used on the NXP LPC2148 processor without the clutter or confusion of a more complex example.

4.01

app.c

Five functions of interest are located in app.c: 1. main() is the entry point for the application, as it is with most C programs. This function initializes the operating system, creates the primary application task, AppTaskStart(), begins multitasking, and exits. 2. AppTaskStart(), after creating the user interface tasks, enters an infinite loop in which updates a global variable with the potentiometer input. 3. AppTaskKbd() monitors the current state of the push buttons. When the left-hand push button is pressed, this task will post a message to AppTaskUserIF(), which will change the LCD message. When the right-hand push button is pressed, this task will toggle the LCD backlight. 4. AppTaskUserIF() updates the LCD. 5. AppTaskProbeStr() outputs strings to the C/Probe Windows application via RS-232, which will appear in the Serial Output window. For more information, see Section 6.

21

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU void main (void) { CPU_INT08U err; BSP_IntDisAll(); OSInit(); /* Note 1 */

/* Note 2 */ /* Note 3 */

OSTaskCreateExt((void (*)(void *)) App_TaskStart, /* Note 4 */ (void *) 0, (OS_STK *)&App_TaskStartStk[APP_CFG_TASK_START_STK_SIZE - 1], (INT8U ) APP_CFG_TASK_START_PRIO, (INT16U ) APP_CFG_TASK_START_PRIO, (OS_STK *)&App_TaskStartStk[0], (INT32U ) APP_CFG_TASK_START_STK_SIZE, (void *)0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); #if OS_TASK_NAME_SIZE > 13 OSTaskNameSet(APP_TASK_START_PRIO, "Start Task", &err); #endif OSStart(); } /* Note 5 */

/* Note 6 */

Listing 4-1, main()


Listing 4-1, Note 1: As with most C applications, the code starts in main(). Listing 4-1, Note 2: All interrupts are disabled to make sure the application does not get interrupted until it is fully initialized. Listing 4-1, Note 3: OSInit() must be called before creating a task or any other kernel object, as must be done with all C/OS-II applications. Listing 4-1, Note 4: At least one task must be created (in this case, using OSTaskCreateExt() to obtain additional information about the task). In addition, C/OS-II creates either one or two internal tasks in OSInit(). C/OS-II always creates an idle task, OS_TaskIdle(), and will create a statistic task, OS_TaskStat() if you set OS_TASK_STAT_EN to 1 in os_cfg.h. Listing 4-1, Note 5: As of V2.6x, you can now name C/OS-II tasks (and other kernel objects) and display task names at run-time or with a debugger. In this case, the AppTaskStart() is given the name Start Task. Because C-Spy can work with the Kernel Awareness Plug-In available from Micrim, task names can be displayed during debugging. Listing 4-1, Note 6: Finally multitasking under C/OS-II is started by calling OSSTart(). C/OS-II will then begin executing AppTaskStart() since that is the highest-priority task created (both OS_TaskStat() and OS_TaskIdle() having lower priorities).

22

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

static void AppTaskStart (void *p_arg) { (void)p_arg; BSP_Init(); #if (OS_TASK_STAT_EN > 0) OSStatInit(); #endif #if (APP_CFG_PROBE_OS_PLUGIN_EN == DEF_ENABLED) || \ (APP_CFG_PROBE_COM_EN == DEF_ENABLED) App_ProbeInit(); #endif BSP_LED_Off(0); App_EventCreate(); App_TaskCreate(); while (DEF_TRUE) { OSTimeDlyHMSM(0, 0, 1, 0); #if (APP_CFG_LCD_EN == DEF_ENABLED) App_ADC = (BSP_ADC_GetStatus(1) * 100) / 1024; #endif } } /* Note 5 */ /* Note 4 */ /* Note 1 */ /* Note 2 */ /* Note 3 */

Listing 4-2, AppTaskStart()


Listing 4-2, Note 1: BSP_Init() initializes the Board Support Packagethe I/Os, tick interrupt, etc. See Section 5 for details. Listing 4-2, Note 2: OSStatInit() initializes C/OS-IIs 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 performs stack checking for all the tasks that have been created with OSTaskCreateExt() with the stack checking option set. Listing 4-2, Note 3: App_ProbeInit initializes C/Probe module. OSProbe_Init() initializes the C/Probe plug-in for C/OS-II, which maintains CPU usage statistics for each task. ProbeCom_Init() initializes the C/Probe generic communication module; ProbeRS232_Init() initializes the RS-232 communication module. After these have been initialized, the C/Probe Windows program will be able to download data from the processor. For more information, see Section 6. Additionally, KSD_Init() Initializes the IAR Kickstart kit demo (KSD) for the demo version of C/Probe. (See AN-9913). Listing 4-2, Note 4: The application events and task are created. A mailbox provides the communication between the two application tasks, App_TaskKbd() and App_TaskUserIF(). When a push button pressed, App_TaskKbd() will send a message using App_UserIF_Mbox to App_TaskUserIF() containing the current screen of the user interface and then App_TaskUserIF()will updated the LCD based on this value Listing 4-2, Note 5: Any task managed by C/OS-II must either enter an infinite loop waiting for some event to occur or terminate itself. This task enters an infinite loop in which the A/D input from the potentiometer is stored in a global variable.

23

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

4.02

os_cfg.h

The file os_cfg.h is used to configure C/OS-II and defines the maximum number of tasks that your application can have, which services 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 #define that you can set in this file. Each entry is commented and additional information about the purpose of each #define can be found in Jean Labrosses book, C/OS-II, The Real-Time Kernel, 2nd Edition. os_cfg.h assumes you have C/OS-II V2.83 or higher but also works with previous versions of C/OS-II. OS_APP_HOOKS_EN is set to 1 so that the cycle counters in the OS_TCBs will be maintained. Task sizes for the Idle (OS_TASK_IDLE_STK_SIZE), statistics OS_TASK_STAT_STK_SIZE) and timer (OS_TASK_TMR_STK_SIZE) task are set to 128 OS_STK elements (each is 4 bytes) and thus each task stack is 512 bytes. If you add code to the examples make sure you account for additional stack usage. OS_DEBUG_EN is set to 1 to provide valuable information about C/OS-II objects to IARs C-Spy through the Kernel Awareness plug-in. Setting OS_DEBUG_EN to 0 should some code space (though it will not save much). OS_LOWEST_PRIO is set to 31, allowing up to 32 total tasks. OS_MAX_TASKS determines the number of application tasks and is currently set to 16 allowing 9 more tasks to be added to the example code. OS_TICKS_PER_SEC is set to 1000 Hz. This value can be changed as needed and the proper tick rate will be adjusted in bsp.c if you change this value. You would typically set the tick rate between 10 and 1000 Hz. The higher the tick rate, the more overhead C/OS-II will impose on the application. However, you will have better tick granularity with a higher tick rate.

24

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

5.

Board Support Package (BSP)

The Board Support Package (BSP) provides functions to encapsulate common I/O access functions and make porting your application code easier. Essentially, these files are the interface between the application and the LPC2148-SK evaluation board. Though one file, bsp.c, contains some functions which are intended to be called directly by the user (all of which are prototyped in bsp.h), the other files serve the compiler (as with cstartup.s79).

5.01

IAR EWARM v4.4x-Specific BSP Files

The BSP includes two files intended specifically for use with IAR EWARM v4.4x: LPC2148_Flash.xcl and cstartup.s79. These serve to define the memory map and initialize the processor prior to loading or executing code. If the example application is to be used with other toolchains, the services provided by these files must be replicated as appropriate. Before the processor memories can be programmed, the compiler must know where code and data should be placed. IAR requires a linker command file, such as LPC2148_Flash, that provides directives to accomplish this. With this file, the data and execution stacks are mapped to RAM while code is mapped to flash. In cstartup.s79 is code which will be executed prior to calling main. One important inclusion is the specification of the exception vector table (as required for ARM cores) and the setup of various exception stacks. After executing, this function branches to the IAR-specific ?main function, in which the processor is further readied for entering application code.

5.02

IAR EWARM v5.1x-Specific BSP Files

The BSP includes two files intended specifically for use with IAR EWARM v5.1x: LPC2148_Flash.icf and cstartup.s. These files serve the same purpose as their IAR EWARM v4.4x counterparts. The linker specification file (extension *.icf for EWARM v5.1x) uses a completely different format than its predecessor (extension *.xcl for EWARM v4.4x), but the information is essentially identical. Except for some minor changes to the EWARM v5.1x assembler, cstartup.s is basically identical to cstartup.s79.

25

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

5.03

BSP, bsp.c and bsp.h

The file bsp.c implements several global functions, each providing some important service, be that the initialization of processor functions for C/OS-II to operate or the toggling of an LED. Several local functions are defined as well to perform some atomic duty, initializing the I/O for the LED or initialize the C/OS-II tick timer. The discussion of the BSP will be limited to the discussion of the global functions that might be called from user code (and may be called from the example application). The global functions defined in bsp.c (and prototyped in bsp.h) may be roughly divided into two categories: critical processor initialization and user interface services. Three functions constitute the former: BSP_Init() is called by the application code to initialize critical processor features (particularly the C/OS-II tick interrupt) after multitasking has started (i.e., OS_Start() has been called). This function should be called before any other BSP functions are used. See Listing 5-1 for more details. BSP_IntDisAll() is called to disable all interrupts, thereby preventing any interrupts until the processor is ready to handle them. BSP_CPU_ClkFreq() returns the clock frequency in Hz. BSP_CPU_PclkFreq() returns the peripheral clock frequency in Hz. Four function provide access to user interface components: BSP_LED_Toggle(), BSP_LED_On() and BSP_LED_Off() will toggle, turn on, and turn off (respectively) the LED corresponding to the ID passed as the argument If an argument of 0 is provided, the appropriate action will be performed on all LEDs. The valid ID is 1, corresponding to the LCD backlight. BSP_PB_GetStatus() takes as its argument the ID of a push button and returns DEF_TRUE if the push button is being pressed and DEF_FALSE if the push button is not being pressed. Valid IDs are 1 and 2.

26

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

5.04
void {

Processor Initialization Functions

BSP_Init (void) = 1 /* Note 1 */

MEMMAP

BSP_PLL_Init(); BSP_MAM_Init(); BSP_IO_Init(); BSP_VIC_Init(); BSP_LED_Init(); BSP_ADC_Init(); BSP_Tmr_TickInit(); #ifdef DISP_MODULE_PRESENT BSP_Tmr1_Init(); #endif }

/* Note 3 */

Listing 5-1, BSP_Init()


Listing 5-1, Note 1: The PLL, Memory Acceleration module(MAM), the I/O ports, Vectore Interrupt Controller (VIC), the LEDs and the ADC are initialized. Listing 5-1, Note 2: The C/OS-II tick interrupt source is initialized. Listings 5-2 and 5-3 give the C/OS-II timer tick initialization function, Tmr_TickInit(), the tick ISR handler, Tmr_TickISR_Handler(). These may serve as examples for initializing an interrupt and servicing that interrupt.
static void BSP_Tmr_TickInit (void) { CPU_INT32U pclk_freq; CPU_INT32U tmr_reload; /* Note 1 */ VICIntSelect &= ~(1 << VIC_TIMER0); VICVectAddr2 = (CPU_INT32U)BSP_Tmr_TickISR_Handler; VICVectCntl2 = 0x20 | VIC_TIMER0; VICIntEnable = (1 << VIC_TIMER0); /* Note 2 */ pclk_freq tmr_reload T0TCR T0PC T0MR0 T0MCR T0CCR T0EMR T0TCR } = = = = BSP_CPU_PclkFreq(); pclk_freq / OS_TICKS_PER_SEC; 0; 0; /* Note 3 */

= tmr_reload; = 3; = 0; = 0; = 1;

Listing 5-2, BSP_Tmr_TickInit()


27

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Listing 5-2, Note 1: The tick ISR handler is programmed into the VIC and the interrupt is enabled. Listing 5-2, Note 2: The timer reload value is calculated using the peripheral clock frequency and desired tick rate. Listing 5-2, Note 3: The reload value is programmed into the match compare register 0 and the match compare interrupt is enabled.

void BSP_Tmr_TickISR_Handler (void) { T0IR = 0xFF; OSTimeTick(); }

/* Note 1 */ /* Note 2 */

Listing 5-3, BSP_Tmr_TickISR_Handler()


Listing 5-3, Note 1: The timer interrupt is cleared. Listing 5-3, Note 2: OSTimeTick() informs C/OS-II of the tick interrupt.

28

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

6.

C/Probe

C/Probe is a Windows program which retrieves the values of global variables from a connected embedded target and displays the values in a engineer-friendly format. To accomplish this, an ELF file, created by the users compiler and containing the names and addresses of all the global symbols on the target, is monitored by C/Probe. The user places components (such as gauges, labels, and charts) into a Data Screen in a C/Probe workspace and assigns each one of these a variable from the Symbol Browser, which lists all symbols from the ELF file. The symbols associated with components placed on an open Data Screen will be updated after the user presses the start button (assuming the users PC is connected to the target). C/Probe currently interfaces with a target processor with a RS-232. A small section of code resident on the target receives commands from the Windows application and responds to those commands. The commands ask for a certain number of bytes located at a certain address, for example, Send 16 bytes beginning at 0x0040102C. The Windows application, upon receiving the response, updates the appropriate component(s) on the screens with the new values.

Start Button.
This button switches between Design and Run-Time Views. During Run-Time View (when data is collected), this will appear as a stop button (a blue square).

Data Screen.
Components are placed onto the data screen and assigned symbols during Design View. During RunTime View, these components are updated with values of those symbols from the target

Symbol Browser.
Contains all symbols from the ELF files added to the workspace.

Figure 6-1. C/Probe Windows Program

29

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

To use C/Probe with the example project (or your application), do the following: 1. Download and Install C/Probe. A trial version of C/Probe can be downloaded from the Micrim website at http://www.micrium.com/products/probe/probe.html IAR Kickstart Kits Users If this development board is part of the IAR Kickstart Kit a demo version of C/Probe is already included in the installation CD. Please refer to the application note AN-9913 for more details in how to use the demo version of C/Probe with the IAR Kickstart kits. 2. Open C/Probe. After downloading and installing this program, open the example C/Probe workspace for C/OS-II, named OS-Probe-Workspace.wsp, which should be located in your installation directory at /Program Files//Micrium/uC-Probe/Target/Plugins/uCOS-II/Workspace 3. Connect Target to PC. Currently, C/Probe can use RS-232 to retrieve information from the target. You should connect a RS-232 cable between your target and computer. 4. Load Your ELF File. The example projects included with this application note are already configured to output an ELF file. (If you are using your own project, please refer to Appendix A of the C/Probe user manual for directions for generating an ELF file with your compiler.) This file should be in /<Project Directory>/<Configuration Name>/exe/ where <Project Directory> is the directory in which the IAR EWARM project is located (extension *.ewp) and <Configuration Name> is the name of the configuration in that project which was built to generate the ELF file and which will be loaded onto the target. The ELF file will be named <Project Name>.elf in EWARM v4.4x and <Project Name>.out in EWARM v5.1x unless you specify otherwise. To load this ELF file, right-click on the symbol browser and choose Add Symbols. 5. Configure the RS-232 Options. In C/Probe, choose the Options menu item on the Tools menu. A dialog box as shown in Figure 6-2 (left) should appear. Choose the RS-232 radio button. Next, select the RS-232 item in the options tree, and choose the appropriate COM port and baud rate. The baud rate for the projects accompanying this appnote is 115200. 6. Start Running. You should now be ready to run C/Probe. Just press the run button ( ) to see the variables in the open data screens update. Figure 6-3 displays a screen in the C/OS-II workspace which displays detailed information about each tasks state.

30

Figure 6.2. C/Probe Options

Figure 6-3. C/Probe Run-Time: C/OS-II Task Information

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

7.

C/LCD

C/LCD is a software module that allows you to interface with character LCD (Liquid Crystal Display) modules. This software package works with just about any character module based on the Hitachi HD44780 Dot Matrix LCD Controller & Driver. The module allows you to: Control LCD modules containing up to 80 characters; Display ASCII characters; Display ASCII strings; Define up to eight symbols based on a 5x7 dot matrix; and Display bar graphs.

32

Micrim
C/OS-II, C/Probe and C/LCD for the NXP LPC2148 CPU

Licensing
C/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful research. If you plan on using C/OS-II in a commercial product you need to contact Micrim to properly license its use in your product. We provide ALL the source code with this application note for your convenience and to help you experience C/OS-II. The fact that the source is provided does NOT mean that you can use it without paying a licensing fee. Please help us continue to provide the Embedded community with the finest software available. Your honesty is greatly appreciated.

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

Contacts
IAR Systems Century Plaza 1065 E. Hillsdale Blvd Foster City, CA 94404 USA +1 650 287 4250 +1 650 287 4253 (FAX) e-mail: [email protected] WEB : http://www.IAR.com Micrim 949 Crestview Circle Weston, FL 33327 USA +1 954 217 2036 +1 954 217 2037 (FAX) e-mail: [email protected] WEB : http://www.Micrium.com NXP 1110 Ringwood Court San Jose, CA 95131 +1 408 474 8142 WEB: www.nxp.com

33

You might also like