1 /*
2 * Copyright (c) 2018 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 /**
8 * @file Synchronization demo using CMSIS RTOS V1 APIs.
9 */
10
11 #include <zephyr/kernel.h>
12 #include <cmsis_os.h>
13
14 /* specify delay between greetings (in ms); compute equivalent in ticks */
15 #define TIMER_TICKS 50
16 #define STACKSIZE 512
17 #define MSGLEN 12
18 #define Q_LEN 1
19 #define INITIAL_DATA_VALUE 5
20
21 uint32_t data;
22
23 void read_msg_callback(void const *arg);
24
25 osTimerDef(myTimer, read_msg_callback);
26
27 osMessageQDef(messageq, Q_LEN, uint32_t);
28 osMessageQId message_id;
29
read_msg_callback(void const * arg)30 void read_msg_callback(void const *arg)
31 {
32 osEvent evt;
33 uint32_t read_msg = 0U;
34
35 evt = osMessageGet(message_id, 0);
36 read_msg = evt.value.v;
37 if (read_msg == 0U) {
38 printk("\n**Error reading message from message queue**\n");
39 } else {
40 printk("Read from message queue: %d\n\n", read_msg);
41 }
42 }
43
send_msg_thread(void)44 int send_msg_thread(void)
45 {
46 osStatus status;
47
48 status = osMessagePut(message_id, data, osWaitForever);
49 if (status != osOK) {
50 printk("\n**Error sending message to message queue**\n");
51 return 1;
52 }
53 printk("Wrote to message queue: %d\n", data);
54 return 0;
55 }
56
main(void)57 int main(void)
58 {
59 osTimerId timer_id;
60 uint32_t counter = 10U;
61
62 data = INITIAL_DATA_VALUE;
63 timer_id = osTimerCreate(osTimer(myTimer), osTimerPeriodic, NULL);
64
65 message_id = osMessageCreate(osMessageQ(messageq), NULL);
66
67 /* Send first message */
68 if (send_msg_thread()) {
69 /* Writing to message queue failed */
70 goto exit;
71 }
72 osTimerStart(timer_id, TIMER_TICKS);
73
74 while (--counter) {
75 data++;
76 if (send_msg_thread()) {
77 /* Writing to message queue failed */
78 break;
79 }
80 }
81 osDelay(TIMER_TICKS);
82
83 osTimerStop(timer_id);
84
85 exit:
86 osTimerDelete(timer_id);
87
88 if (counter == 0U) {
89 printk("Sample execution successful\n");
90 } else {
91 printk("Error in execution\n");
92 }
93 return 0;
94 }
95