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 *---------------------------------------------------------------------------*/