|
Модераторы: PILOT, ManiaK, Mazzi |
|
osandr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Добрый день, уважаемые программисты!
Пишу программы для микроконтроллеров на Си достаточно долго. Но все время остается чувство, что можно писать код красивее, понятнее и лучше. Красивые решения находишь, когда изучаешь чужой код, например библиотеки драйверов от производителя чипа. Иногда пишу библиотеки сам с нуля. Так вот хотелось бы узнать: есть ли какие-то правила написания драйверов/библиотек, чтобы они надежно работали и в то же время код не был громоздким слишком. Приведу пример. Допустим нужно написать драйвер, работающий с датчиком температуры по интерфейсу SPI. Сначала обычно пишется нижний уровень - прослойка, которая будет абстрагировать программиста от аппаратной части микроконтроллера и будет взаимодействовать с интерфейсом SPI и прерываниями (в зависимости от реализации). Затем будет какой-то промежуточный уровень, который будет через нижний уровень взаимодействовать с регистрами датчика. И наконец верхний уровень, который будет оберткой для промежуточного уровня, абстрагирующий программиста от аппаратной части датчика. Т.е. программист может даже в электронике не разбираться, а просто собирать показания датчика через вызов определенных функций. К чему я веду? К тому, что по-хорошему начиная с нижнего уровня нужно заботиться о надежности драйвера, проверять что аппаратная часть отработала как нужно, что данные корректно записаны или считаны, что не произошло каких-то аппаратных ошибок при передаче. То, что мы записали на шину данных SPI интерфейса данные еще не значит, что они дошли до абонента. К тому же операция эта не мгновенная и необходимо выждать какое-то время для чтения/записи. И тут разные варианты реализации есть: сама простая и, как мне кажется, опасная (в плане зависания), а также не рациональная реализация - это ожидание завершения операции; вторая реализация - это работа по прерываниям, лучше в том плане, что процессор не "простаивает" впустую. И таким образом получается, что все проверки на нижнем уровне они как бы "всплывают" в проверки на верхнем уровне и когда нужно выполнить к примеру несколько записей по SPI подряд, то каждая такая запись обрастает оператором if, что смотрится не очень приятно и читаемо, да и к тому же, я считаю, дает лишнюю нагрузку на процессор и увеличивает машинный код. Может кто-то поделится своим опытом написания библиотек или посоветует литературу к прочтению? Или выскажет свои мысли по этому поводу как сделать лучше. |
|||
|
||||
Mazzi |
|
|||
Правильный Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Работу с бортовой начинкой нужно делать по прерываниям. Остальное по ситуации, поскольку всё сильно зависит от решаемой задачи.
-------------------- Мне нужны помощники. |
|||
|
||||
osandr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Хорошо написанный драйвер подразумевает его адаптацию под любую ситуацию. Поэтому ответ не принимается
|
|||
|
||||
Romikgy |
|
|||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
МК один другому МК рознь... красота - это удобство разработки, одновременно это потеря производительности (появляются абстракции , прослойки) .... и ее необходимость сильно зависит от МК для которого пишут.... и если размер и быстродействие важно , значит пишут максимально оптимально с включением (где надо) ассемблера, если места не мерено и частоты хватает , можно и красиво с ООП -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
osandr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Даже если мы работает по прерываниям, все равно в программе где-то будет сделано ожидание наступления нужного события. Если на аппаратном уровне мы ловим прерывание, когда установится бит готовности в регистре статуса, то все равно на более высоком уровне мы ждем когда будет записана последовательность байт например и установится флаг или мьютекс, или семафор. От ожидания все равно никуда не уйти. При работе с операционными системами реального времени программиста не заботит проблема как будет распределено процессорное время и программа в любом случае сохраняет работоспособность, другие задачи выполняются по прежнему. При написании драйвера мы не знаем будет ли он использоваться с операционной системой или без, а значит должны позаботиться о том, что при сбои в аппаратной части он не вешал работу всей программы и адекватно обрабатывал такие ситуации.
Добавлено через 3 минуты
Будем рассматривать тот вариант, когда ресурсы МК позволяют писать код красиво. Например пусть это будет STM32 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
А должны знать. Драйвера под операционную систему и под голое железо очень сильно отличаются. Для голого железа часть функций ОС придется взять на себя программе верхнего уровня, а часть - самому драйверу. При этом распределение этих частей сильно зависят от конечного приложения. Если же вы начнёте всё пихать в драйвер, то у вас получится своя ОС сделанная из драйвера, а это уже совсем нехорошо |
|||
|
||||
Romikgy |
|
|||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
тогда использовать ООП , если нравится... ifdef определить для какой системы , тот или иной кусок кода, будет или нет использоваться ОС, и т.п. -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
Mazzi |
|
|||
Правильный Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Ваше утверждение можно легко опровергнуть взяв целевой камень AtTiny12. -------------------- Мне нужны помощники. |
|||
|
||||
osandr |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Тогда это уже будет не драйвер, а небольшое приложение, в котором все намешано в кучу. Речь не идет о тиньках Добавлено через 9 минут и 58 секунд
И каким образом ООП может решить вопрос надежности и избежать многочисленных проверок на всех уровнях абстракции? Да и в языке Си нет ООП. |
||||||
|
|||||||
Romikgy |
|
|||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
так си и не так красив как с++(особенно с абстракциями) ... я предложил вариант , ваше дело прислушиваться ли к нему... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
Mazzi |
|
||||||
Правильный Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Сначала подумайте, потом пишите. -------------------- Мне нужны помощники. |
||||||
|
|||||||
osandr |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Что вас не устраивает в написанном? Я могу ответить встречно: сначала подумайте, потом советы давайте. Понимаете, сейчас много крутых контроллеров, которые доступны широким массам, но почему-то люди до сих пор не отучились писать программы так, будто они пишут под attiny12. Вы же наверняка знакомы с Ардуино? Хотите сказать, что все библиотеки там тоже написаны под конктретную ситуацию? |
||||||||
|
|||||||||
Romikgy |
|
|||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
в адруино используется С++ с классами , для красоты и облегчения программирования, код получается громоздким, что то стоящее на ней достаточно сложно , а разные моргалки пишутся на ура , даже домохозяйками ( для этого и задумывался!!! ) есть ардуино и на стм32 , там все проще , по размерам и скорости ... Откройте код под ардуину и увидите , что там все ситуации учтены , где дефайнами процессорозависимый код, и процессоронезависимый , как правило в классах.... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
Mazzi |
|
|||
Правильный Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Почему вы грубите модератору? Ещё раз и в баню отправлю. -------------------- Мне нужны помощники. |
|||
|
||||
osandr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Посмотрел как выполнена отправка данных по SPI в Ардуино и разочаровался:
Бесконечное ожидание флага SPIF. Т.е. если что-то пошло не так, то программа просто зависает и никто не знает причины |
|||
|
||||
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |