Цитата(SergNK @ May 3 2016, 11:09)
А для завязки подкину задачку. Есть на шине I2C память и ЖК-индикатор. Драйвер I2C должен быть общим. А его должны юзать драйверы устройств: lcd и mem.
Подскажите, как это сделать в scmRTOS из разных задач.
Как вариант, сделать владельцем драйвера I2C одну задачу. Общение с драйвером должно вестись сообщениями через очередь.
Привожу почти псевдокод такого общения.
Код
Queue<Message, 10> queue; // создали очередь из 10 элементов типа Message
void i2cTask(const void * arg)
{
I2c i2c(SCL, SDA); // создаем объект класса I2c
const uint8_t memoryAddr = 0x62;
MemoryI2c memory(i2c, memoryAddr); // создаем объект класса MemoryI2c, который использует I2C в качестве интерфейса доступа к памяти
const uint8_t screenAddr = 0x72;
ScreenI2c screen(i2c, screenAddr);
while (true)
{
if (queue.hasMessage()) // если есть сообщение
{
const Message & msg = queue.message(); // выбираем сообщение из очереди
switch (msg.id()) // определяем назначение данных
{
case MemorySave:
const Data data = msg.data();
memory.save(data);
break;
case MemoryLoad:
const Data data = memory.load();
someQueue.put(data);
break;
case Screen:
...
screen.send(...);
break;
}
}
}
}
Конечно, это не вариант на все случаи жизни. Как часто нужно работать с памятью? Может достаточно редко, и все время будет занято экраном. И мьютексы будут не нужны.
Сообщение отредактировал Slash - May 3 2016, 23:33