The benchmark sample did not contemplate message subscribers. It adds the msg subscribers and improves the organization of the project. Signed-off-by: Rodrigo Peixoto <rodrigopex@gmail.com>
72 lines
1.7 KiB
C
72 lines
1.7 KiB
C
/*
|
|
* Copyright (c) 2023 Rodrigo Peixoto <rodrigopex@gmail.com>
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include "messages.h"
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/sys/util_macro.h>
|
|
#include <zephyr/sys/atomic.h>
|
|
#include <zephyr/zbus/zbus.h>
|
|
|
|
#define CONSUMER_STACK_SIZE (CONFIG_IDLE_STACK_SIZE + CONFIG_BM_MESSAGE_SIZE)
|
|
|
|
extern atomic_t count;
|
|
|
|
ZBUS_CHAN_DECLARE(bm_channel);
|
|
|
|
#define SFY(i, _) s##i
|
|
|
|
#define CONSUMERS_NAME_LIST LISTIFY(CONFIG_BM_ONE_TO, SFY, (, /* separator */))
|
|
|
|
#define CREATE_OBSERVER(s) ZBUS_SUBSCRIBER_DEFINE(s, 4)
|
|
|
|
#define CREATE_OBSERVATIONS(s) ZBUS_CHAN_ADD_OBS(bm_channel, s, 3)
|
|
|
|
/* clang-format off */
|
|
FOR_EACH(CREATE_OBSERVER, (;), CONSUMERS_NAME_LIST);
|
|
|
|
FOR_EACH(CREATE_OBSERVATIONS, (;), CONSUMERS_NAME_LIST);
|
|
/* clang-format on */
|
|
|
|
static int sub_thread(void *sub_ref, void *ptr2, void *ptr3)
|
|
{
|
|
ARG_UNUSED(ptr2);
|
|
ARG_UNUSED(ptr3);
|
|
|
|
const struct zbus_channel *chan;
|
|
struct zbus_observer *sub = sub_ref;
|
|
|
|
while (1) {
|
|
if (zbus_sub_wait(sub, &chan, K_FOREVER) == 0) {
|
|
if (zbus_chan_claim(chan, K_FOREVER) != 0) {
|
|
k_oops();
|
|
}
|
|
|
|
if (IS_ENABLED(CONFIG_BM_FAIRPLAY)) {
|
|
struct bm_msg message;
|
|
|
|
memcpy(zbus_chan_msg(chan), &message, chan->message_size);
|
|
|
|
atomic_add(&count, *((uint16_t *)message.bytes));
|
|
} else {
|
|
const struct bm_msg *msg_received = zbus_chan_const_msg(chan);
|
|
|
|
atomic_add(&count, *((uint16_t *)msg_received->bytes));
|
|
}
|
|
|
|
zbus_chan_finish(chan);
|
|
} else {
|
|
k_oops();
|
|
}
|
|
}
|
|
return -EFAULT;
|
|
}
|
|
|
|
#define CREATE_THREADS(name) \
|
|
K_THREAD_DEFINE(name##_sub_id, CONSUMER_STACK_SIZE, sub_thread, &name, NULL, NULL, 3, 0, 0);
|
|
|
|
/* clang-format off */
|
|
FOR_EACH(CREATE_THREADS, (;), CONSUMERS_NAME_LIST);
|
|
/* clang-format on */
|