Specifications
30 RabbitCore RCM2100
4.5 Sample Program: FlashLEDs.c
In addition to Dynamic C’s implementation of C-language programming for embedded
systems, it supports assembly-language programming for very efficient processor-level
control of the module hardware and program flow. This application is similar to
FlashLED.c and ToggleLEDs.c, but uses assembly language for the low-level port
control within cofunctions, another powerful multitasking tool.
Compile & Run Program
Open the source file FlashLEDs.c, located in the Samples\RCM2100 folder. Press F9
to compile and run the program.
All the LEDs on the Prototyping Board (including DS4 and DS5, if you have installed
them) will light. DS2 and DS3 will begin flashing at different rates, and will continue
doing so until the program is interrupted.
Program Description
Dynamic C permits the use of assembly language statements within C code. This program
creates three functions using assembly language statements, then creates a C cofunction to
call two of them. That cofunction is then called within main().
Within each of the C-like functions, the #asm and #endasm directives are used to indicate
the beginning and end of the assembly language statements.
In the function initialize_ports( ), port A is initialized to be all outputs while bit 0
of port E is initialized to be an output.
In the function ledon( ), a 0 is written to the port A bit corresponding to the desired
LED (0, which equals DS3, or 1 which equals DS4), turning that LED on. The
ledoff( ) function works exactly the same way except that a 1 is written to the bit,
turning the selected LED off.
Finally, in the cofunction flashled( ), the LED to be flashed, the on time in millisec-
onds, and the off time in milliseconds are passed as arguments. This function uses an end-
less for(;;) loop to call the ledon( ) and ledoff( ) functions, separated by calls to
the wait function DelayMs( ). This sequence will make the indicated LED flash on and
off.
As is proper in C program design, the contents of main( ) are almost trivial. The pro-
gram first calls initialize_ports(), then begins an endless for(;;) loop. Within
this loop, the program:
1. Calls the library function hitwd(), which resets the microprocessor’s watchdog timer.
(If the watchdog timer is not reset every so often, it will force a hard reset of the sys-
tem. The purpose is to keep an intermittent program or hardware fault from locking up
the system. Normally, this function is taken care of by the Virtual Driver, but it is called
explicitly here).