В голову приходит, только конструкция из одной очереди запросов и пула очередей для ответов на запросы. Как-то громоздко, нельзя ли попроще? Использовать "короткие" очереди, чтобы сократить тот пул до одной очереди ответов, зная, что только одна задача может находится в состоянии ожидания ответа? Как еще?
Код
int i2c_write_reg(int addr, int reg, int val)
{
halI2C_MSG_t xMSG, *pMSG;
unsigned char msg_data[1];
pMSG = &xMSG;
xMSG.xTask = xTaskGetCurrentTaskHandle();
xMSG.msg_addr = addr << 1;
xMSG.msg_sreg = reg;
xMSG.len_data = 1;
xMSG.msg_data = msg_data;
msg_data[0] = val;
xQueueSendToBack(pI2C->xQueueReq, &pMSG, portMAX_DELAY);
NVIC_SetPendingIRQ(I2C1_EV_IRQn);
//ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
return xMSG.errno;
}
{
halI2C_MSG_t xMSG, *pMSG;
unsigned char msg_data[1];
pMSG = &xMSG;
xMSG.xTask = xTaskGetCurrentTaskHandle();
xMSG.msg_addr = addr << 1;
xMSG.msg_sreg = reg;
xMSG.len_data = 1;
xMSG.msg_data = msg_data;
msg_data[0] = val;
xQueueSendToBack(pI2C->xQueueReq, &pMSG, portMAX_DELAY);
NVIC_SetPendingIRQ(I2C1_EV_IRQn);
//ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
return xMSG.errno;
}
Вариант с TaskNotify отбросил, по той причине, что этот механизм будет использован на уровне выше, для запуска задачи которая пользуется i2c.
Спасибо.