cmsis rtos demo

Dependencies:   mbed-rtos mbed

main.cpp

Committer:
cnhzcy14
Date:
2013-01-06
Revision:
1:8289e2db9449
Parent:
0:9a66107976a4

File content as of revision 1:8289e2db9449:

/******************************************************************************
 * DESCRIPTION:
 *   Example code for using CMSIS RTOS Signal.  The main thread
 *   creates three threads.  Two of those threads increment a "count" variable,
 *   while the third thread watches the value of "count".  When "count"
 *   reaches a predefined limit, the waiting thread is signaled by one of the
 *   incrementing threads. The waiting thread "awakens" and then modifies
 *   count. The program continues until the incrementing threads reach
 *   TCOUNT. The main program prints the final value of count.
 * SOURCE: Adapted from example code in "Pthreads Programming", B. Nichols
 *   et al. O'Reilly and Associates.
 * MODIFICATOR: (Simon) CHENG Ye
 * LAST REVISED: 06/JAN/2013
 ******************************************************************************/

#include "mbed.h"
#include "cmsis_os.h"

#define NUM_THREADS  3
#define TCOUNT 10
#define COUNT_LIMIT 12

int     count = 0;
osMutexId count_mutex;
osMutexDef(count_mutex);

struct thread_data
{
    osThreadId id;
    long  my_id;
};

struct thread_data thread_data_array[NUM_THREADS-1];
Serial debug(USBTX, USBRX);

void inc_count(void const *threadarg)
{
    int i;
    long my_id;
    osThreadId id;
    struct thread_data *my_data;
    my_data = (struct thread_data *) threadarg;
    id = my_data->id;
    my_id = my_data->my_id;

    for (i=0; i < TCOUNT; i++) {
        osMutexWait(count_mutex, osWaitForever);
        count++;

        /*
         * Check the value of count and signal waiting thread when condition is
         * reached.  Note that this occurs while mutex is locked.
         */
        if (count == COUNT_LIMIT)
        {
            printf("inc_count(): thread %ld, count = %d  Threshold reached. ",
                    my_id, count);
            osSignalSet(id, 0x1);
            printf("Just sent signal.\n");
        }
        printf("inc_count(): thread %ld, count = %d, unlocking mutex\n",
                my_id, count);
        osMutexRelease(count_mutex);

        /* Do some work so threads can alternate on mutex lock */
        osDelay(1000);
    }
    id = osThreadGetId();
    osThreadTerminate(id);
}

void watch_count(void const *t)
{
    osThreadId id;
    long my_id = (long)t;

    printf("Starting watch_count(): thread %ld\n", my_id);

    /*
     * Lock mutex and wait for signal.  Note that the pthread_cond_wait routine
     * will automatically and atomically unlock mutex while it waits.
     * Also, note that if COUNT_LIMIT is reached before this routine is run by
     * the waiting thread, the loop will be skipped to prevent pthread_cond_wait
     * from never returning.
     */
    osMutexWait(count_mutex, osWaitForever);
    while (count < COUNT_LIMIT)
    {
        osMutexRelease(count_mutex);
        printf("watch_count(): thread %ld Count= %d. Going into wait...\n", my_id,count);
        osSignalWait(0x1, osWaitForever);
        osMutexWait(count_mutex, osWaitForever);
        printf("watch_count(): thread %ld Condition signal received. Count= %d\n", my_id,count);
        printf("watch_count(): thread %ld Updating the value of count...\n", my_id);
        count += 125;
        printf("watch_count(): thread %ld count now = %d.\n", my_id, count);
        osMutexRelease(count_mutex);
    }
    printf("watch_count(): thread %ld Unlocking mutex.\n", my_id);
    //osMutexRelease(count_mutex);
    id = osThreadGetId();
    osThreadTerminate(id);
}

void th0(void const *argument) {watch_count(argument);}
osThreadDef(th0, osPriorityNormal, DEFAULT_STACK_SIZE);

void th1(void const *argument) {inc_count(argument);}
osThreadDef(th1, osPriorityNormal, DEFAULT_STACK_SIZE);

void th2(void const *argument) {inc_count(argument);}
osThreadDef(th2, osPriorityNormal, DEFAULT_STACK_SIZE);

int main(int argc, char *argv[])
{
    debug.baud(57600);
    long t1=1, t2=2, t3=3;
    osThreadId id;

    /* Initialize mutex objects */
    count_mutex = osMutexCreate(osMutex(count_mutex));

    id = osThreadCreate(osThread(th0), (void *)t1);
    thread_data_array[0].id = id;
    thread_data_array[0].my_id = t2;
    thread_data_array[1].id = id;
    thread_data_array[1].my_id = t3;
    osThreadCreate(osThread(th1), (void *)&thread_data_array[0]);
    osThreadCreate(osThread(th2), (void *)&thread_data_array[1]);

    printf ("Main(): Waited and joined with %d threads. Final value of count = %d. Done.\n",
            NUM_THREADS, count);
}