Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно писать библиотеки для микроконтролле 
:(
    Опции темы
osandr
Дата 17.7.2018, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.7.2018

Репутация: нет
Всего: нет



Добрый день, уважаемые программисты!

Пишу программы для микроконтроллеров на Си достаточно долго. Но все время остается чувство, что можно писать код красивее, понятнее и лучше. Красивые решения находишь, когда изучаешь чужой код, например библиотеки драйверов от производителя чипа. Иногда пишу библиотеки сам с нуля. 
Так вот хотелось бы узнать: есть ли какие-то правила написания драйверов/библиотек, чтобы они надежно работали и в то же время код не был громоздким слишком.
Приведу пример. Допустим нужно написать драйвер, работающий с датчиком температуры по интерфейсу SPI. Сначала обычно пишется нижний уровень - прослойка, которая будет абстрагировать программиста от аппаратной части микроконтроллера и будет взаимодействовать с интерфейсом SPI и прерываниями (в зависимости от реализации). Затем будет какой-то промежуточный уровень, который будет через нижний уровень взаимодействовать с регистрами датчика. И наконец верхний уровень, который будет оберткой для промежуточного уровня, абстрагирующий программиста от аппаратной части датчика. Т.е. программист может даже в электронике не разбираться, а просто собирать показания датчика через вызов определенных функций. К чему я веду? К тому, что по-хорошему начиная с нижнего уровня нужно заботиться о надежности драйвера, проверять что аппаратная часть отработала как нужно, что данные корректно записаны или считаны, что не произошло каких-то аппаратных ошибок при передаче. То, что мы записали на шину данных SPI интерфейса данные еще не значит, что они дошли до абонента. К тому же операция эта не мгновенная и необходимо выждать какое-то время для чтения/записи. И тут разные варианты реализации есть: сама простая и, как мне кажется, опасная (в плане зависания), а также не рациональная реализация - это ожидание завершения операции; вторая реализация - это работа по прерываниям, лучше в том плане, что процессор не "простаивает" впустую. И таким образом получается, что все проверки на нижнем уровне они как бы "всплывают" в проверки на верхнем уровне и когда нужно выполнить к примеру несколько записей по SPI подряд, то каждая такая запись обрастает оператором if, что смотрится не очень приятно и читаемо, да и к тому же, я считаю, дает лишнюю нагрузку на процессор и увеличивает машинный код.
Может кто-то поделится своим опытом написания библиотек или посоветует литературу к прочтению? Или выскажет свои мысли по этому поводу как сделать лучше.
PM MAIL   Вверх
Mazzi
Дата 17.7.2018, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 823
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Работу с бортовой начинкой нужно делать по прерываниям. Остальное по ситуации, поскольку всё сильно зависит от решаемой задачи. 


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
osandr
Дата 17.7.2018, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.7.2018

Репутация: нет
Всего: нет



Хорошо написанный драйвер подразумевает его адаптацию под любую ситуацию. Поэтому ответ не принимается  smile 
PM MAIL   Вверх
Romikgy
Дата 17.7.2018, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7227
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 142



Цитата(osandr @  17.7.2018,  14:40 Найти цитируемый пост)
для микроконтроллеров

МК один другому МК рознь...

красота - это удобство разработки, одновременно это потеря производительности (появляются абстракции , прослойки) .... и ее необходимость сильно зависит от МК для которого пишут.... и если размер и быстродействие важно , значит пишут максимально оптимально с включением (где надо) ассемблера, если места не мерено и частоты хватает , можно и красиво с ООП  


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
osandr
Дата 17.7.2018, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.7.2018

Репутация: нет
Всего: нет



Даже если мы работает по прерываниям, все равно в программе где-то будет сделано ожидание наступления нужного события. Если на аппаратном уровне мы ловим прерывание, когда установится бит готовности в регистре статуса, то все равно на более высоком уровне мы ждем когда будет записана последовательность байт например и установится флаг или мьютекс, или семафор. От ожидания все равно никуда не уйти. При работе с операционными системами реального времени программиста не заботит проблема как будет распределено процессорное время и программа в любом случае сохраняет работоспособность, другие задачи выполняются по прежнему. При написании драйвера мы не знаем будет ли он использоваться с операционной системой или без, а значит должны позаботиться о том, что при сбои в аппаратной части он не вешал работу всей программы и адекватно обрабатывал такие ситуации.

Добавлено через 3 минуты
Цитата(Romikgy @ 17.7.2018,  16:19)
Цитата(osandr @  17.7.2018,  14:40 Найти цитируемый пост)
для микроконтроллеров

МК один другому МК рознь...

красота - это удобство разработки, одновременно это потеря производительности (появляются абстракции , прослойки) .... и ее необходимость сильно зависит от МК для которого пишут.... и если размер и быстродействие важно , значит пишут максимально оптимально с включением (где надо) ассемблера, если места не мерено и частоты хватает , можно и красиво с ООП

Будем рассматривать тот вариант, когда ресурсы МК позволяют писать код красиво. Например пусть это будет STM32
PM MAIL   Вверх
xvr
Дата 17.7.2018, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6939
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 8
Всего: 221



Цитата(osandr @  17.7.2018,  16:22 Найти цитируемый пост)
При написании драйвера мы не знаем будет ли он использоваться с операционной системой или без

А должны знать. Драйвера под операционную систему и под голое железо очень сильно отличаются. Для голого железа часть функций ОС придется взять на себя программе верхнего уровня, а часть - самому драйверу. При этом распределение этих частей сильно зависят от конечного приложения. Если же вы начнёте всё пихать в драйвер, то у вас получится своя ОС сделанная из драйвера, а это уже совсем нехорошо smile

PM MAIL   Вверх
Romikgy
Дата 17.7.2018, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7227
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 142



Цитата(osandr @  17.7.2018,  15:22 Найти цитируемый пост)
 Например пусть это будет STM32 

тогда использовать ООП , если нравится...
ifdef определить для какой системы , тот или иной кусок кода, будет или нет использоваться ОС, и т.п. 



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Mazzi
Дата 17.7.2018, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 823
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Цитата(osandr @ 17.7.2018,  16:08)
Хорошо написанный драйвер подразумевает его адаптацию под любую ситуацию. Поэтому ответ не принимается  smile

Ваше утверждение можно легко опровергнуть взяв целевой камень AtTiny12.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
osandr
Дата 17.7.2018, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.7.2018

Репутация: нет
Всего: нет



Цитата(Mazzi @ 17.7.2018,  17:06)
Цитата(osandr @ 17.7.2018,  16:08)
Хорошо написанный драйвер подразумевает его адаптацию под любую ситуацию. Поэтому ответ не принимается  smile

Ваше утверждение можно легко опровергнуть взяв целевой камень AtTiny12.

Тогда это уже будет не драйвер, а небольшое приложение, в котором все намешано в кучу. Речь не идет о тиньках

Добавлено через 9 минут и 58 секунд
Цитата(Romikgy @ 17.7.2018,  16:58)
Цитата(osandr @  17.7.2018,  15:22 Найти цитируемый пост)
 Например пусть это будет STM32 

тогда использовать ООП , если нравится...
ifdef определить для какой системы , тот или иной кусок кода, будет или нет использоваться ОС, и т.п.

И каким образом ООП может решить вопрос надежности и избежать многочисленных проверок на всех уровнях абстракции? Да и в языке Си нет ООП. 
PM MAIL   Вверх
Romikgy
Дата 17.7.2018, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7227
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 142



Цитата(osandr @  17.7.2018,  16:15 Найти цитируемый пост)
И каким образом ООП может решить вопрос надежности и избежать многочисленных проверок на всех уровнях абстракции? Да и в языке Си нет ООП.  

так си и не так красив как с++(особенно с абстракциями) ... я предложил вариант , ваше дело прислушиваться ли к нему...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Mazzi
Дата 18.7.2018, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 823
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Цитата(osandr @ 17.7.2018,  17:15)
Цитата(osandr @ 17.7.2018,  16:08)
Хорошо написанный драйвер подразумевает его адаптацию под любую ситуацию...

Цитата(osandr)
... Речь не идет о тиньках...



Сначала подумайте, потом пишите.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
osandr
Дата 18.7.2018, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.7.2018

Репутация: нет
Всего: нет



Цитата(Mazzi @ 18.7.2018,  14:55)
Цитата(osandr @ 17.7.2018,  17:15)
Цитата(osandr @ 17.7.2018,  16:08)
Хорошо написанный драйвер подразумевает его адаптацию под любую ситуацию...

Цитата(osandr)
... Речь не идет о тиньках...



Сначала подумайте, потом пишите.

Что вас не устраивает в написанном? Я могу ответить встречно: сначала подумайте, потом советы давайте. Понимаете, сейчас много крутых контроллеров, которые доступны широким массам, но почему-то люди до сих пор не отучились писать программы так, будто они пишут под attiny12. Вы же наверняка знакомы с Ардуино? Хотите сказать, что все библиотеки там тоже написаны под конктретную ситуацию?
PM MAIL   Вверх
Romikgy
Дата 18.7.2018, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7227
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 142



Цитата(osandr @  18.7.2018,  14:11 Найти цитируемый пост)
 Вы же наверняка знакомы с Ардуино? Хотите сказать, что все библиотеки там тоже написаны под конктретную ситуацию? 

в адруино используется С++ с классами , для красоты и облегчения программирования, 
код получается громоздким, что то стоящее на ней достаточно сложно , а разные моргалки пишутся на ура , даже домохозяйками ( для этого и задумывался!!! ) есть ардуино и на стм32 , там все проще , по размерам и скорости ...
Откройте код под ардуину и увидите , что там все ситуации учтены , где дефайнами процессорозависимый код, и процессоронезависимый , как правило в классах....


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Mazzi
Дата 18.7.2018, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 823
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Цитата(osandr @ 18.7.2018,  15:11)
...сначала подумайте, потом советы давайте...

Почему вы грубите модератору? Ещё раз и в баню отправлю.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
osandr
Дата 20.7.2018, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.7.2018

Репутация: нет
Всего: нет



Посмотрел как выполнена отправка данных по SPI в Ардуино и разочаровался:

Код

// Write to the SPI bus (MOSI pin) and also receive (MISO pin)
  inline static uint8_t transfer(uint8_t data) {
    SPDR = data;
    /*
     * The following NOP introduces a small delay that can prevent the wait
     * loop form iterating when running at the maximum speed. This gives
     * about 10% more speed, even if it seems counter-intuitive. At lower
     * speeds it is unnoticed.
     */
    asm volatile("nop");
    while (!(SPSR & _BV(SPIF))) ; // wait
    return SPDR;
  }


Бесконечное ожидание флага SPIF. Т.е. если что-то пошло не так, то программа просто зависает и никто не знает причины
PM MAIL   Вверх
Google
  Дата 20.8.2018, 23:10 (ссылка)  





  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0854 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.