| /* |
| * Copyright (c) 2018 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** |
| * @file Synchronization demo using CMSIS RTOS V1 APIs. |
| */ |
| |
| #include <zephyr/kernel.h> |
| #include <cmsis_os.h> |
| |
| /* specify delay between greetings (in ms); compute equivalent in ticks */ |
| #define TIMER_TICKS 50 |
| #define STACKSIZE 512 |
| #define MSGLEN 12 |
| #define Q_LEN 1 |
| #define INITIAL_DATA_VALUE 5 |
| |
| uint32_t data; |
| |
| void read_msg_callback(void const *arg); |
| |
| osTimerDef(myTimer, read_msg_callback); |
| |
| osMessageQDef(messageq, Q_LEN, uint32_t); |
| osMessageQId message_id; |
| |
| void read_msg_callback(void const *arg) |
| { |
| osEvent evt; |
| uint32_t read_msg = 0U; |
| |
| evt = osMessageGet(message_id, 0); |
| read_msg = evt.value.v; |
| if (read_msg == 0U) { |
| printk("\n**Error reading message from message queue**\n"); |
| } else { |
| printk("Read from message queue: %d\n\n", read_msg); |
| } |
| } |
| |
| int send_msg_thread(void) |
| { |
| osStatus status; |
| |
| status = osMessagePut(message_id, data, osWaitForever); |
| if (status != osOK) { |
| printk("\n**Error sending message to message queue**\n"); |
| return 1; |
| } |
| printk("Wrote to message queue: %d\n", data); |
| return 0; |
| } |
| |
| void main(void) |
| { |
| osTimerId timer_id; |
| uint32_t counter = 10U; |
| |
| data = INITIAL_DATA_VALUE; |
| timer_id = osTimerCreate(osTimer(myTimer), osTimerPeriodic, NULL); |
| |
| message_id = osMessageCreate(osMessageQ(messageq), NULL); |
| |
| /* Send first message */ |
| if (send_msg_thread()) { |
| /* Writing to message queue failed */ |
| goto exit; |
| } |
| osTimerStart(timer_id, TIMER_TICKS); |
| |
| while (--counter) { |
| data++; |
| if (send_msg_thread()) { |
| /* Writing to message queue failed */ |
| break; |
| } |
| } |
| osDelay(TIMER_TICKS); |
| |
| osTimerStop(timer_id); |
| |
| exit: |
| osTimerDelete(timer_id); |
| |
| if (counter == 0U) { |
| printk("Sample execution successful\n"); |
| } else { |
| printk("Error in execution\n"); |
| } |
| } |