CMSIS Example - Signal and Yield

  1 /*----------------------------------------------------------------------------
  2  *      RL-ARM - RTX
  3  *----------------------------------------------------------------------------
  4  *      Name:    RTX_EX2.C
  5  *      Purpose: RTX example program
  6  *----------------------------------------------------------------------------
  7  *
  8  * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
  9  * All rights reserved.
 10  * Redistribution and use in source and binary forms, with or without
 11  * modification, are permitted provided that the following conditions are met:
 12  *  - Redistributions of source code must retain the above copyright
 13  *    notice, this list of conditions and the following disclaimer.
 14  *  - Redistributions in binary form must reproduce the above copyright
 15  *    notice, this list of conditions and the following disclaimer in the
 16  *    documentation and/or other materials provided with the distribution.
 17  *  - Neither the name of ARM  nor the names of its contributors may be used 
 18  *    to endorse or promote products derived from this software without 
 19  *    specific prior written permission.
 20  *
 21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 24  * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
 25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 31  * POSSIBILITY OF SUCH DAMAGE.
 32  *---------------------------------------------------------------------------*/
 33 
 34 #include "cmsis_os.h"
 35 
 36 volatile uint16_t counter;            /* counter for main thread             */
 37 volatile uint16_t counter1;           /* counter for thread 1                */
 38 volatile uint16_t counter2;           /* counter for thread 2                */
 39 volatile uint16_t counter3;           /* counter for thread 3                */
 40 
 41 /* Thread IDs */
 42 osThreadId thread1_id;
 43 osThreadId thread2_id;
 44 osThreadId thread3_id;
 45 
 46 /* Forward reference */
 47 void job1 (void const *argument);
 48 void job2 (void const *argument);
 49 void job3 (void const *argument);
 50 
 51 /* Thread definitions */
 52 osThreadDef(job1, osPriorityAboveNormal, 1, 0);
 53 osThreadDef(job2, osPriorityNormal, 1, 0);
 54 osThreadDef(job3, osPriorityNormal, 1, 0);
 55 
 56 /*----------------------------------------------------------------------------
 57  *   Thread 1: 'job1'
 58  *---------------------------------------------------------------------------*/
 59 void job1 (void const *argument) {    /* higher priority to preempt job2     */
 60   while (1) {                         /* endless loop                        */
 61     counter1++;                       /* increment counter 1                 */
 62     osDelay(10);                      /* wait for timeout: 10ms              */
 63   }
 64 }
 65 
 66 /*----------------------------------------------------------------------------
 67  *   Thread 2: 'job2'
 68  *---------------------------------------------------------------------------*/
 69 void job2 (void const *argument) {
 70   while (1)  {                        /* endless loop                        */
 71     counter2++;                       /* increment counter 2                 */
 72     if (counter2 == 0) {              /* signal overflow of counter 2        */
 73       osSignalSet(thread3_id, 0x0001);/* to thread 3                         */
 74       osThreadYield();
 75     }
 76   }
 77 }
 78 
 79 /*----------------------------------------------------------------------------
 80  *   Thread 3: 'job3'
 81  *---------------------------------------------------------------------------*/
 82 void job3 (void const *argument) {
 83   while (1) {                         /* endless loop                        */
 84     osSignalWait(0x0001, osWaitForever);  /* wait for signal event           */
 85     counter3++;                       /* process overflow from counter 2     */
 86   }
 87 }
 88 
 89 /*----------------------------------------------------------------------------
 90  *   Main Thread
 91  *---------------------------------------------------------------------------*/
 92 int main (void) {                     /* program execution starts here       */
 93 
 94   /* Set higher priority of main thread to preempt job2                      */
 95   osThreadSetPriority(osThreadGetId(), osPriorityAboveNormal);
 96 
 97   thread1_id = osThreadCreate(osThread(job1),NULL);  /* create thread1       */
 98   thread2_id = osThreadCreate(osThread(job2),NULL);  /* create thread2       */
 99   thread3_id = osThreadCreate(osThread(job3),NULL);  /* create thread3       */
100 
101   while (1) {                         /* endless loop                        */
102     counter++;                        /* increment counter                   */
103     osDelay(5);                       /* wait for timeout: 5ms               */
104   }
105 }
106 
107 /*----------------------------------------------------------------------------
108  * end of file
109  *---------------------------------------------------------------------------*/
posted @ 2014-07-18 23:26  IAmAProgrammer  阅读(724)  评论(0编辑  收藏  举报