застрял с FreeRTOS с реализацией широковещательных сообщений: мне
надо чтобы: 1) драйвер мог сказать send_message (uiny8_t MSG_KEY_ENTER_PRESSED) и не заморачивался с тем кто его будет принимать
2) несколько подпрограмм-приемников ждет bool get_message(MSG_KEY_ENTER_PRESSED) - и если оно пришло, то на него больше не реагируем, чтобы не было повторов
3) невостребованные мессаджи удаляются по таймауту, чтобы через несколько секунд, если надо повисеть-подумать, мне не пришло сообщение "годичной давности"
в системе конечных автоматов которую использовал до этого, этот механизм был с блеском реализован (https://kit-e.ru/micro/switch/)
сейчас застрял и использую такое с недостатком - кто первый мессадж получил, того и тапки, остальные не получат, широковещательный но однократный мессадж:
void send_msg(uint8_t msg)
{
if (msg <= 24 * 1 - 1) xEventGroupSetBits(msg_group_1, 1 << msg);
else if (msg <= 24 * 2 - 1) xEventGroupSetBits(msg_group_2, 1 << (msg - 24));
else if (msg <= 24 * 3 - 1) xEventGroupSetBits(msg_group_3, 1 << (msg - 48));
else
return;
SEGGER_RTT_printf(0, "Message sended: %u\r\n", msg);
}
uint8_t get_msg(uint8_t msg)
{
uint8_t saved = msg;
EventGroupHandle_t msg_group_select = NULL;
if (msg <= 24 * 1 - 1) msg_group_select = msg_group_1;
else if (msg <= 24 * 2 - 1)
{
msg_group_select = msg_group_2;
msg -= 24;
}
else if (msg <= 24 * 3 - 1)
{
msg_group_select = msg_group_3;
msg -= 48;
}
else
return 0;
if ((1 << msg) & xEventGroupWaitBits(msg_group_select, (1 << msg), pdTRUE, pdFALSE, 1))
{
SEGGER_RTT_printf(0, "Message received: %u\r\n", saved);
return 1;
}
return 0;
}