|
Модераторы: 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. Т.е. если что-то пошло не так, то программа просто зависает и никто не знает причины |
|||
|
||||
Romikgy |
|
|||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
у атмела хардварная передача SPI , если что то пошло не так, значит процу жопа. Если железо ок , то ответ всегда получишь .... для каких микроконтроллеров вы долго писали ? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
Mazzi |
|
|||
Правильный Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
"Долго писал" - это сколько?
-------------------- Мне нужны помощники. |
|||
|
||||
osandr |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Romikgy,
Если абонент не ответит, то соответственно и ответ не получишь, а следовательно программа будет зависать на ожидании. Это к примеру. 8-битные атмелы - это уже вчерашний день. Если нравятся 8-битные микроконтроллеры, посмотрите хотя бы описание регистров для STM8 любого. Если не работает SPI, то это еще не значит что процу жопа. Проц и остальная периферия могут успешно работать и дальше. Регистр статуса модуля SPI STM8:
Что, здесь тоже предложите бесконечно ждать установки бита RXNE? Вообщем, я не буду никого в чем-то переубеждать. Пишите программы как нравится. Я считаю исходный код ардуино - это халтура. Видимо еще и поэтому ардуино не используется нигде в ответственных разработках. Для домашних поделок вроде беспроводного термометра - пойдет.
PIC 12, 16, 18, dsPIC, AtTiny, AtMega, STM8, STM32, MSP430, Microblaze, PowerPC, NXP, Zynq Писал программы также для Raspberry PI и Orange PI Достаточно будет? Mazzi,
8 лет. Кто-то еще может высказаться по делу? |
||||||||
|
|||||||||
Romikgy |
|
||||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
возможно , но пока что по популярности еще достаточно держатся вверху...
вы на практике такое сами можете проверить ?
ИМХО после такого срока реальной работы и с таким количеством устройств , вопросы о правильности должны были пройти ооочень давно .... или вы ооочень медленный в понимании человек, и для понятия правильности или не правильности вам необходимо более 8 лет практики .... Ждите, возможно кто и ответить , но я бы посоветовал обратится на проф форумы по МК с таким вопросом.... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
osandr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Romikgy, так поделитесь своим пониманием правильности, к которому Вы пришли за время вашей практики работы с реальными устройствами.
В вашей практике были случаи, когда приходилось писать отдельные библиотеки, используемые другими программистами? Чтобы можно было скомпилить вашу библиотеку в бинарный файл и использовать в любой программе без привязки к конкретному устройству (но для конкретного чипа или семейства)?
Зачем тогда создали ветку по МК на форуме? Я думал у вас проф. форум... Это сообщение отредактировал(а) osandr - 23.7.2018, 11:03 |
|||
|
||||
Romikgy |
|
|||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
Это вопрос к вам, вы же топик стартер.... Это проф форум по программированию (в основном для ПК), эмбедед программирование не его профиль.... в реальных проектах ни кто не тянется к реализации универсальных решений (под все процы). То что реализуется , должно четко отрабатываться без ошибок и зависаний на конкретном процессоре! Большой проект который работает с многими процессорами это OpenWRT , и даже в нем грубо говоря создали множество отдельных проектов под разные процессоры! т.е. мало кто хочет играться с универсальностью! Но есть проекты у которых она присутствует. Один факт , если вы собрались писать универсальный проект/библиотеку вы должны знать все подводные камни всех поддерживаемых процессоров и их периферии. Даже опенсорс проекты такого дать не могут. ЗЫ вы практически проверили работу SPI на атмеле на предмет зависания без устройства с другой стороны? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
osandr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Romikgy, под универсальностью в данном случае я имею ввиду код, который легко переносится без допиливания в любой другой проект на одном и том же контроллере. К примеру написали один раз драйвер для работы с SPI и больше его не переписываем под каждый конкретный проект для одного и того же камня. Я вижу три варианта реализации: основанный на поллинге, основанный на прерываниях, основанный на ОС (по сути тоже поллинг, но грамотно используется процессорное время). На голом железе универсальный драйвер можно реализовать на основе поллинга, недостатки которого я описал выше (то, что на практике модуль SPI не виснет - на это надеяться неправильно, правильнее предполагать, что любой модуль может дать сбой). Интересно, может есть более красивые решения на прерываниях без жесткой привязки к конкретному проекту? К примеру драйвер для работы с UART я часто реализовываю с применением кольцевого буфера. Функция записи помещает данные в буфер, откуда они отправляются по прерываниям. Аналогично принятые данные ложатся в буфер по мере поступления. Программа не зависает на ожидании байта из UART и может делать какие-то другие вычисления. Когда данные понадобятся, программа "спросит" сколько их хранится в буфере и дальше примет решение забирать или пока выполнить другие действия. Кольцевой буфер можно реализовать на DMA в кольцевом режиме (в атмегах нет DMA). Но это конкретно UART. С SPI сложнее в том плане, что на каждый отправленный байт зачастую нужно сразу же получить ответ и обработать его, т.е. тут уже не получается просто складировать данные в буфер. Ну или хотя бы потому, что пока не будет получен ответ, нельзя отправлять новые данные на шину. Тоже самое можно отнести к интерфейсу I2C или каким-то другим. Может так понятнее объяснил что именно я хочу?
|
|||
|
||||
Romikgy |
|
||||||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
один процессор , уже легче
это не надеяться , это особенности работы железа... это все последовательные интерфейсы, и работать с ними можно по аналогии как и с юарт... просто спи и и2ц более стандартизованы и рациональнее обрабатывать их сразу
никто не запрещает сделать буфер достаточно большим , что бы передавать сразу несколько пакетов... не до конца... то что вы описали , делается использованием модулей , отдельная пара *.c *.h один раз написали (с учетом всех особенностей железа ) и потом кидаете эти файлы в другие проекты... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||||
|
|||||||
osandr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.7.2018 Репутация: нет Всего: нет |
Romikgy,
Отлично! Пример в студию. Хотелось бы увидеть Вашу реализацию. Мне кажется Вы слабо понимаете принцип обмена по SPI. Зачастую общение с ведомым устройством выполняется по определенному протоколу (для примера адрес, тип операции, данные). Обмен происходит в двух направлениях одновременно. Если после отправки данных на шину MOSI не принять данные, которые пришли по MISO, а сразу же сделать новую посылку по MOSI, то на следующей посылке у Вас произойдет переполнение приемного буфера SPI. Чтобы этого не произошло, приходится каждый раз дожидаться приема данных. Объясните каким образом вы задействуете здесь буфер "достаточно большой, что бы передавать сразу несколько пакетов"? Что по вашему пакет? Пакет в правильном понимании - это некий набор данных, а не один байт. Это сообщение отредактировал(а) osandr - 23.7.2018, 15:39 |
|||
|
||||
Правила форума "Микроконтроллеры (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. |