Почему и когда библиотеки драйверов - плохо.

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

Наш мир устроен так, что любое явление имеет свои положительные и отрицательные стороны. Человек же пытается комбинировать явления таким образом, чтобы усиливать положительные стороны и компенсировать отрицательные. Этот принцип находит свое отражение в понятии «границы применимости». Естесственно, рассуждая
о применении библиотек, нельзя забывать о том, что у них тоже есть свои границы применимости. И, очевидно, нельзя однозначно сказать, хорошо использовать библиотеки или плохо — в каждых конкретных условиях ответ на этот вопрос может быть разным. Поэтому наиболее здравым представляется прежде всего найти те самые виды условий, определяющие целесообразность использования конкретного метода.

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

Когда библиотеки — хорошо?

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

Еще один вид полезных библиотек — библиотеки, реализующие действительно сложную логику вроде протокола USB. Хотя по большей части приведенный пример — не абстракция от аппаратуры, о которой собственно, эта статья, а решение отдельной задачи.

Однако, за все надо платить.

Когда библиотеки — плохо?

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

Второе — оверинжиниринг. Если требуется, например, всего лишь настроить порт на выход, то (в случае STM32L) достаточно написать:


  //Turn on port B clock
  RCC->AHBENR=RCC_AHBENR_GPIOBEN;
  
  //Set pin 6 and pin 7 to output mode
  GPIOB->MODER=GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0;


Из документации явствует, что все остальные параметры менять не надо, так как они по умолчанию имеют нужные для этого режима значения. В случае же стандартной бибилиотеки код будет выглядеть так:


  GPIO_InitTypeDef GPIO_InitStructure;

  ...
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ...);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |  GPIO_Pin_7;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);


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

Здесь обычно в качестве частого возражения говорится, что, дескать, там же килобайты памяти, что нам структура из пары десятков байт? Однако, как известно, памяти много не бывает, и в серьезном проекте разнообразные инициализации в итоге могут отъедать существенную ее часть. Кроме того, библиотечный код более громоздок, что делает его трудным для восприятия. И все вместе это противоречит самой здравой концепции — «ничего лишнего».

Таким образом, круг применимости библиотек очень ограничен, и в большинстве случев гораздо лучше обходиться без их использования. Исключения есть, но их мало (и они перечислены выше).
  • +2
  • 30 октября 2011, 13:51
  • _YS_

Комментарии (242)

RSS свернуть / развернуть
Поддерживаю
0
  • avatar
  • mzw
  • 30 октября 2011, 14:29
GPIOB->MODER=GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0;
Зато без документации этот код абсолютно не читаем. И чтобы, например, переключить ножку в режим чтения — снова надолго лезть в датащит.

Чтобы структуры инициализации съели хотя бы даже 1кб — это очень постараться нужно.

В таких применениях, как встроенные системы, где работа ведется очень близко к железу, при написании кода даже с самыми продуманными библиотеками могут встречаться комбинации параметров, вводящие систему в состояния, выйти из которых возможно только обладая достаточно глубоким пониманием принципов работы конкретного железа.
А конкретный пример?:)

Вобще, стандартная библиотека от ST очень неудобна, тут я согласен. Куча этих структур, именования — как будто библиотеку джависты писали.
Жалко что libopenstm32 что-то заброшена в последнее время, она намного приятнее.
Сейчас разбираюсь с USB стэком. По сравнению с ним LUFA просто прекрасна! Так и тянет свой велосипед написать.
0
  • avatar
  • iv_s
  • 30 октября 2011, 14:40
Зато без документации этот код абсолютно не читаем.

А комментарий над строчкой Вы зачем выкинули? ;)

И чтобы, например, переключить ножку в режим чтения — снова надолго лезть в датащит.

Зачем? Из комментария (выброшенного Вами ;) ) ясно, что при установленных битах мы имеем выход. Очевидно, что, чтобы настроить порт на вход, их надо сбросить. Третьего не дано, система двоичная. :D

Но даже если лезть в ДШ (если, например, интересует какая-то дополнительная функция), то это не так и долго. Там есть оглавление. :) И, кстати, документацию на библиотеку читаьь тоже надо.
0
Ок, я пример свой ниже так же перепишу:)
//Set pin 6 and pin 7 to output mode
(void*)0x1234 = 0x4321
0
Насчет двоичности:

● Input floating
● Input pull-up
● Input-pull-down
● Analog
● Output open-drain
● Output push-pull
● Alternate function push-pull
● Alternate function open-drain

И регистр MODER есть только в STM32L, потому и двоично, т.к. подтяжка в другом регистре настраивается.
А на STM32F уже регистры CRL/CRH, где функция порта настраивается двумя битами.
И вот при использовании библиотеки со всем этим заморачиваться не нужно. Т.к. по сути это абсолютно несущественные вещи, достаточно знать что значит все эти режимы и все.
А куда какой битик записать — это уже ненужная рутина, избавиться от которой и есть задача библиотеки.
0
А, и подитожил бы я наоборот, круг применения прямой работы с железом — очень узок, разве что обучение и какая-нибудь специфика, которую придумать сразу даже сложно.
Просто посыл у вас неправильный. Использования библиотек — это не для отупления:) Т.е. это ни разу не подразумевает, что датащит читать не нужно.
Библиотеки нужны для удобства разработки. Чтобы не нужно было высчитывать битики и писать, нечитаемые без документации, инструкции.
А насчет стремления к «ничего лишнего» в таком контексте, прямо так и напрашивается
(void*)0x1234 = 0x4321
вместо:
GPIOB->MODER=GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0;
\
Ну или сразу на асемблере:)
0
«Все должно быть сделано как можно проще, но не проще того».

Альберт Эйнштейн.


Использование регистро и дефайнов — оптимальный компромисс между удобочитаемостью и функционалом.
+1
Такого ужаса джависты не пишут. Тут васиком пахнет.
0
вот объясните мне, вероятно, дураку, cmsis — это библиотека или нет?
библиотека обязательна должна быть уже в бинарном виде с прототипами функций? или всё же «библиотека» в исходниках — это тоже библиотека?
по мне так всё, что рефакторено — это библиотека…

зы. ни какпли не программер…
0
cmsis — это библиотека или нет?

Это нечто среднее. Глобально — скорее нет. Это ближе к простым дефайнам регистров.
0
так что такое библиотека, преде тем как начинать спор, следует объявить все используемые понятия, иначе это флейм для получения лулзов
0
Библиотека — законченный набор процедур, инкапсулирующий определенный функционал.
0
гы, смсис — библиотека, да и любая функция — библиотека
0
В IAR начиная с версии 6.2 CMSIS — набор intrinsic-функций.
0
Так и libc некоторыми компиляторами поддерживается нативно. Но всеравно — это библиотека.
0
в классической CMSIS всего две или три функции — инициализация ядра и все. Больше там исполняемого кода нет.

Это именно что стандарт описания железа, не более того.
0
инициализация ядра и

работа с NVIC.
0
… и SysTick…
0
хм, систик ручками «подключаю»
0
Господа, ну вы прямо из крайности в крайность. Как это не нужны библиотеки? Вопрос в том для чего она предназначена и как написана. Все же пользуются стандартными биб. ввода вывода и ничего, никто в набаты не бьет. О чем речь? О библиотеках вообще или о библиотеках периферии от ST? Главная цель этой библиотеки, имхо, быстренько запустить камень, полюбоваться красотой мигания светодиодов, и прочего, и начать побыстрей отслюнявливать денюжку. Маркетинг, епрст.
0
О! Еще один человек, вдумчиво и до конца прочитавший мою статью. :)
0
Прочитал бегло статью. Прочитал комментарии, перечитал вдумчиво…

Так что же Вы предлагаете? Писать код для каждого проекта с нуля? Явно нет. Библиотека это ведь не только инициализация, это РАБОТА с переферией. Причем как со встроенной в МК, так и внешней. Ниже приведен пример (работа с внешней EEPROM).

При написании проекта Вы все равно будете использовать для записи/чтения функции. Так почему бы не вынести её в отдельный файл? И не конфигурировать написанные один раз функции в рамках нового проекта и, соответственно, нового железа? Про кроссплатформенность пока не вспоминаю. Итого, вводная следующая: работаем с одним семейством (AVR, ARM, x51 — не важно), используем в большинстве разрабатываемых устройств внешнюю EEPROM по I2C. Так ПОЧЕМУ, бы не использовать уже написанный код? Причем не просто копипастипь его из проекта в проект, а выделить его в отдельный файл? Получается, что компилятор видит как в случае с библиотекой, так и без нее, одни и те же функции. Так что разросшегося кода не получается. При этом, если всплывают какие-либо особенности конкретной микросхемы памяти, помечаем кусок кода директивой #ifdef. При этом появляется возможность многократного тестирования кода и устранения ошибок «для всех разработок» сразу.

P.S. Извините за сумбурность, думаю основную мысль донести получилось.
P.P.S. Про настройку периферии и ненужные упрощения согласен. Но ведь редко кто пишет функцию abs(), большинство подключат math.h. Отсюда и вытекает ниже озвученный вопрос: КАК написать библиотеку, чтобы её можно было многократно использовать без лишнего гемороя?
0
Так что же Вы предлагаете?

Главная мысль моей статьи состоит в том, что надо понимать то, что используешь — нельзя учиться, используя интерфейс готовых библиотек. Необходимо хорошо представлять, что внутри.

Если человек отлично представляет, как работает узел (EEPROM, например), то нет ничего плохого в том, что он облегчит себе задачу, написав (или раскурив готовую) библиотеку. Но когда новичок умеет пользоваться только интерфейсом, а при переходе чуть ниже встает в тупик — это отвратительно.
0
Ок, +1
0
уж ты ж ёжики…
Вы, как мне кажется, не работали ни с чем далече простейших МК…
Предлагаю для забавы разобрать алгоритмы работы библиотек функций адаптивной фильтрации для любого ЦСП. По опыту разработки железок, где без подобных вещей не обойтись, могу сказать, что проще отдать 3-5к$ за библиотеку и не паритсья, т.к. стоимость спеца, который может «хорошо представлять, что внутри» запредельная.
0
Так в статье как раз и реч о необходимости и достаточности. А ЦСП — противопложная сторона относительно «помигать светодиодом» с использованием библиотек.
0
я прочитал заметку вовсе не по диагонали, и про сказанное мной тоже есть в заметке, но высказывание автора меня приводят в замешательство (впрочем как и некоторые части заметки), так как в наличии, имхо, «взаимопротиворечащие параграфы»
0
Еще раз:

Еще один вид полезных библиотек — библиотеки, реализующие действительно сложную логику вроде протокола USB. Хотя по большей части приведенный пример — не абстракция от аппаратуры, о которой собственно, эта статья, а решение отдельной задачи.

Библиотеки фильтрации — отдельная задача, которая в общем случае требует дополнительного исследования. Так что как раз тут библиотеки оправданы. Я говорю о том, что нельзя использовать библиотеки тогда, когда стоит задача разобраться в работе того, что эти библиотеки скрывают. Например, студенту-математику стоило бы таки разобраться, как работают упомянутые Вами библиотеки.
0
А в чем принципиальная разница при выводе единички в порт? Ну буду я знать, что для этого нужно записать 1 бит туда, а до этого еще 1 туда и сюда. И что это изменит? Даст глубокое понимание работы процессора? Бред. Я буду получать в результате то же самое, с тем же самым уровнем знаний о процессоре, но без геморроя запоминания куда собственно эту единичку в каждом случае нужно пихать. И не буду натыкаться на грабли, типа что для считывания значения сдвоенного порта сначала нужно считать именно младший байт, а только потом старший. И производительность тут не показатель. В 99% случаев всем глубоко наплевать сколько тактов тратится на этот самый вывод единички. Тем более нормальные компиляторы инлайнят вызовы библиотечных функций и в коде получаем те же самые запихиванияя битов в одну команду.
0
А в чем принципиальная разница при выводе единички в порт? Ну буду я знать, что для этого нужно записать 1 бит туда, а до этого еще 1 туда и сюда. И что это изменит? Даст глубокое понимание работы процессора? Бред.
Такой же бред, как использование для этого библиотек… ни меньше, ни больше…
Пока сидели на PIC и AVR работа с регистрами бредом не была… что изменилось??? Добавилось пару-тройку регистров??? Стало влом битами рулить??? Или дань моде… «Ни шагу без либы!» ???
0
Ну добавилось далеко не пару регистров. В той же меге128 их всего было 66, включая сдвоенные. А сколько их в стм32? И если бы библиотеки были бы для авр, то их бы что не использовали? Или только вручную запихать бит и есть настоящее труЪ?
0
Ну добавилось далеко не пару регистров. В той же меге128 их всего было 66, включая сдвоенные. А сколько их в стм32?
Но STM32 и намного «жирнее»…
Или только вручную запихать бит и есть настоящее труЪ?
А запихать его «в особо извращённой форме» это теперь «искусство пользования библиотеками от производителя»???
Я уже молчу об знании АСМа, на минимальном уровне… чтобы хоть оперативно разобраться в случае неудачи… Похоже это уже давно никого не интересует и «обсуждению не подлежит»…
0
А… да!!! Добавлю… Я забыл про любителей полу- недо- СИ… которые без библиотек вздохнуть не могли… у которых только упоминание HI-TECH или C18, C30, С32 для Микрочип и WinAvr от Атмэл вызывали мгновенную потерю сознания…
0
Ув. HHIMERA, Вам тоже не дают у Вас тоже проблемы с девушками? :D Поверьте, это совсем не повод набрасываться на товарищей по сообществу. :D Я так же страдаю, но, как видите, пока более-менее адекватен. :DD
+2
Я так же страдаю, но, как видите, пока более-менее адекватен. :DD
Я не страдаю… как видите… и этим приношу, некоторым, невыносимые страдания… ))))
По поводу девушек… эх… помолодеть бы лет на тридцать с гаком… все бы мои были… )))))
Хотел оппонентам предложить выложить попунктно список «явных превосходств при пользовании библиотеками от СТМ», но передумал… «за что бороться?»… )))))
Поверьте, это совсем не повод набрасываться на товарищей по сообществу. :D
Дык… не покусал же, и слава Богу!!! ))))))
В следующий раз подумают… прежде чем херню нести…
0
Пока сидели на PIC и AVR работа с регистрами бредом не была… что изменилось???
Ну, там библиотек от производителя не было, так что и выбора не было. Еще раньше вон в машинных кодах программировали, но это же не повод отказываться от ассемблера.
Впрочем, там оные библиотеки со свистелками и перделками делали самостоятельно.
0
В полу- недо- СИ всегда были…
0
ORLY? Первые компьютеры появились в 40-50, тогда как С — в начале 70-х.
Да и концепцию ассемблера (как впрочем и машины, способные справиться с такой сложной программой) придумали далеко не сразу. А до этого приходилось программировать в двоичных кодах. Собсно, вот.
0
Хотя, я не уверен, что правильно понял твою фразу.
0
В наше время самый дорогой ресурс, как известно время. А хорошо написаная, отлаженная библ. и дает нам выигрыш во времени. Такой библиотеки не написать конечно, не утруждая себя лазаниям по битам и не шерстя дш. STM32 камень молодой, еще нет такой отработанной инфраструктуры, тут либо писать самому, либо ждать пока напишут другие, а конкуренты не спят и уже написали. Ничего, пройдет время напишут хорошие библиотеки, отладят. Может кто нибудь из нас и напишет… ))
0
Понесло меня. А ДШ читать или не читать, это по моему даже глупо обсуждать. Это же как азбука. Дергая за соскИ StdPeriph_Lib торчащие из черного ящика STM32, однажды в конечном итоге мы придем к положению по Мерфи «Если ничего не работает, прочтите наконец инструкцию».
0
Неплохая статья. Вам удалось «аккуратно пройтись по краю» никого не задев, и в тоже время аргументировать свое мнение.
Единственное, непонятно, почему вопрос звучит «юзать библиотеку или нет»? Я бы сказал «юзать библиотеку от производителя или писать подобную библиотеку самому»? Без библиотеки (на самом деле это не обязательно либа в понятии ЯП, просто некий уровень абстракции и инкапсуляции реализации) все равно не обойтись (да и незачем код копипастить), особенно при командной разработке.
0
  • avatar
  • e_mc2
  • 30 октября 2011, 17:38
Неплохая статья.

О, спасибо. :)

Вам удалось «аккуратно пройтись по краю» никого не задев, и в тоже время аргументировать свое мнение.

Ну дыг! На том и держимся. :)

Единственное, непонятно, почему вопрос звучит «юзать библиотеку или нет»?

На самом деле, вопрос звучит как «юзать ST StdPeriphLib для STM32 или писать самому/писать в регистры». Да, это подразумевается неявно; дело в том, что весь пост вырос из уже давно идущей в комментариях к разным статьям полемики по этому конкретному вопросу, и служит развернутым ответом на реплики оппонентов. Просто комментарии оказались неспособны вместить все, что я хотел сказать, и я запилил топик.
0
(да и незачем код копипастить), особенно при командной разработке.
Да, в серьезной конторе вас за это выгонят в три шеи! А потом спутники улетают нахрен с орбиты…
0
Я уже не говорю про то время, которое тратится на само заполнение структуры, которая потом так и остается висеть в памяти, уже будучи ненужной.
ORLY? А мне вот кажется, что она создается на стеке и после выхода из функции инита просто прибивается (хотя, если напихать инит в main — то будет висеть все время, да).
Таким образом, круг применимости библиотек очень ограничен, и в большинстве случев гораздо лучше обходиться без их использования. Исключения есть, но их мало (и они перечислены выше).
Скорее наоборот. Отказываться от библиотек стоит только там, где нужна оптимизация (действительно нужна) и при изучении низкого уровня. Ну, еще там, где удобнее без них. Скажем, ножкой дрыгнуть куда удобнее через GPIOx->BSRR.
Даже при изучении библиотека полезна. Во первых, скрыть то, что не нужно в данный момент, а во вторых — лично мне нравится изучить в общем и углбляться в детали, иначе, как говорится, «за деревьями леса не видно».

Ну и о сокрытии. StdPeriphLib как раз не особо скрывает железо, она только регруппирует параметры в более человеческий вид.

Но в главном, конечно, соглашусь — библиотека не панацея, и не стоит ни полагаться чисто на нее, ни начисто ее отрицать.
0
  • avatar
  • Vga
  • 30 октября 2011, 17:40
библиотека не панацея, и не стоит ни полагаться чисто на нее, ни начисто ее отрицать.

Вот это как раз главное, что я хотел донести. Библиотека — всего лишь инструмент.
0
А мне вот кажется, что она создается на стеке и после выхода из функции инита просто прибивается (хотя, если напихать инит в main — то будет висеть все время, да).

Опять же, это Вы понимаете, что процесс можно оптимизировать, вынеся инициализацию в функцию. А новичок, начинающий с библиотек, и заводит структуры в main()…
0
Да и фиг с ними, структурами. С настолько богат на тонкости, что новичок еще дооооооооооооооооолго будет изучать, как надо делать, а как — нет. А поначалу и мертвый груз текстурок в памяти не будет критичен.
Кроме того, новички имеют свойство копипастить код, а в примерах почти всегда инит вынесен.
0
А потом он привыкнет, и будет искренне считать, что так правильно. И если бы дело было только в структурах…
0
Вот уж в этом плане библиотеки не влияют. Быдлокодить можно на чем угодно.
Опять же, привыкают обычно к тому, что видят в примерах. А там обычно правильно.
0
«А быдлокодить либами… ещё лучше!» ))))))))
Халявная рассылка сделала своё дело… народ не отличающий бит от байта нуждался в некой «волшебной палочке»… и он её получил… )))))))))))))))

«Библанутым нет покоя!» ))))))
Зачем понимать, зачем читать, зачем писать… Любителей «халявного» программирования и поду- недо- СИ всегда хватало… особенно на 8-ми битных платформах… И тут на тебе… такой «подарок» от STM… ))))))))
0
Я для себя давно нашел компромиссное решение:
СПЛ я использую только в качестве того места, где можно подсмотреть как работать с той или иной периферией.
Таким образом я и учусь и не затормаживаю камень вызовом не нужных функций.
0
Да уж… сколько людей — столько мнений. При этом спорят, а если вдуматься — то говорят об одном и том же только слова разные… :)
Для себя я решил так: если надо инициализировать 2-3 ноги, да еще и разные по функционалу, я работаю напрямую с регистрами. Если же надо определить пачку ног — я работаю с библиотекой. Ну и с периферией в целях изучения библиотеки работаю тоже через нее, хотя иногда и экспериментирую с прямым обращением к регистрам, чтобы лучше уловить суть, чего от меня библиотека хочет.
В моем случае время никуда не жмет. Хочется — ковыряюсь и изучаю. Не хочется — занимаюсь чем -нибудь другим.
0
Для себя я решил так: если надо инициализировать 2-3 ноги, да еще и разные по функционалу, я работаю напрямую с регистрами. Если же надо определить пачку ног — я работаю с библиотекой.
Не вижу разницы… ))
0
разница в том, что не надо гемороится с высчитыванием битов в битмасках и составлением магических чисел. Тупо перечислил нужные ноги и все. Задавать много ног со всеми их режимами через регистры в STM все таки несколько геморойно…
0
Все эти мысли от нежелания просмотреть файлы которыми пользуетесь…
stm32f10x.h в частности…
И не надо никаких магических чисел и вычислений… кроме случаев установки значений по дефолту…
И другим всё всегда понятно будет…
0
а с установкой значений по дефолту какие проблемы? они и так стоят. Как раз с настройкой параметров GPIO магических чисел достаточно и выглядит оно менее наглядно. Либо писанина вырастает в десятки раз, если каждую ногу отдельно прописывать. А файл stm32f10x.h я смотрю периодически, равно как и остальные.
Другими словами настройки на выход PP двух ног и 10 ног через библиотеку будет отличаться только строкой с перечислением ног. Выглядит наглядно и достаточно компактно.
Чтобы добиться такого же результата просто через регистры — надо либо писать магические числа, что сразу потеряет наглядность, либо раздувать код на несколько экранов.
0
А разработчики из STM и TI считают, что программы должны писаться исключительно через библиотеки. Последние вообще хотят придти в итоге к работе только через библиотеки, а работу с регистрами и информацию о них убрать из общего пользования. По крайней мере на их конференции у меня сложилось именно такое мнение.
0
  • avatar
  • PRC
  • 31 октября 2011, 10:18
Всю жизнь были желающие «скрыть» и «запретить»… ))))
К счастью… мир имеет ещё и «градации серого»…
0
Любители, ковыряющие каждый бит в ручную им не интересны. Так что вполне могут сделать.
0
Хе-хе… Пусть сначала сделают… )))))))))
Особенно… в свете последних релизов малоногих камней… ))))
Ресурсов — ноль… периферии — ноль… и «Почему ваши камни так мало едят???»… «Из-за введённых библиотек камня не хватает даже на инициализацию, вот ничего и не едят!»… )))))))))))))))))))))))))))))))))))))))))))
0
TI уже встраивает в пзу М4 библиотеки типа графических. Использовать можно, а вот исходников нет.
И какие малоногие камни? Пики — ну их в сраку, атмел мне тоже что-то разонравился. А в армах я что-то малоногих камней не знаю.
0
А да и флаг им в руки… и ветер в спину… )))))
Да и «графические»… да ещё в «ПЗУ»… это не совсем «делаю всё правильно, а ноги не дрыгаются»… ))))))))))))))))))
Или всё таки… доведут ситуэйшн до маразма… «напишите нам, что вам надо, всё остальное мы сделаем сами»… )))))))))))))))))))
0
А в армах я что-то малоногих камней не знаю.
У каждого… понятие «малоногие» — своё… ))))))
0
Ну, блоха например) Правда, у нее 50МГц, 32кб ПЗУ, 8кб ОЗУ, UART, SPI, таймеры и прочая… Не очень-то «периферии ноль, ресурсов ноль». Ну и ножек не так мало, 16, но по размерам вполне на уровне малоножек. Да и все равно из 16 ножек тока 8 реально доступны как GPIO.
0
И что??? Чтобы разрулить 8 ног нужны «продвинутые либы от производителя»??? ))))))))
0
Может быть, может быть…
Кстати, библиотека настройки клока там прямо в самом МК зашита.
Ну и пользоваться библиотеками ничего не мешает.
0
Тема работы с библиотеками для меня очень интересна. Хочу задать вопрос: кто как эти самые библиотеки пишет? Попробую уточнить на типовом примере: есть внешняя EEPROM, связь по I2C. Надо записывать/читать данные.
Варианты использования следующие:
1) пишем для каждого проекта занова (совсем плохо);
2) копипастим нужные функции из предыдущего проекта;
3) пишем библиотеку и при работе с этой же микросхемой (этого семейства, отличия — объем, скорость чтения/записи, т.е. одни пишут/читают без задержек между посылками, другие — с задержками, и т.д.).

Не поймите не правильно, вопрос не в том, какой код надо написать. Вопрос в том, как организовать саму библиотеку. Что писать с *.с, что в *.h. Для задания параметров использовать какую-нить функцию инициализации или в хидере записывать ручками значения этих параметров?

Хотелось бы поговотить именно в этом ключе, а не просто надо/не надо.

Если кто-нить имеет какую-нить упорядоченную проверенную временем методику написания библиотек (вроде стандарта на фирме), напишите, плиз, статью. Или подскажите литературу. Очень не хочется «изобретать велосипед»!
0
  • avatar
  • do_sl
  • 31 октября 2011, 16:55
Я складываю функции в отдельный.с файл, их объявления — в .h. Потом просто добавляю в проект оба файла и включаю их.

Как-то так:

example.h:


#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_

#include <avr/io.h>
#include <stdint.h>

#define SET_PORTB
#define SOME_VALUE 10

void ExFunc(uint32_t value);

#endif


example.c:


#include "example.h"

void ExFunc(uint32_t value)
{
  #ifdef SET_PORTB
    PORTB=value;
  #endif
  #ifdef SET_PORTD
    PORTD=value;
  #endif
}


main:


#include <avr/io.h>

#include "example.h"

void main(void)
{
  ExFunc(SOME_VALUE);
}


Можете поглядеть мой софт-UART.
0
еще небольшое дополнение: библиотеки или макросы от производителя иногда могут учитывать erratу.
например, для DSP Blackfin от AD, при создании нового проекта IDE спрашивает ревизию чипа, делает нужные дефайны, которые потом в макросах разруливаются соответствующим образом, чтобы обойти хардварные баги.

Вообщем как обычно, использовать что-либо или нет надо с полным пониманием того как оно работает и к чему приведёт.
0
  • avatar
  • _pv
  • 31 октября 2011, 18:31
с полным пониманием того как оно работает и к чему приведёт.

+100
0
И с пониманием того, к чему приведет отказ от этого чего-либо.
0
Дело только в том, что приобрести это понимание можно только последовательно.
0
Не понял, что ты хотел сказать.
0
Извините, но статья банальна. Так же можно и написать статью «Все бабы дуры», «Все мужики козлы». Не надо обобщать-зло, добро…
Ни одному программисту не платят деньги за знание всех регистров и всех битов конфигурации. Ни одна девушка еще не влюбилась в парня через его доскональные знания архитектуры процессора.
Ага, и не дай Бог вам поддерживать код, написанный бит-жокеем. Через неделю вы плюнете, почешете горящую от начальства задницу и перепишете наново.
Наводнение на Ямайке перебило поставки stm32- срочно переходим на renesas! Where is your bit-hacking now? Или будете выпрашивать два месяца на изучение нового процессора? Жизнь слишком коротка на такие скучные вещи.
Другое дело, что толковый программист может сам писать библиотеки, когда готовые слишком кривы или их вообще нету. Умение работать напрямую с регистрами — это как плавание: необходимо уметь плавать, но в обычной ситуации просто взять лодку.
+1
С плаваньем ситуация хорошая да, только вот прикол в том, что плавать надо тупо уметь. Т.к. лодка лодкой, но в критической ситуации ее может и не быть. Буль буль?
0
Так он про это и написал, нет?
0
В реале просто вешаемся на шею более опытному пловцуинженеру. :). Но согласись, что каждый день плавать через Ла-Манш только потому что паром- это слишком большой и неспортивный обьект это глупо.
+1
Другое дело, что толковый программист может сам писать библиотеки, когда готовые слишком кривы или их вообще нету.
Правильно… проще быть всю жизнь бестолковым и ЛИБАнутым… Ещё и хвастаться «Я продвинутый — я не знаю регистров, я не читаю даташиты!»… ))))))))
Умение работать напрямую с регистрами — это как плавание: необходимо уметь плавать, но в обычной ситуации просто взять лодку.
Работая с регистроми можно просто «выдернуть пробку и слить воду» и пройтись, не напрягаясь, «аки посуху»… ))))
0
При чем тут Либанутые или Нелибанутые? надо уметь пользоваться и тем и другим. А использование библиотек не отменяет использования головы…
0
А притом, что не нужно всё доводить до крайностей… грань, какая-то, должна быть… Если это GUI или FAT… да, не спорю… но чтобы ногой дёрнуть… чересчур… ИМХО…
А по поводу либанутых… так почитайте посты в этой ветке… Некоторым либы уже в собственных штанах мерещатся… )))))
0
А использование библиотек не отменяет использования головы…
Нет… наличие головы — полность отрицает надобность использования таких библиотек…
0
Может либы у них и кривые, но я как-то с этим пока не столкнулся. А может чего-то не понимаю…
Вобщем ладно, пошел в магазин покупать новую голову. Может тогда пойму… :)
0
Про дернуть ногой никто и не говорит. Это как раз редкость. Основная суть STM-овских либ как раз в упрощенной наглядной настройке. Функции дерганья ногами уже так, до кучи. Опять же улучшается переносимость кода.
Я видимо не внимательно читал тему, но как-то не заметил никого настаивающего на постоянном использовании библиотек для любых задач…
0
Колега, не нужно перекармливать троля. Я думаю, товарищ HHIMERA уже сыт. А то он скоро выведет сайт сообщества а топы Гугла по запросу "))))))))))))"
+3
Да вроде он неплохой спец по STM32. Если это тот же человек, что и на форуме. Только сегодня какой-то буйный…
0
Может быть. Просто его комментарии очень похожи на тролинг граничащий с приходом на личности (это я его о «дискуссии» с Vga)
0
комментарий был удален
Мда, я все понял.
+100500, однако.
Но вопрос — дойдет ли до них…
0
комментарий был удален
комментарий был удален
А где аргументы? Например кусок кода для USB Mass storage device без библиотек? Может стандартные библиотеки С тоже зло? Даешь самодельный printf!!! Долой либанутных сишников! Хайль magic numbers!!!111
0
А где аргументы?
А всё написаное вами… «это есть аргументы»???
Например кусок кода для USB Mass storage device без библиотек?
А чё… На микрочипе один юзер реально на глазах у публики раскроил микрочиповскую ЮСБ-либу и показал сколько в ней срани и тормозов… Вы, в случае чего, сможете разобрать её по косточкам и остаться «в здравом уме и удовлетворительном состоянии здоровья»???
Или FAT от Чена… Насколько вы её хорошо знаете??? Сможете перекроить её под свои нужды???
Знаю случаи перекраивания Микрочиповской GUI под AVR… Вам это под силу???
Если вы три раза ответили «НЕТ», значит, вы ни либ, ни регистров с «магическими числами» не знаете… И в чём тогда ценность ваших познаний и слов???
Может стандартные библиотеки С тоже зло?
Если без фанатизма… то на личное усмотрение и наилучший результат… в итоге…
Даешь самодельный printf!!!
А здесь шутка не удалась… «незачот»… Но это уже отдельная тема…
Долой либанутных сишников! Хайль magic numbers!!!111
Не уподобляйтесь мне… всё равно я в этом «Best of the best»… )))))))))))))))))
А так… «магией» не пользуюсь… и тоже считаю это «другой крайностью»… или глупостью…
P.S: Свеженькое… по поводу библиотек… ))))))
we.easyelectronics.ru/LPC/lpcxpresso-urok-5-gpio-input-podklyuchaem-knopku.html#comment31625

Не могли бы вы разместить эту библиотеку на ресурсе? В новых Examples ее нет ни для LPC1343, ни для LPC1769 каторым я пользуюсь. Я сейчас прошел первые 4 урока и очень хотел бы посмотреть на сколько удобней использовать библиотеку.
Прям Н.Г.Чернышевский «Что делать?»… )))))))))
0
Если вы три раза ответили «НЕТ»
А если «да, не пользовался, да, да»?
0
Значит… либо «считаю только с калькулятором»… либо просто «тянет поговорить»…
0
Нет, просто я не считаю, что без веских причин следует отказываться от средств, упрощающих программирование.
0
Блеф!!!
В итоге… либо приходится переписывать «хвалённые» либы… либо писать своё…
0
Крайне редко. Если библиотека вконец кривая либо задача слишком специфична. Ну или если уперся в ресурсы и пошел байтики экономить.
0
А вы считаете библы для STM8 и STM32 «ровными»??? Ню-ню…
+1
Я считаю их излишне близкими к железу, даже при переносе на другое семейство STM32 код работы с ними придется в корне переписывать. Но для инициализации периферии их применение, тем не менее, вполне оправданно.
0
Чудесно… «библиотеки гавно, но есть всё равно что-то надо»… )))))))
0
Лучшее — не значит что что-то хорошо. Это значит, что альтернативы еще хуже.
0
А что может быть хуже гавнячей библиотеки???
Для быстрого «мырг-мырг светодиод» голится… не более…
0
Гм. Простыня из невнятных аббревиатур и магических чисел?)
Впрочем, GPIO один из тех примеров, где эту библиотеку разумно юзать только для инита и мырг-мырг. Я и сам работу с BSRR предпочел. А вот инит оставил на либе.
0
Я и сам работу с BSRR предпочел.
Вот-вот… «И остались от либы… рожки да ножки...»… )))))))))
0
Про «мырг-мырг» никто и не говорил. Везде говорилось только про удобство инициализации…
0
Согласен полность с предыдущим топиком. Знание чужих помогает только в одном случае — если ты понимаешь как они работают. И конечно (как следствие) можешь написать (изменить) для того что нужно. Когда кто-то говорит это плохо — это не может означать плохо навсегда — просто тот кто сказал ещё не конца понял — плохо это или хорошо.
0
  • avatar
  • x893
  • 01 ноября 2011, 01:29
Во всем этом сраче меня больше всего умиляем утверждение, что регистры нужно изучать т.к. «Изучать архитектуру на библиотеках бессмысленно». Возьмем самый простой пример, настройка порта на высокоуровневый выход с подтяжкой и сбросим его затем в 0.
Через регистры:

// Настройка порта
GPIOB->DDR |= 0x10;
GPIOB->ODR |= 0x10;
GPIOB->CR1 |= 0x10;
GPIOB->CR2 |= 0x10;
// Сброс в 0
GPIOB->ODR &= ~0x10;

Тоже самое через библиотеку:

GPIO_Init(GPIOB,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_WriteLow(GPIOB,GPIO_PIN_4);

В обоих случаях мы получили один результат. В обоих случаях известно в каких режимах порт может работать в принципе. Только в первом случае пришлось колупаться в даташите в поисках какие биты куда нужно пихать. Да еще и проверять, а можно ли их в такой конфигурации вообще использовать. При этом запись в регистры не добавила новых, закрытых злобными разработчиками режимов. Во втором случае у нас есть готовый набор всех возможных режимов работы порта.
И чем в первом случае достигается глубина изучения архитектуры? Знанием названий регистров? Или знание что за настройку и значение порта отвечают 4 регистра это и есть глубокое знание архитектуры? И какая на хрен разница сколько бит и куда нужно запихнуть, как и на что это влияет? Что даст это «тайное» знание? Что от этого программа сразу станет в десятки раз быстрей и короче или напрямую подключенный светодиод от этого не сгорит?
0
  • avatar
  • PRC
  • 01 ноября 2011, 21:59
Только в первом случае пришлось колупаться в даташите в поисках какие биты куда нужно пихать. Да еще и проверять, а можно ли их в такой конфигурации вообще использовать.
Только в первом случае не пришлось колупаться в описании библиотек…
При этом запись в регистры не добавила новых, закрытых злобными разработчиками режимов.
Еррату за документ вапще не считаем… всё и так должно работать… )))))
И какая на хрен разница сколько бит и куда нужно запихнуть, как и на что это влияет? Что даст это «тайное» знание? Что от этого программа сразу станет в десятки раз быстрей и короче или напрямую подключенный светодиод от этого не сгорит?
В некоторых случаях намного быстрее и короче… но судя по по вашим вопросам… объяснять что-то бесполезно…
0
1. В библиотеке колупаться проще:)
2. В библиотеках ошибки тоже правятся. Правда пока медленней, это есть.
3. И сильно и часто это нужно? И примерчик именно намного быстрее и короче можно?
0
1. В библиотеке колупаться проще:)
Тогда проще написать свою… под себя… и не колупаться…
2. В библиотеках ошибки тоже правятся. Правда пока медленней, это есть.
И зачем мне сидеть и ждать… пока исправят???
3. И сильно и часто это нужно? И примерчик именно намного быстрее и короче можно?
Самый простой пример… «модный» такой… работа с TFT по SPI… Можно и копию файла библиотеки изуродовать… но всё равно… это уже не кошерно…
0
Тогда проще написать свою… под себя… и не колупаться…
Вы тут как-то настроили всех против себя… Но здесь я из вашего окопа стрельну.
Когда-то давно, когда я не знал ни C ни тем более C++, а знал только asm, долгими ночами я сидел и изучал эти битики и байтики в дш. Потом пришел опыт, владение инструментами, но привычка читать дш осталась, как и привычка писать свои библиотеки. Вобщем-то писать нового практически не приходиться, так, подправить что-нибудь… В итоге порт пректа на stm32 занял всего 2 дня. А потом, встроенные системы, мы же с железом работаем всетаки, надо знать и асм, и битики и байтики… Знание — сила!
0
Кстати, еще один пример — подключение энкодера. Без знания внутреннего устройства человек никогда не догадается, что этот режим можно приспособить для кучи других вещей. Ибо библиотека заточена только под это применение. Т.е., бонусные возможности можно реализовать и с библиотекой, но для этого все равно понадобится знание внутреннего устройства таймера. А его не получить, не потрогав регистры.
0
Кстати, еще один пример — подключение энкодера.
Да примерами можно сыпать и сыпать… просто когда не пользуешься либами, то и вопрос не возникает «А насколько это всё будет плохо при применении библиотек?»…
0
Ну, во-первых, писать стоит так (не эквивалентно предыдущему примеру, но идея, думаю, ясна):


  //Turn on GPIOB clock
  RCC->AHBENR=RCC_AHBENR_GPIOBEN;
  //GPIOB6 is push-pull output
  GPIOB->MODER=GPIO_MODER_MODER6_0;
  //50MHz speed for pin 6
  GPIOB->OSPEEDR=GPIO_OSPEEDER_OSPEEDR6_0 | GPIO_OSPEEDER_OSPEEDR6_1;
  //Init GPIO
  GPIOB->ODR=0;


Только в первом случае пришлось колупаться в даташите в поисках какие биты куда нужно пихать.

Что само по себе ценно, ибо человек получает навык работы с документацией.

Да еще и проверять, а можно ли их в такой конфигурации вообще использовать.

Тоже ценно, приучает думать, прежде чем делать.

И чем в первом случае достигается глубина изучения архитектуры?

Знанием того, что такое регистры и что они в принципе есть. Знание того, как происходит инициализация на низком уровне. В случае библиотеки не видно вообще никакой связи с железом — вызвали какую-то волшебную функцию, которая сделала хорошо. А как она это сделала — неведомо. При этом человек может так и не понять, что порт — это регистр. А если мы говорим про, например, таймер (который счетчик), то отсутсвие подобного понимания не даст человеку понять, как, например, в нем генерируется ШИМ. И т.д, и т.п.…
0
А если мы говорим про, например, таймер (который счетчик), то отсутсвие подобного понимания не даст человеку понять, как, например, в нем генерируется ШИМ. И т.д, и т.п.…
100%!!! Тогда и никакие библиотеки не помогут…
0
писать стоит так (не эквивалентно предыдущему примеру, но идея, думаю, ясна):
Я, все же, не одобряю код, где каждую строку необходимо комментировать.
А если мы говорим про, например, таймер (который счетчик), то отсутсвие подобного понимания не даст человеку понять, как, например, в нем генерируется ШИМ. И т.д, и т.п.…
Это не смертельно же. Хотя, разумеется, специалист, понимающий, как оно работает — намного ценнее. Но это уже выбор каждого, изучать ли вглубь.
0
Я, все же, не одобряю код, где каждую строку необходимо комментировать.
А отсутствие комментов «Это наш стиль!»??? )))))))))))))
0
Я не говорю что отсутствие комментариев — хорошо (хотя сам комментирую только код, который будут читать другими — Delphi позволяет). Но и программа, написанная так, что ее можно понять только по комментариям — это плохо.
0
Ващще то… комменты для этого и предназначены… И если с пониманием совсем туго, то зачем тогда вообще кодить??? Зачем над собой издеваться???
0
Комментарии появились в те времена, когда без комментариев программу даже написать нельзя было. Нынче же ими разукрашивают как правило только примеры, заголовки и места с неочевидными решениями. И хорошо написанная программа понятна даже без комментариев. Подобную же инициализацию не комментировать просто нельзя.
0
Сказки… для непосвящённых!!!
GPIOB-> — непонятна… а GPIO_Init — понятна… )))))))))))
Прекращайте свои жалкие потуги… или подготовьте домашнее задание… а то уже неинтересно становится...)))))))
0
GPIOB-> — непонятна… а GPIO_Init — понятна…
Именно. Вариант с библиотекой имеет более развернутые названия и более человеческую семантику.
Так, в коде:
//GPIOB6 is push-pull output
GPIOB->MODER=GPIO_MODER_MODER6_0;
//50MHz speed for pin 6
GPIOB->OSPEEDR=GPIO_OSPEEDER_OSPEEDR6_0 | GPIO_OSPEEDER_OSPEEDR6_1;
//Init GPIO
GPIOB->ODR=0;
первые две строки понятны лишь благодаря комментарию (причем без даташита поправить инит на скажем 10МГц невозможно), третья неясна даже с ним. Впрочем, тут ситуацию усугубляет более чем странное именование констант — оно не несет смысла.
В библиотечном варианте это выглядит как
GPIO_Init(GPIOB,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);
и даже без подсказки с наименованиями параметров функции довольно понятно — для порта GPIOB, пина 4 выставляем режим пуш-пулл выхода с максимальной скоростью переключения. И это ясно без комментариев.
Прекращайте свои жалкие потуги… или подготовьте домашнее задание… а то уже неинтересно становится...)))))))
Ты тролль, пишущий одни лишь скобочки, малоосмысленные выпады без аргументации и совершщенно не обращающий внимания на аргументы. Так что иди-ка сам делать домашнее задание.
0
комментарий был удален
но продолжаешь усираться до пены со рта «в их величии»…
Нет, я возражаю утверждению что они говно и зло. И если они меня не устроят — то, учитывая чем именно они мне не нравятся — я скорее всего напишу еще один библиотечный слой поверх них.
Запомнить это также невозможно… значит надо подглядывать… особенно если что-то нужно изменить…
Они называны логично. Кроме того, я просто использую на GPIO_MODE_OUT_PP_HIGH_FAST функцию «Go to definition» и найду по соседству нужный мне вариант.
0
GPIOB то понятно, а вот GPIO_CRL_MODE0_1 уже ниразу не очевидно.
Если с GPIO_Init сплошной self-documented code(в libstm32 даже избыточно:)), то вот установка битов без документации совершенна не ясна, даже при наличии дефайнов(которые еще и с постфиксами _0, _1 большую путаницу вносят).
Естественно, можно открыть документацию, прочитать раздел про установку значений GPIO, потом пролистать на описание регистра CRL, благодаря дефайнам даже битики высчитывать не прийдется, на крайний случай в stm32f10x.h посмотреть что этот дефайн значит.
От всех этих действий не спасет даже комментарий типа «configure pin 7 as input with pullup». Для изменения все равно прийдется лезть в документацию. Ну или заняться бессмысленным занятием и все это заучить.
С библиотекой же, gpioInitStruct.GPIO_Pin = GPIO_Pin_7, нужно восьмой пин сконфигурировать — один символ поменять. Притом никакие комментарии не нужны, и так все ясно.
Точнее комментарии нужны, но уже не описание что эта строчка делает(и так понятно), а зачем мы это делаем например «configure button1».
+1
Ой, пока писал комментарий, Vga примерно тоже и ответил:)
0
stm32f10x.h всегда под рукой… он в каждом проекте… И не важно STM32F1XX, STM32F2XX, STM32F4XX или LPC11XX… Ощущаете разницу???
И не нужно держать в мозгах вздроч библиотек под каждый камень…
Надеюсь понятно выразился…
0
Уточню… Хедер камня, любого, всегда под рукой…
0
Угу, нужно держать в голове вздроч самого камня. Куда менее очевидный, потому что проектировался он под нужды упрощения и удешевления камня, а не удобство программиста. В отличие от библиотек, которые и призваны загладить углы камня, благо программно это сделать куда дешевле.
0
Угу, нужно держать в голове вздроч самого камня.
Ещё раз… зачем??? «Хедер всегда с тобой!»…
А знать принцип работы SPI хоть в STM32, хоть в LPC… один хрен даташит читать придётся… точнее… ДВА…
0
Ты не поверишь, хедер на библиотеку тоже всегда со мной!
И там куда более осмысленное содержимое, чем GPIO_CRL_MODE0_1.
0
Не поверю… Либ завтра может не быть, ссылку я давал, их могут изменить, они могут не устроить… да они могут просто работать через пень колоду… как с I2C…
Пардон… но мозговой секс мне не нужен…
0
Если у меня не будет библиотеки — отсутствие ее хедера будет наименьшей из проблем.
Камня тоже завтра может и не быть. Особенно любит таким образом развлекаться Atmel. Внезапно в корне изменять камень они тоже любят.
И даже работать камень может через пень-колоду, причем без надежды на исправление. Просто с пометкой в эррате «это и это не делайте».
0
Если у меня не будет библиотеки — отсутствие ее хедера будет наименьшей из проблем.
А для меня пофигу наличие либ… хедер есть… ну и хватит…
0
А зачем тебе хедер? Все что в нем описано — есть в даташите. Просто делаешь вместо GPIOB->CRL = GPIO_CRL_MODExxx нечто вида
MOV R0, 0x00100011
STR R0, 0x80004567
Ну или то же самое на С.
0
Мда… как всё запущено… «и эти люди мне рассказывают как жить!»… )))))))))))))))
Пора бы знать, что названия битов в даташите частенько не совпадают с названием в хедере… )))))))))
И это не только у STM…
0
Ну и что от этого меняется?
0
таки мне неясно что важнее быть мега крутым и держать в голове все камни заучивая стопицот регистров или делать то что нужно и оставшееся время проводить по усмотрению?
Шашечки или ехать?

зы Может и микросхемы сами дома варить чтоб ваще мега труъ!
0
Вы посты хоть читаете… или так...«что мне нравится»???
Не нужно держать всё в голове… «Хедер — всему голова!»… ))
0
Хедер тот не содержит инфы для программиста. Только определения, описанные в даташите. Он даже библиотекой не является — всего лишь описание камня для компилятора. Не для программиста.
0
Хедер тот не содержит инфы для программиста. Только определения, описанные в даташите. Он даже библиотекой не является — всего лишь описание камня для компилятора. Не для программиста.
Пора ваши изречения на Башорг выкладывать… ))))))))))))))))))))
0
Ну и за чем дело встало? Хоть раз на баш попаду.
Хотя, что-то я в этом сомневаюсь.
0
Когда изучаешь камень, то полезно полазаить по хедерам самого камня и даташита. По крайней мере все биты своими глазами увидишь и поглядишь что они значат. А то когда они за либами прячутся, то всех фич железа и не ощутишь. Может оно и есть, но поди найди.
0
Ну хедер в этом плане неинформативен, особенно такой, как в CMSIS — тонны макросов без комментариев. Вот даташит (или, точнее, User Manual) — это да, полезно почитать.
0
И что тут непонятного???

/******************  Bit definition for RCC_APB2ENR register  *****************/
#define  RCC_APB2ENR_AFIOEN                  ((uint32_t)0x00000001)         /*!< Alternate Function I/O clock enable */
#define  RCC_APB2ENR_IOPAEN                  ((uint32_t)0x00000004)         /*!< I/O port A clock enable */
#define  RCC_APB2ENR_IOPBEN                  ((uint32_t)0x00000008)         /*!< I/O port B clock enable */
#define  RCC_APB2ENR_IOPCEN                  ((uint32_t)0x00000010)         /*!< I/O port C clock enable */
#define  RCC_APB2ENR_IOPDEN                  ((uint32_t)0x00000020)         /*!< I/O port D clock enable */
#define  RCC_APB2ENR_ADC1EN                  ((uint32_t)0x00000200)         /*!< ADC 1 interface clock enable */

#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD_VL)
#define  RCC_APB2ENR_ADC2EN                  ((uint32_t)0x00000400)         /*!< ADC 2 interface clock enable */
#endif

#define  RCC_APB2ENR_TIM1EN                  ((uint32_t)0x00000800)         /*!< TIM1 Timer clock enable */
#define  RCC_APB2ENR_SPI1EN                  ((uint32_t)0x00001000)         /*!< SPI 1 clock enable */
#define  RCC_APB2ENR_USART1EN                ((uint32_t)0x00004000)         /*!< USART1 clock enable */

Усё с комментами… как положено…
0
Я не говорил «непонятно», я говорил «неинформативно».
0
Неинформативно… пусть так… ))))
А какой информации следовало бы ещё ожидать??? ))))
0
От хедера камня? Никакой. Для этого DS/UM/PM есть.
0
Тогда в чём «неинформативность» хедера??? )))))
0
В том, что он неинформативен. Но он и не для того предназначен, так что это нормально.
0
Т.е. вы хотите сказать, что в восьми тысячах строк дефайнов регистров, без комментариев, как эти регистры использовать, разобраться легче, чем в библиотеке?

Кстати, забавная вещь с stm32f10x.h. Дефайны для битов в регистрах USB есть, а самих регистров нет.
+1
Разобравшись один раз… вам будет не важно с каким камнем вы имеете дело… и есть ли какие библиотеки под него или нет…
0
Как работать то — это понятно. Например знать что такое 4 режима SPI и т.п.
Дальше, при использовании библиотек, мне нужно прочитать только раздел Features про используемую переферию, посмотреть пример работы с библиотекой и все.
Не нужно заморачиваться с регистрами, плюс ко всему и код еще читаемый без заглядывания в документацию.

Конкретный пример.
Вот сейчас разбираюсь с USB на STM32F102C4.
Сначала нужно сбросить в регистре CNTR бит PWDN, затем задержка на инициализацию переферии(задержка указана в другом документе), дальше сбрасываю бит FRES, инициализирую кучу флагов на обработку прерываний, ловлю прерывание RESET.
Начинаю настраивать эндпоинты.
Не забываю поставить флаг EF в регистре DADDR.
Настраиваю в BTABLE адрес буфуера и в нем регистры описания буфера. При том что адресация для ядра по 32 бита, а для USB переферии 16 бит, значит получается 2 байта данных, два байта игнорируем и адреса при чтении нужно помножать на два.
Плюс еще куча настроек и т.п. И это только настройка phy уровня, для того, чтобы можно было отправить байтик — еще кучу действий нужно сделать.

Это порождает кучу совершенно не читаемого кода, разве что комментировать ссылками на страницу документации.

И альтернативный вариант. Определяю дескрипторы и коллбэки для usb пактов(в примере выше до этого даже не дошло).
B вызываю USB_Init();

В первом случае трачу часы только на инициализацию. Притом я уверен, что на LPC13xx все будет абсолютно иначе. Еслли я запомню, зачем нужен бит EF в регистре DADDR — мне это совершенно не поможет:)
0
«Как страшно жить!»...))))))))
Притом я уверен, что на LPC13xx все будет абсолютно иначе. Еслли я запомню, зачем нужен бит EF в регистре DADDR — мне это совершенно не поможет:)
А если не будете знать и зависните, то вас уже ничего не спасёт… Или всё таки… начнёте разбираться в ненавистных строчках и битах… и просматривать листинг АСМа???
0
Или всё таки… начнёте разбираться в ненавистных строчках и битах… и просматривать листинг АСМа???
Ага. И дебаггером по ним шагать. Ну и что? Доскональное знание WinAPI не повод отказываться от VCL. Доскональное знание камня не повод отказываться от библиотек. Доскональное знание машинных кодов процессора — не повод отказыватся от ассемблера и С.
0
Естестевенно, при ознакомлении с новым МК сначала разберусь, на пять раз прочитав документацию.
Но, использовать буду в любом случае библиотеку.
Т.к. она освобождает от запоминания всех этих нюансов. И время на высчитывание битиков с пользой тратится на основную логику прошивки.

При ошибках ассемблерный листинг не очень показателен. Куда удобнее и нагляднее посмотреть дамп регистров в gdb. Да и там же прыгать по строкам исходника.

Я совсем не говорил, что знать регистры это очень плохо и абсолютно не нужно. Вовсе нет.
Основная мысль, которую я пытаюсь донести, что в проекте предпочтительнее использовать библиотеки, чем регистры.
Т.к., повторяясь в пятый раз — это удобство разработки, читаемость кода, и как следствие — меньшая вероятность ошибок и поддерживаемость кода.
+1
Свои — может быть… чужие — мина замедленного действия…
-1
Так и микроконтроллеры чужие. И компиляторы. И в них тоже лежат мины замедленного действия.
Может и МК свои паять?
0
Так может тогда купить готовый девайс у китайских братьев… и вообще ничего не делать???
0
И вот это, кстати, нередко и делают.
0
Ваша перепалка уже порядком затянулась!) Гопода VGA и HHIMERA, может вы запостите по одному топику и покажете всем как с Вашей точки зрения правильно писать программы? Вот тогда сообщество сможет по достоинтву оценить ваш спор при помощи голосования! Тока я боюсь что в таком случае тов. ХХИМЕРА проиграет=) Удачи!
+1
Если внимательно присмотреться — то спора то и нет. Позиция обоих оппонентов ОДИНАКОВАЯ по сути, но у одного более категоричная (HHIMERA) у другого более практичная (Vga).
0
А может ненужно? Не уверен, что Сообщество выдержит еще ДВЕ статьи на данную тематику. :)
0
Достаточно реализации одной и тойже задачи СВОМИ СПОСОБАМИ, а сообщество оцений что получилось=)
0
Хотя, разумеется, специалист, понимающий, как оно работает — намного ценнее.

Во-во. Как только человек понял, как оно устроено — пусть использует библиотеки, если надо. Но потрогать регистры хотя бы раз в жизни надо. А где-то это и вовсе удобнее. Не надо крайностей, оптимальный путь везде разный.
+2
Разумеется надо. Единственное, что я считаю, что совершенно необязательно с трогания регистров и ассемблера начинать. Это, скажем так, более углубленное изучение устройства контроллеров в общем, а не основы. Основы — что периферия вообще делает (импульсы считает, ножками дергает, байтики по SPI шлет(и что такое SPI вообще)) и как с ней работать в общем. В принципе, на втором-третьем контроллере специалиста регистры как таковые уже не сильно интересуют — он смотрит чего там вообще можно настроить и что железка умеет.
+1
Хм, а кто мешает вместо 0х10 использовать дефановые значения из CMSIS??? Я биты несчитаю, но либфункции не использую, только родные дефайны.
0
А ведь что интересно, все те кто утверждают что библиотеки зло и гонять биты руками единственный верный метод настоящего труЪ программиста не приводят никаких доводов в защиту, кроме как эпических утверждений, типа «Знанием того, что такое регистры и что они в принципе есть» в лучшем случае и «Хедер всегда с тобой!» в крайнем. Даже самого простого примера — «такой… работа с TFT по SPI… » не привели. Такой гуру и не смог на практике показать какое это зло библиотека и как в коде великого и ужасного все легко, просто и в десятки раз быстрей получается.
0
  • avatar
  • PRC
  • 02 ноября 2011, 19:39
Такой гуру и не смог на практике показать какое это зло библиотека и как в коде великого и ужасного все легко, просто и в десятки раз быстрей получается.
Пеши ысчо!!! ))))))))))))))))
Все эти сранные библы погрызли и порвали на куски ещё год назад… как положено… с кодом, подсчётом байт и холиваром… STM8 vs AVR… ))))))
Такшта… я уже забыл то, что ты узнал только вчера… )))))))))
Прчём… я сразу послал эти либы нах… Один из участников пытался написать свои либы, но ввиду отсутствия заинтерсованности и поддержки других лиц (все ждали халявы), и он эту затею бросил… Может что-то и написал для себя… не интересовался…
Дальше… Читаем…
we.easyelectronics.ru/STM8/ispolzovanie-standartnyh-periferiynyh-bibliotek-v-iar.html
Так же при переносе на другой кристалл изменения будут минимальнейшие.
Враньё!!! На какой кристалл… на LPC???
Основных недостатков три. Увеличение размера и уменьшение скорости работы программы понятно будут. Но очень не значительные.
Угу… совсем… ))))) В генерируемый АСМ хоть одним глазом пытался смотреть??? )))))
Гораздо неприятней не полная совместимость библиотек между разными типами контроллеров. Причем зачем так сделано мне совсем не понятно, к примеру настройка порта С на выход для stm8L и stm8S
Только остаётся согласиться…
Так что??? Не помним что писали вчера??? )))))))))))
0
1. Гуру мог бы и понять что речь про совместимость в пределах семейства. Хотя конечно у великого HHIMERA код с авр наверное напрямую переносится даже на интел.
2. Смотрел. Что дальше?
3. Неприятно, но легко обходится.
Я про недостатки написал, а вот примера гениального кода с битами так и не увидел. Пока вижу только «гениальность» в каментах.
+1
комментарий был удален
А в чём ты видишь свою гениальность???
… я пологаю PRC имел ввиду вашу гениальность а не свою
Тогда скажу тебе по секрету… STM8 под ИАР тормоз афуенный
… а в чем заключается тормоз или это секрет?
Лучше дела с Космиком… но срань ещё та…
… так на чем же писать? или человек знающий столько архитектур и компиляторов предпочитает блокнот? поделитесь знаниями плз
… а если серьезно хорош сратся, отвечая на коммент не обращенный к вам, следует как минимум проявлять уважение, как никак лезите в чужой разговор
0
а если серьезно хорош сратся, отвечая на коммент не обращенный к вам, следует как минимум проявлять уважение, как никак лезите в чужой разговор
Вот ипримените ваши слова к самому себе… Тем более если по теме вам и сказать нечего…
0
… да тут все сказано и пересказано, осталось только успокоится и подвести какой-нить итог, хотя и это зделано — тогда каждый для себя, ведь у всех свой опыт, своя правда.
0
Совершенно верно…
Тем более, что итог мне известен заранее…
Просто стало интересно, когда люди не имеющие элементарных знаний, втюхивают другим своё мнение как «путь истинный»…
0
А твои? Пока я вижу только смотрите какой я крутой, но из примеров только оверквотинг system_stm32l1xx.c и жалобы на авр студию. Настоящий гуру. Нет ГУРУ!:)
0
На 4-ую… или 5-ую??? Напомни… )))))
Такс!!! Не искривляй пространство… давай по делу…
По продуванию STM8 есть что сказать??? Или это «свежая новость» и к перевариванию МОСКом неготова???
0
Очередное мнение «гуру»? Где ссылки, источники. Или я сказал — и точка?
0
У меня всё есть… на потом оставил… ))))
И всё таки… Есть что сказать по поводу STM8???
0
Мне пока и отвечать то не на что. Так, пионерские высказывания очередного местного гуру. Так что давай, громи стм8 авэрами. Я завтра обязательно почитаю, а то сейчас спать уже хочется:)
0
комментарий был удален
комментарий был удален
Йа боялсо!!! )))))))
И что… сразу лучше станети легче??? Или просто никто не будет мешать пузыри в болоте пускать??? ))))))))))
-2
комментарий был удален
комментарий был удален
Не надо его банить. Тролли тут тоже нужны. Без него скучно будет.
Кстати, время уже 14, а информации о разгроме стм8 авеэрами до сих пор нет.
0
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
Ad personam? In MY THREAD??? :D
0
I'm sorry!!! (((((
0
С одной стороны, попоболь автора по поводу того, что любой быдлан
может не гоняя битики по регистрам моргать светодиодом, весьма
понятна. Но вывод несуразен. Зачем умным людям ориентироваться на
глупцов, не копающих вглубь и теряющих корни? Знание всего, что
творится под капотом, не должно быть самоцелью, и куда большим злом
будет многократное написание одного и того же кода низкого уровня
(трудно поддерживаемого и лишающего программиста единой точки опоры)
вместо решения собственно задачи.

Автору следует начать писать код не для одного себя, и многое
прояснится. Ещё один аргумент в пользу обучения в рамках работы для
свободного сообщества.
+1
Весь срач не читал, но последнего камента вполне достаточно. Только надо перефразировать с «код не только для себя», а профессиональное программирование за деньги.
Кустарь-одиночка всегда будет обмазываться мнемокодами, битами и тиками, вместо того чтобы делать изделия.
Очень хорошо моск прочищает, когда программирования это то чем зарабатываешь на жизнь. Тогда сразу приходит понимание, что в очередной раз писать все на асме это долго дорого и не эффективно.
Да, иногда бывает нужно что-то сделать на очень низком уровне, но это сотая доля процента от всех задач.
И ради этих долей процента усложнять жизнь отказом от «богомерзких» библиотек? Глупо!!!
А спор этот бесперспективный, фанатика не проймешь, а время потеряешь.
Лучше пойти изучить или написать еще одну полезную библу.
0
А спор этот бесперспективный, фанатика не проймешь, а время потеряешь.
Согласен… спорить с либанутыми… дело неблагодарное… но весёлое… ))))))
0
Это точно.
0
Весь срач не читал
… «но осуждаю»… ))))))
0
Только надо перефразировать с «код не только для себя», а профессиональное программирование за деньги.

А я ведь про это писал:

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

И в в таком случае в этом нет ничего предосудительного. Обычно «за деньги» программируют люди, которые уже давно понимают, как устроен МК, и могут эффективно кодить любым методом. Просто в данном случае с библиотеками у них получится быстрее. Но в случае чего они и свою легко наваяют.
0
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
Если хотите побороться за спасение души начинающих кортексоводов
И в мыслях не было… нашли «ловца душ»… Каждый всё это проходит своим путём… по своему…
Вспомнился один любитель ПикБэйсика на одном из форумов… Ещё летом кричал, что ПикБэйсик «форэва»… Сейчас из Кейла и STM32 не вылазит… Тоже спорили с ним по поводу СИ «на грани»… бесполезно… пока сам, своим умом, до этого не дошёл…
0
Исходный пост я читал (надо же тему срача понять).
Два раза написал портянку, опять все стер.
И кажется я нашел правильную форму. Начнем с такой профессии как слесарь.
Имеются 6 разрядов, с 1 по 6. 1 самые простой слесарь, 6 самый «сложный».
Первый разбирает металлолом, шестой собирает космические спутники.
А теперь вопрос:
Как должны распределяться все слесаря по этим категориям в процентах?
Интересуют мнения наших непримиримых борцунов с библиотеками.
0
Интересуют мнения наших непримиримых борцунов с библиотеками.
А где вы их видите… борцунов этих… )))))
Вы извращённо понимаете суть происходящего… Никто никому не навязывает чтение даташитов и изучение исходников от АРМа и производителя…
Просто топикстартера достали постоянные выпады со стороны любителей полиблякодить… вот он и создал тему, чтобы не срали в других…
А мне просто стал интересен профессиональный уровень и уровень знаний особо крикливых вещунов секты «Библятствоабратство»… результат уже известен…
Тупо библокодить — это сродни ардуинству… хотя… я и не против ардуинства… «каждому своё»… «кто на что учился»…
Вам интересно знать почему я ввязался??? А мне надоело навязчивые говно-комменты с проповедями читать…
Вот так… да…
0
Вопрос был один, а ответили на другой. Отличная дискуссия :)))))))
Тупо библокодить это решение большинства задач (50-95%, смотря как считать). И что все эти задачи должны решать только «слесаря 6 разряда»?

Насчет моего понимания и ТС:
Здесь обычно в качестве частого возражения говорится, что, дескать, там же килобайты памяти, что нам структура из пары десятков байт? Однако, как известно, памяти много не бывает, и в серьезном проекте разнообразные инициализации в итоге могут отъедать существенную ее часть. Кроме того, библиотечный код более громоздок, что делает его трудным для восприятия. И все вместе это противоречит самой здравой концепции — «ничего лишнего».

Таким образом, круг применимости библиотек очень ограничен, и в большинстве случев гораздо лучше обходиться без их использования. Исключения есть, но их мало (и они перечислены выше).

Написаны глупости.
>> недостаток памяти — чушь. Если памяти не хватило значит хреново спроектировано, плохо поставлено ТЗ. Профи так не делают. Сначала проект, прогнозы на расширение, а потом уже конкретная железка.
>> библиотечный код более громоздок, что делает его трудным для восприятия — чушь. Библиотека служит обратной задаче, упрощению. Если библиотека усложняет, значит это не библиотека, а говноподелка, либо автор не понял как работать с библой (такое тоже часто бывает).
>> здравой концепции — «ничего лишнего». — опять же если библиотека что-то за собой тащит, то это проблема проектировщика библы (нахрена такие зависимости) и пользователя (на хрена ради вывода в порт байта тащить весь printf).
>> круг применимости библиотек очень ограничен — чушь! Все проекты так или иначе написаны при помощи каких либо библиотек или тулкитов. На голом асм, пишут только в очень специфичных случаях (коих доли проценты).
+1
andi123… посидите тихо…
Я же прежде чем ввязаться просмотрел и ваши статьи с исходниками… ))))
Наличие забитых комментом кусков говорит об измене… Вы не знаете чётко каким путём идти и «Что делать?»…
Поэтому… со словом «чушь»… поаккуратнее…
-2
Я что-то не припомню своих статей с исходниками (я бы даже сказал вообще не припомню, чтобы где-то свой код выкладывал, можно сцилки).
Вообще, микроконтроллеры мое, так сказать, хобби (деньги мне платят за программы для больших компов).
А насчет аккуратности, готов отстаивать свои убеждения. И даже готов соглашаться со своей неправотой в случае если меня в этом убедят (такое бывает хотя и крайне редко).
0
А всё правильно… )))))
Я вас просто развёл на «рассказать о себе»…
Вы мыслите с позиции «большого серого брата» компа… А с МК всё немножечко не так…
И я уверен, что вы сами это знаете… или вам говорили об этом…
0
Я мыслю с точки зрения здравого смысла, который один и тот же в любой отрасли :)))
А насчет развел: спросили бы прямо я бы и сам рассказал.
Так что в большей степени сами раскрылись.
0
А я и не скрывался… вот он я… весь… )))))))))
Я мыслю с точки зрения здравого смысла
Не совсем…
Писать прогу на компе… и писать прогу для PIC12, ATTiny или даже LPC1111 — две большие разницы…
0
>> Писать прогу на компе… и писать прогу для PIC12, ATTiny или даже LPC1111 — две большие разницы…
В узком смысле соглашусь. Размеры кода, назначение, система команд, окружение. Но это все малозначительные частности с точки зрения всей проблематики программирования.
А в широком смысле все одинаково — просто пишем программу, которая делает то что надо. И там и там можно написать и говнокод и шедевр.
Я опять же повторюсь, мы не рассматриваем экстремальные граничные условия (которые бывают в любой отрасли), они малочисленны и интересны только с точки зрения любопытства для пытливых умов (без какой либо пользы в реальной жизни) и реализация для уникальных проектов.
В подавляющем большинстве остальных случаев, только былокод и быдлобиблиотеки, чтобы было примитивно, дешево и понятно, ну и работало конечно.
0
В подавляющем большинстве остальных случаев, только былокод и быдлобиблиотеки, чтобы было примитивно, дешево и понятно, ну и работало конечно.
Грустно это… мля… но тенденция такая просматривается… по нарастающей… к сожалению…
Да и большая часть сообщества здесь этим грешит… безбожно… ))))))
Ну тада… «звыняйтэ»… что я в ваш монастырь со своим миномётом пришёл… )))))))))
0
Чеснослова детский сад, вы что свято верили что все программисты кушают радугу и какают бабочками?
Любая технология со временем выходит из лабораторий и становится уделом простых работяг. Или вы думали что микроконтроллеры всегда будут прогать только те кто изучил ассм?
Кремний самое дешевое в любом изделии. Гораздо дешевле корпуса и выводов. И уж на порядки дешевле даже ламера-программиста.
Экономика должна быть экономной.
На сим заканчиваю флуд и непотребство.
Про экономику пусть хозяин этого сайта расскажет (так сказать на личном опыте).
0
А чё тут думать… и так всё ясно… )))))))))))
Тем более, что постом выше, я сказал, что знаю результат всего этого действа наперёд… )))))))))))
Просто получил подтверждение своих мыслей… ))))))))
0
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
комментарий был удален
кисо, ну не плачь, бывает. подумаешь, мозгов нет, зато язычок длинный
-1
Автор не с того конца зашел, как мне кажется. Круги применимости, конечно, имеют значение, но гораздо более существенный момент вовсе не круги, а уровни абстракции. Только разделение на уровни абстракции позволяет создавать сложные системы не утопая в деталях. Правильно написаная библиотеке для железа является одним из таких уровней абстракции. Замечу, что знание того, что делается внутри тут, вобщем, ортогонально, библиотеки, по большому счету, никак не мешают и не помогают знать потроха. Это что касается философии. А применительно к конкретной архитектуре, вполне согласен, стм-овская библиотека оставляет желать (сильно) лучшего, причем, в первую очередь, именно потому, что плохо решает основную задачу для которой она создавалась — абстрагироваться от железа. Но это проблема конкретной библиотеки, а не подхода в целом.
+2
  • avatar
  • evsi
  • 13 декабря 2011, 10:17
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.