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