CMSIS Example - Mail and Message

  1 /*----------------------------------------------------------------------------
  2  *      RL-ARM - RTX
  3  *----------------------------------------------------------------------------
  4  *      Name:    MAIL.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 <stdio.h>
 35 #include "cmsis_os.h"
 36 
 37 /* Thread IDs */
 38 osThreadId tid_thread1;               /* assigned ID for thread 1            */
 39 osThreadId tid_thread2;               /* assigned ID for thread 2            */
 40 
 41 typedef struct {                      /* Mail object structure               */
 42   float    voltage;                   /* AD result of measured voltage       */
 43   float    current;                   /* AD result of measured current       */
 44   uint32_t counter;                   /* A counter value                     */
 45 } T_MEAS;
 46 
 47 osMailQDef(mail, 16, T_MEAS);         /* Define mail queue                   */
 48 osMailQId  mail;
 49 
 50 /* Forward reference */
 51 void send_thread (void const *argument);
 52 void recv_thread (void const *argument);
 53 
 54 /* Thread definitions */
 55 osThreadDef(send_thread, osPriorityNormal, 1, 0);
 56 osThreadDef(recv_thread, osPriorityNormal, 1, 2000);
 57 
 58 
 59 /*----------------------------------------------------------------------------
 60  *  Thread 1: Send thread
 61  *---------------------------------------------------------------------------*/
 62 void send_thread (void const *argument) {
 63   T_MEAS *mptr;
 64 
 65   mptr = osMailAlloc(mail, osWaitForever);           /* Allocate memory      */
 66   mptr->voltage = 223.72;             /* Set the mail content                */
 67   mptr->current = 17.54;
 68   mptr->counter = 120786;
 69   osMailPut(mail, mptr);              /* Send Mail                           */
 70   osDelay(100);
 71 
 72   mptr = osMailAlloc(mail, osWaitForever);           /* Allocate memory      */
 73   mptr->voltage = 227.23;             /* Prepare 2nd mail                    */
 74   mptr->current = 12.41;
 75   mptr->counter = 170823;
 76   osMailPut(mail, mptr);              /* Send Mail                           */
 77   osThreadYield();                    /* Cooperative multitasking            */
 78   osDelay(100);
 79 
 80   mptr = osMailAlloc(mail, osWaitForever);           /* Allocate memory      */
 81   mptr->voltage = 229.44;             /* Prepare 3rd mail                    */
 82   mptr->current = 11.89;
 83   mptr->counter = 237178;
 84   osMailPut(mail, mptr);              /* Send Mail                           */
 85   osDelay(100);
 86                                       /* We are done here, exit this thread  */
 87 }
 88 
 89 /*----------------------------------------------------------------------------
 90  *  Thread 2: Receive thread
 91  *---------------------------------------------------------------------------*/
 92 void recv_thread (void const *argument) {
 93   T_MEAS  *rptr;
 94   osEvent  evt;
 95 
 96   for (;;) {
 97     evt = osMailGet(mail, osWaitForever);  /* wait for mail                  */
 98     if (evt.status == osEventMail) {
 99       rptr = evt.value.p;
100       printf ("\nVoltage: %.2f V\n",rptr->voltage);
101       printf ("Current: %.2f A\n",rptr->current);
102       printf ("Number of cycles: %d\n",(int)rptr->counter);
103       #ifdef __USE_FFLUSH
104       fflush (stdout);
105       #endif
106       osMailFree(mail, rptr);         /* free memory allocated for mail      */
107     }
108   }
109 }
110 
111 /*----------------------------------------------------------------------------
112  *   Main:
113  *---------------------------------------------------------------------------*/
114 int main (void) {                     /* program execution starts here       */
115 
116   mail = osMailCreate(osMailQ(mail), NULL);  /* create mail queue            */
117 
118   tid_thread1 = osThreadCreate(osThread(send_thread), NULL);
119   tid_thread2 = osThreadCreate(osThread(recv_thread), NULL);
120 
121   osDelay(osWaitForever);
122   for (;;);
123 }
124 
125 /*----------------------------------------------------------------------------
126  * end of file
127  *---------------------------------------------------------------------------*/
  1 /*----------------------------------------------------------------------------
  2  *      RL-ARM - RTX
  3  *----------------------------------------------------------------------------
  4  *      Name:    MESSAGE.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 <stdio.h>
 35 #include "cmsis_os.h"
 36 
 37 /* Thread IDs */
 38 osThreadId tid_thread1;               /* assigned ID for thread 1            */
 39 osThreadId tid_thread2;               /* assigned ID for thread 2            */
 40 
 41 typedef struct {                      /* Message object structure            */
 42   float    voltage;                   /* AD result of measured voltage       */
 43   float    current;                   /* AD result of measured current       */
 44   uint32_t counter;                   /* A counter value                     */
 45 } T_MEAS;
 46 
 47 osPoolDef(mpool, 16, T_MEAS);             /* Define memory pool              */
 48 osPoolId  mpool;
 49 osMessageQDef(MsgBox, 16, T_MEAS);        /* Define message queue            */
 50 osMessageQId  MsgBox;
 51 
 52 /* Forward reference */
 53 void send_thread (void const *argument);
 54 void recv_thread (void const *argument);
 55 
 56 /* Thread definitions */
 57 osThreadDef(send_thread, osPriorityNormal, 1, 0);
 58 osThreadDef(recv_thread, osPriorityNormal, 1, 2000);
 59 
 60 
 61 /*----------------------------------------------------------------------------
 62  *  Thread 1: Send thread
 63  *---------------------------------------------------------------------------*/
 64 void send_thread (void const *argument) {
 65   T_MEAS    *mptr;
 66 
 67   mptr = osPoolAlloc(mpool);          /* Allocate memory for the message     */
 68   mptr->voltage = 223.72;             /* Set the message content             */
 69   mptr->current = 17.54;
 70   mptr->counter = 120786;
 71   osMessagePut(MsgBox, (uint32_t)mptr, osWaitForever);  /* Send Message      */
 72   osDelay(100);
 73 
 74   mptr = osPoolAlloc(mpool);          /* Allocate memory for the message     */
 75   mptr->voltage = 227.23;             /* Prepare a 2nd message               */
 76   mptr->current = 12.41;
 77   mptr->counter = 170823;
 78   osMessagePut(MsgBox, (uint32_t)mptr, osWaitForever);  /* Send Message      */
 79   osThreadYield();                    /* Cooperative multitasking            */
 80   osDelay(100);
 81 
 82   mptr = osPoolAlloc(mpool);          /* Allocate memory for the message     */
 83   mptr->voltage = 229.44;             /* Prepare a 3rd message               */
 84   mptr->current = 11.89;
 85   mptr->counter = 237178;
 86   osMessagePut(MsgBox, (uint32_t)mptr, osWaitForever);  /* Send Message      */
 87   osDelay(100);
 88                                       /* We are done here, exit this thread  */
 89 }
 90 
 91 /*----------------------------------------------------------------------------
 92  *  Thread 2: Receive thread
 93  *---------------------------------------------------------------------------*/
 94 void recv_thread (void const *argument) {
 95   T_MEAS  *rptr;
 96   osEvent  evt;
 97 
 98   for (;;) {
 99     evt = osMessageGet(MsgBox, osWaitForever);  /* wait for message          */
100     if (evt.status == osEventMessage) {
101       rptr = evt.value.p;
102       printf ("\nVoltage: %.2f V\n",rptr->voltage);
103       printf ("Current: %.2f A\n",rptr->current);
104       printf ("Number of cycles: %d\n",(int)rptr->counter);
105       #ifdef __USE_FFLUSH
106       fflush (stdout);
107       #endif
108       osPoolFree(mpool,rptr);         /* free memory allocated for message   */
109     }
110   }
111 }
112 
113 /*----------------------------------------------------------------------------
114  *   Main:
115  *---------------------------------------------------------------------------*/
116 int main (void) {                     /* program execution starts here       */
117 
118   mpool = osPoolCreate(osPool(mpool));  /* create memory pool                */
119   MsgBox = osMessageCreate(osMessageQ(MsgBox), NULL);  /* create msg queue   */
120 
121   tid_thread1 = osThreadCreate(osThread(send_thread), NULL);
122   tid_thread2 = osThreadCreate(osThread(recv_thread), NULL);
123 
124   osDelay(osWaitForever);
125   for (;;);
126 }
127 
128 /*----------------------------------------------------------------------------
129  * end of file
130  *---------------------------------------------------------------------------*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值