News

Nov 29, 2012
Chibios Essentials article added
Nov 6, 2012
 
ATL123 Embedded Systems

Blog

Nov 13, 2012 Posted by: jscott

GCC has many Optimization options.  Choosing wisely at different phases of your development cycle will help make the test/debug phase of your project easier and allow you to ship a smaller, faster program.
 

Comments??

 Add a Review of this item 
Comment Title:
Your Name:
Your Email Address:
Additional Comments:
 
This is a captcha-picture. It is used to prevent mass-access by robots. (see: www.captcha.net)
 
 

Essential elements to a Chibios program

Adding an RTOS to an existing application can be a very complex process.  While in many cases, this will involve re-architecting the application to get the full benefit, the initial steps can be quickly implemented.  An easy first step is to look over your application and find a functional block that is easy to separate from other logic.

Once that is done, we can start making changes to your code.

First we add a couple of headers.

// chibios specific include files
#include "ch.h"
#include "hal.h"

Next we need to seperate the independent functionallity and turn it into a standalone function that will become a task.  An example of this is the function below that simply flashes an LED.

/*
 * GREEN blinker thread, times are in milliseconds.
 *
 * This function will become a thread that will execute independent
 *  of the other threads.  We will call this thread 2
 *
 */
 
// This macro creates the working space and stack space for thread 2 
static WORKING_AREA(waThread2, 128); 

// This function will become the code for thread 2
static msg_t Thread2(void *arg)
{
    (void)arg;
    chRegSetThreadName("Green Blinker");
    while (TRUE)
    {
        palClearPad(GPIOD, GPIOD_LED4);     // PD12 - Green LED
        chThdSleepMilliseconds( 20 );      // delay 200mS
        palSetPad(GPIOD, GPIOD_LED4);       // PD12 - Green LED
        chThdSleepMilliseconds( 20 );      // delay 200mS
    }
    return 0;
}

Once that is taken care of we need to add some code to the main() function.  First we need to call the functions to initialize the Hardware Abstraction Layer (HAL) and the Chibios kernel.

    /*
     * System initializations.
     * - HAL initialization, this also initializes the configured device drivers
     *	 and performs the board-specific initializations.
     * - Kernel initialization, the main() function becomes a thread and the
     *	 RTOS is active.
     */
    halInit();
    chSysInit();

Finally, we add code to create a thread out of the function we created above

    /*
     * Creates the blinker threads.
     */
    chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL);

If all went well, your application should behave much the same as it did, but the functionality that was selected to turn into a task will operate nearly as a separate program. By moving this file to a separate source module and reducing the number of global variables, program maintenance and debugging will become much easier.