SergNK 0 3 мая, 2016 Опубликовано 3 мая, 2016 · Жалоба Доброго дня всем! Понравилась мне библиотека stm32tpl от AHTOXA, да вот что-то не хватает умения применить её. А для завязки подкину задачку. Есть на шине I2C память и ЖК-индикатор. Драйвер I2C должен быть общим. А его должны юзать драйверы устройств: lcd и mem. Подскажите, как это сделать в scmRTOS из разных задач. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 мая, 2016 Опубликовано 3 мая, 2016 · Жалоба А мьютексы в scmRTOS есть? :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergNK 0 3 мая, 2016 Опубликовано 3 мая, 2016 · Жалоба А мьютексы в scmRTOS есть? :rolleyes: Есть. Но это следующий шаг. И пинать меня ногами не следует за то, что спросил. Я хочу научиться использовать библиотеку, а не упражняться в словесности. Поэтому и обратился за помощью. Простите за оффтоп. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 мая, 2016 Опубликовано 3 мая, 2016 · Жалоба Есть. Но это следующий шаг. И пинать меня ногами не следует за то, что спросил. Я хочу научиться использовать библиотеку, а не упражняться в словесности. Поэтому и обратился за помощью. Простите за оффтоп. Не понял, насчет "пинать ногами". Это вместо "спасибо"? :rolleyes: Я вам путь показал. А за спрос не бьют в нос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergNK 0 3 мая, 2016 Опубликовано 3 мая, 2016 · Жалоба Не понял, насчет "пинать ногами". Это вместо "спасибо"? :rolleyes: Я вам путь показал. А за спрос не бьют в нос. Спасибо! Не хотел обидеть. AHTOXA сделал софтовый I2C драйвер. А мне нужен для штатной периферии. Вот, набросал по образу и подобию SPI драйвера из stm32_spi.h. stm32_i2c_L4xx.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 3 мая, 2016 Опубликовано 3 мая, 2016 · Жалоба Вот, набросал по образу и подобию SPI драйвера из stm32_spi.h. Отлично! Осталось написать чтение/запись, и дело в шляпе :) А у меня как-то с i2c не складывается, не нравится мне этот протокол, да и реализация его у ST какая-то мутная. Каждый раз ограничиваюсь какими-то частными решениями, и библиотечный модуль не выходит. В подмогу дам ссылку на хорошие исходники для работы с i2c: вот. Там всё очень понятно сделано в плане чтения/записи. И откомментировано подробно. Кстати, в I2c::SetClkSource() ошибка: INLINE static void SetClkSource(uint32_t cs){ Traits::DisableClocks(cs); } Что касаемо исходного вопроса, то ViKo правильно намекает: если периферия используется из двух процессов, то нужен мьютекс. Процесс захватывает мьютекс, делает транзакцию на шине, отпускает мьютекс. Другой процесс поступает так же. В этом случае конфликты исключены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Slash 0 3 мая, 2016 Опубликовано 3 мая, 2016 (изменено) · Жалоба А для завязки подкину задачку. Есть на шине 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; } } } } Конечно, это не вариант на все случаи жизни. Как часто нужно работать с памятью? Может достаточно редко, и все время будет занято экраном. И мьютексы будут не нужны. Изменено 3 мая, 2016 пользователем Slash Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergNK 0 4 мая, 2016 Опубликовано 4 мая, 2016 · Жалоба Спасибо, ребята! Особенно про идею владельца. Я об этом как-то не подумал. Считал, что драйвер сам по себе. Я как-то лет 7 назад поднимал PICos18. Там драйверы были оформлены как самостоятельные задачи с FIFO. Кидаешь туда из разных задач с признаком, какая задача это сделала, и возвращалось всегда по этому признаку. Согласен AHTOXA, протокол навороченный. Так зато ноги только две! 1-wire ещё навороченнее! У меня выбора нет, пилю I2C stm-овский. Результаты буду выкладывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться