У меня есть 2 производителя и 1 потребитель, использующий одну FIFO.Сообщения ставятся в очередь с использованием k_fifo_alloc_put
, как показано ниже:
#include <zephyr.h>
struct message_t {
u32_t info;
};
K_FIFO_DEFINE(fifo);
void thread_func(void *arg1, void *arg2, void *arg3)
{
ARG_UNUSED(arg1);
ARG_UNUSED(arg2);
ARG_UNUSED(arg3);
while(1) {
struct message_t msg = {
.info = 1,
};
k_fifo_alloc_put(&fifo, &msg);
k_sleep(K_SECONDS(1));
}
}
K_THREAD_STACK_DEFINE(thread1_stack_area, 256);
static struct k_thread thread1_data;
void tick_handler(struct k_timer *timer)
{
struct message_t msg = {
.info = 2,
};
k_thread_system_pool_assign(k_current_get());
k_fifo_alloc_put(&fifo, &msg);
}
void main(void)
{
k_thread_system_pool_assign(k_current_get());
k_thread_create(&thread1_data, thread1_stack_area,
K_THREAD_STACK_SIZEOF(thread1_stack_area),
thread_func,
NULL, NULL, NULL,
7, 0, K_NO_WAIT);
struct k_timer timer;
k_timer_init(&timer, tick_handler, NULL);
k_timer_start(&timer, K_SECONDS(1), K_SECONDS(1));
struct message_t *msg;
for(;;) {
msg = k_fifo_get(&fifo, K_FOREVER);
if(msg) printk("Received message from fifo: %d\r\n", msg->info);
}
}
Оба производителя выделяют из одной кучи.Таймер явно назначает системную кучу себе, используя k_thread_system_pool_assign(k_current_get());
, и второй поток наследует ту же кучу от основной.
Безопасно ли так делать?Если нет, то как мне реализовать такое поведение?
Что я действительно не понимаю, так это то, как k_fifo_alloc_put
выполняет выделение и как этот ресурс освобождается при извлечении, как указано в документации по интерфейсу:
k_fifo_alloc_put (fifo, data):
Эта процедура добавляет элемент данных в @a fifo.Существует неявное выделение памяти из пула ресурсов вызывающего потока, который автоматически освобождается при удалении элемента.