ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 июля
1317506
NAUT (08.06.2023 09:41, просмотров: 1244)
застрял с 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;
}
Какие же это, чёрт подери, кубики? Когда это жизнь моя.