Потокобезопасно ли разделять кучу между обратным вызовом таймера и потоком? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть 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.Существует неявное выделение памяти из пула ресурсов вызывающего потока, который автоматически освобождается при удалении элемента.

...