реклама на сайте
подробности

 
 
> Блокирование задач на время i/o операции
amaora
сообщение Jul 9 2016, 20:19
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778



Пытаюсь сделать драйвер или полегче говоря hal модуль i2c. Надо как-то реализовать такие функции как запись/чтение в/из i2c slave. Есть конечный автомат вызываемый из прерывания, обрабатывающий состояния i2c, передача стартов, стопов, адреса, данных и т.п.. В начале надо дождаться того, что этот автомат будет свободен, это первая точка блокирования. Отдать задание и затем дождаться его выполнения, это вторая точка блокирования.

В голову приходит, только конструкция из одной очереди запросов и пула очередей для ответов на запросы. Как-то громоздко, нельзя ли попроще? Использовать "короткие" очереди, чтобы сократить тот пул до одной очереди ответов, зная, что только одна задача может находится в состоянии ожидания ответа? Как еще?

Код
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;
}


Вариант с TaskNotify отбросил, по той причине, что этот механизм будет использован на уровне выше, для запуска задачи которая пользуется i2c.

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Valentine Logino...
сообщение Jul 19 2016, 07:20
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Семафоры - хорошее решение. Правда я не понял зачем вам их два. Всё-таки наверное первый у вас - это мютекс?
portMAX_DELAY - не лучший вариант, все-таки правильнее задать конкретное время и обработать ошибку, а то все зависнуть может.
По поводу нотификейшнов проще было бы подсказать, если бы вы поделились кодом. Я бы начал с простого и проверил в конфиге configUSE_TASK_NOTIFICATIONS (: Я активно нотификейшнами пользуюсь как раз для такого типа синхронизации, по времени выходит быстрее.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01328 секунд с 7
ELECTRONIX ©2004-2016