Автор: SergNK May 3 2016, 08:09
Доброго дня всем!
Понравилась мне библиотека stm32tpl от AHTOXA, да вот что-то не хватает умения применить её.
А для завязки подкину задачку. Есть на шине I2C память и ЖК-индикатор. Драйвер I2C должен быть общим. А его должны юзать драйверы устройств: lcd и mem.
Подскажите, как это сделать в scmRTOS из разных задач.
Спасибо!
Автор: ViKo May 3 2016, 08:26
А мьютексы в scmRTOS есть?
Автор: SergNK May 3 2016, 08:46
Цитата(ViKo @ May 3 2016, 11:26)
А мьютексы в scmRTOS есть?
Есть. Но это следующий шаг. И пинать меня ногами не следует за то, что спросил. Я хочу научиться использовать библиотеку, а не упражняться в словесности. Поэтому и обратился за помощью. Простите за оффтоп.
Автор: ViKo May 3 2016, 09:06
Цитата(SergNK @ May 3 2016, 11:46)
Есть. Но это следующий шаг. И пинать меня ногами не следует за то, что спросил. Я хочу научиться использовать библиотеку, а не упражняться в словесности. Поэтому и обратился за помощью. Простите за оффтоп.
Не понял, насчет "пинать ногами". Это вместо "спасибо"?
Я вам путь показал. А за спрос не бьют в нос.
Автор: SergNK May 3 2016, 10:21
Цитата(ViKo @ May 3 2016, 12:06)
Не понял, насчет "пинать ногами". Это вместо "спасибо"?
Я вам путь показал. А за спрос не бьют в нос.
Спасибо! Не хотел обидеть.
AHTOXA сделал софтовый I2C драйвер. А мне нужен для штатной периферии. Вот, набросал по образу и подобию SPI драйвера из stm32_spi.h.
stm32_i2c_L4xx.zip ( 3.18 килобайт )
: 55
Автор: AHTOXA May 3 2016, 18:50
Цитата(SergNK @ May 3 2016, 15:21)
Вот, набросал по образу и подобию SPI драйвера из stm32_spi.h.
Отлично! Осталось написать чтение/запись, и дело в шляпе
А у меня как-то с i2c не складывается, не нравится мне этот протокол, да и реализация его у ST какая-то мутная. Каждый раз ограничиваюсь какими-то частными решениями, и библиотечный модуль не выходит.
В подмогу дам ссылку на хорошие исходники для работы с i2c: http://electronix.ru/redirect.php?https://github.com/yigiter/Sample-STM32F4-codes/tree/master/I2CLib. Там всё очень понятно сделано в плане чтения/записи. И откомментировано подробно.
Кстати, в I2c::SetClkSource() ошибка:
Код
INLINE static void SetClkSource(uint32_t cs){ Traits::DisableClocks(cs); }
Что касаемо исходного вопроса, то
ViKo правильно намекает: если периферия используется из двух процессов, то нужен мьютекс. Процесс захватывает мьютекс, делает транзакцию на шине, отпускает мьютекс. Другой процесс поступает так же. В этом случае конфликты исключены.
Автор: Slash May 3 2016, 23:32
Цитата(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;
}
}
}
}
Конечно, это не вариант на все случаи жизни. Как часто нужно работать с памятью? Может достаточно редко, и все время будет занято экраном. И мьютексы будут не нужны.
Автор: SergNK May 4 2016, 07:48
Спасибо, ребята!
Особенно про идею владельца. Я об этом как-то не подумал. Считал, что драйвер сам по себе.
Я как-то лет 7 назад поднимал PICos18. Там драйверы были оформлены как самостоятельные задачи с FIFO. Кидаешь туда из разных задач с признаком, какая задача это сделала, и возвращалось всегда по этому признаку.
Согласен AHTOXA, протокол навороченный. Так зато ноги только две! 1-wire ещё навороченнее!
У меня выбора нет, пилю I2C stm-овский. Результаты буду выкладывать.