Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2018, 15:31   #1
osandr
 
Регистрация: 01.06.2010
Сообщений: 4
По умолчанию Как правильно писать библиотеки для микроконтроллеров

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

Пишу программы для микроконтроллеров на Си достаточно долго. Но все время остается чувство, что можно писать код красивее, понятнее и лучше. Красивые решения находишь, когда изучаешь чужой код, например библиотеки драйверов от производителя чипа. Иногда пишу библиотеки сам с нуля.
Так вот хотелось бы узнать: есть ли какие-то правила написания драйверов/библиотек, чтобы они надежно работали и в то же время код не был громоздким слишком.
Приведу пример. Допустим нужно написать драйвер, работающий с датчиком температуры по интерфейсу SPI. Сначала обычно пишется нижний уровень - прослойка, которая будет абстрагировать программиста от аппаратной части микроконтроллера и будет взаимодействовать с интерфейсом SPI и прерываниями (в зависимости от реализации). Затем будет какой-то промежуточный уровень, который будет через нижний уровень взаимодействовать с регистрами датчика. И наконец верхний уровень, который будет оберткой для промежуточного уровня, абстрагирующий программиста от аппаратной части датчика. Т.е. программист может даже в электронике не разбираться, а просто собирать показания датчика через вызов определенных функций. К чему я веду? К тому, что по-хорошему начиная с нижнего уровня нужно заботиться о надежности драйвера, проверять что аппаратная часть отработала как нужно, что данные корректно записаны или считаны, что не произошло каких-то аппаратных ошибок при передаче. То, что мы записали на шину данных SPI интерфейса данные еще не значит, что они дошли до абонента. К тому же операция эта не мгновенная и необходимо выждать какое-то время для чтения/записи. И тут разные варианты реализации есть: сама простая и, как мне кажется, опасная (в плане зависания), а также не рациональная реализация - это ожидание завершения операции; вторая реализация - это работа по прерываниям, лучше в том плане, что процессор не "простаивает" впустую. И таким образом получается, что все проверки на нижнем уровне они как бы "всплывают" в проверки на верхнем уровне и когда нужно выполнить к примеру несколько записей по SPI подряд, то каждая такая запись обрастает оператором if, что смотрится не очень приятно и читаемо, да и к тому же, я считаю, дает лишнюю нагрузку на процессор и увеличивает машинный код.
Может кто-то поделится своим опытом написания библиотек или посоветует литературу к прочтению? Или выскажет свои мысли по этому поводу как сделать лучше.
osandr вне форума Ответить с цитированием
Старый 18.07.2018, 12:47   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Инкапсулировать. На верхний уровень подавать объекты или структуры с готовыми и валидными данными. Проверки вынести в отдельную функцию типа
bool CheckMyStruct(STmyStruct myStruct)

Цитата:
Сообщение от osandr Посмотреть сообщение
что данные корректно записаны или считаны, что не произошло каких-то аппаратных ошибок при передаче.
За передачу отвечает разработчик железа. У него есть требования по надёжности, электромагнитной совместимости, есть рекомендации по трассировки. Так что у него есть возможности для решения.

Если мы хотим доказать что он накосячил, то делаем отдельную проверку шины, условно/периодическую.

А проверку на каждый байт это сугубо индивидуально, от неё никуда не уйдёшь. Если только оформить более красиво.
1)SIGNAL/SLOT
2)try/excep
3)nerro/lasterror, bool.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 18.07.2018, 14:32   #3
osandr
 
Регистрация: 01.06.2010
Сообщений: 4
По умолчанию

Цитата:
За передачу отвечает разработчик железа. У него есть требования по надёжности, электромагнитной совместимости, есть рекомендации по трассировки. Так что у него есть возможности для решения.
Это называется "уйти от ответственности". Тогда начинается: программист обвинят инженера-электроника, а инженер-электроник обвиняет программиста. Программа должна отслеживать ошибки аппаратной части и предупреждать верхний уровень об этом, а не просто послали данные и остальное не беспокоит. К тому же иногда железячные проблемы можно обойти программным путем.
osandr вне форума Ответить с цитированием
Старый 19.07.2018, 12:16   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Кесарю - кесарево, слесарю - слесарево. Мне пришлось работать в команде, где у электронщика была отмазка такого типа. "Ты должен все глюки исправлять программно" - "Так как же я могу их исправить, если с таким питанием, как ты мне подаешь, процессор - уже не устройство для выполнения программы, а просто кусок керамики ?" - В ответ - стандартная демагогия "... а кто не хочет - ищет причину"
Драйверов (библиотек, макросов, плагинов и пр.), обеспечивающих нормальную работу на кривом железе - не бывает, думаю. Есть, конечно, кое-что, например, исправление неправильно принятого пакета с помощью избыточного кодирования, но и то в определенных пределах.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно писать? _Mikhail_ PHP 6 28.10.2012 02:22
Delphi mysql trigger - как правильно писать? Прошу пример iskurt Помощь студентам 7 03.06.2012 19:03
Ребята как правильно на писать блок-схему по данному листингу программы(просто очень надо, а у меня не получается) denl9 Общие вопросы Delphi 1 08.05.2012 22:05
как правильно писать модули для билдера CodeNOT Общие вопросы C/C++ 2 27.12.2010 19:12
Как правильно запретить писать в комбо-боксе. А только выбирать? TwiX Общие вопросы Delphi 2 02.06.2010 01:34