Крик: "Души!", или личное мнение о USB в stm32f2

Под катом нецензурная лексика!


Вы хоть обминусуйтесь, но держать в себе нету больше сил.
На то, чтобы написать библиотеку для разворачивания usb в контроллерах от STM, которые содержат USB OTG наняли явоголовых мудаков. Там почти нету прямых вызовов функций, всё обмазано 2-3 уровневым слоем калбэков и рантайм такой, что на реализацию USB VCP уходит ресурсов больше, чем в програмном USB в Atmegах раз в 5!!! И это при софтварном USB в камне.
Я заебался выискивать в библиотеке структуры, содержащие ссылки на функции, которыми я никогда не воспользуюсь, и выпиливать их из кода.
  • +1
  • 27 ноября 2012, 22:52
  • dekar

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

RSS свернуть / развернуть
Но с е… чими темпами инфляции я зае… лся тексты переделывать, так что пусть в этой песне всё остаётся как было)))) C Сектор газа
+4
Что по-уебански, так это точно=) Но никто не мешает накостЫлить свой стек, если не жалко времени:)
0
Этим и занимаюсь.
0
Ява-то чем провинилась?
+1
  • avatar
  • evsi
  • 27 ноября 2012, 23:05
Потому, что там реализована ООП концепция с интерфейсами/реализациями. На С.
0
Ну и что? На С интерфейсов в лоб не сделаешь, да и колбеки тут совсем сбоку. К яве это, по большому счету, отношения не имеет.
0
А если заглянуть в код этого поделия?
0
И что изменится? Там ява вдруг появится?
Еще раз классический явовский подход на С в лоб не реализуется, поскольку для интерфейсов нужна поддержка в языке. Во-вторых, колбеки это _не_ явовский подход. Скорее уевый и, опять-таки, к собственно к яве отношения не имеющий и существовавший задолго до ее появления. Более того, обработка событий колбеками, в некотором смысле, классический прием в ембеде.
0
пардон за оффтоп, но, тем не менее

а вы не могли бы разжевать, что такое коллбеки и как их использовать в эмбедде? в какой-нибудь статье, возможно…
0
Колбэк — функция обратного вызова. Даешь библиотеке указатель на функцию, она что-то там делает и когда ей надо что-то от твоей программы — вызывает эту функцию по переданному указателю. Типичный пример — это оконная функция в WinAPI. В эмбеде самый известный пример — прерывания.
+1
Спасибо, только всё равно я что-то не вкуриваю.
В педивикии мне вот вообще непонятно.
А зачем я даю указатель на функцию какой-то библиотеке? Можно какой-то живой пример привести? Ну не понимаю я:)
0
Ну вот смотри, возьмем для примера V-USB. Она работает сама по себе, на прерываниях, от пользователя нужно только вызывать usbPoll раз в 50мс. Если V-USB приняла пакет от компа — она вызывает написанную тобой функцию usbWrite, которая этот принятый пакет обрабатывает, а если комп хочет что-то получить — вызывает написанную тобой же usbRead, которая подготавливает нужный компу пакет и возвращает его библиотеке. Эти две функции — коллбэки.
Или вот пример из винапи. Есть функция установки мультимедийного таймера. Ты вызываешь функцию setTimer (как-то так), передавая ей указатель на какую-то свою функцию и период срабатывания таймера, и винда будет с указанным периодом вызывать эту функцию.
В общем, коллбэки — это разновидность обработчиков событий. Ты передаешь библиотеке функцию (точнее, как правило, указатель на нее) и библиотека при наступлении в ней какого-то события эту функцию вызывает для обработки события.
В этом плане на коллбэки похожи прерывания. Ты кладешь в указанное место (interrupt vector table) указатель на функцию, обрабатывающую то или иное прерывание и при его наступлении процессор эту функцию автоматически вызывает.
+2
Понял, большое спасибо. Уложилось наконец в голове.
0
Абстрактный пример:
// Вызывается с частотой 50 Гц
void Task1(void)
{
	// Some code
}

// Вызывается с частотой 200 Гц
void Task2(void)
{
	// Some code
}

// Пришёл байт по UART
void uart_RxHandler(char C)
{
	// Some code
}

...

timer_AddFunction(50, &Task1);  // 50 Гц
timer_AddFunction(200, &Task2); // 200 Гц

uart_AddRxHandler(&uart_RxHandler);

while(1)
{
	// ...

	common_task();
}


Что хорошего: код становится не привязанным к платформе. Если хорошо организовать, то и упростится и логика.
Например, тут всё равно, кто и как получил байт с уарта, как и где написано прерывание и что это за микроконтроллер. Опять же, все расчёты периодов таймера, флаги и счётчики скрыты в модуле таймера и всем всё равно, как они считаются и каким именно таймером. Хочешь TIMER0 в AVR, хочешь TIM6 в STM32.

Конечно, этот уровень абстракции требует своей цены и надо понимать, где он может быть уместен.
+2
we.easyelectronics.ru/os-rtos/scmrtos-mehanizm-callback-ov.html

Очень удобно использовать в ОС.
0
Колбеками можно реализовать что-то напоминающее явовские интерфейсы.

И, да, на всякий случай. Я тут гоню не на яву, а на мудаков, которые реализуют разделение интерфейс/реализация с перекрывающим интерфейсом на С. Потому, что этот язык не про то.
0
Колбеками можно реализовать что-то напоминающее явовские интерфейсы.
Нет, нельзя. Это две совершенно не пересекащиеся вещи. Я думаю ты путаешь колбеки и жабовские анонимные классы. Только анонимные классы это, строго говоря, вариация на тему замыканий (closure). Только это не ОО концепция, а вообще чистая функциональщина. Да, на С ее можно реализовать, но весьма ограниченно. Опять-таки, жаба тут совершенно ни при чем.

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

Ну посуди сам: есть библиотека, которая реализует алгоритм. Она ворочает некими блоками кода, выполняя их в определённом порядке в зависимости от внутреннего флагового автомата. Однако же сами эти блоки кода предлагают реализовать пользователю, библиотека лишь заведует порядком их выполнения. Причём эти блоки кода ты должен написать когда создаёшь экземпляр объекта структуры. Мне это напомнило толи Java, толи шарпы.
0
Я тоже не понял, причем здесь Java. Наверное, традиция такая, ругать языки высокого уровня. В том, что конкретная библиотека/архитектура на С реализована криво – обязательно виноваты С++/Java-программисты.
0
А вы в код этих библиотек смотрели?

С++ знает, что такое виртуальные ф-ции. И его компилятор может приводить их вызовы к прямым в случае разрешаемости в компилтайме, или вообще вырезать, если они не используются. И програмисты С++/Java знают об этом. И пихают в класс-интерфейс все возможные функции — пусть в реализации либо напишут, либо нет. А про то, что в С такой оптимизации быть не может, они забывают, и, по привычке, описывают функции на каждый чих. И делают целые структуры, содержащие по 5-10 указателей на эти функции. Хотя в С такое делать нельзя, а нужно пользоваться условной компилляцией.
Вот в этом они и виноваты.

И, да. Java програмисты детектед. 2шт. :)
0
Нет, я не смотрел реализацию библиотеки USB в stm32f2. Но я поверю Вам на слово, что она реализована криво. Но причем здесь ООП и Java? Если конкретные программисты перенесли код спроектированный под ООП на С, то это их ошибка. Это никак не глобальная проблема С++/Java.
0
Поясните, плиз, что не так в моем комментарии.

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

Если конкретный программист написал глючную программу – то проблема в программисте, а не в ЯП, который он использовал.
0
Упс, цитирование в моем комментарии лишнее, машинально выделил первую строчку :)
0
Я тоже не понимаю, причём тут ява. Я говорил, что люди попытались применить подход, который свойственен коду на Яве, в коде на С. А Вы интерпретировали это как наезды на Яву. Повнимательнее!
0
Слова «явоголовые мудаки» как-то сложно интерпретировать иначе.
0
То есть, если бы я сказал «яйцеголовые мудаки» вы бы кинулись защищать яйца?
0
Я думаю, Вы сами понимаете разницу – к фразе «яйцеголовые мудаки» никто бы не цеплялся. И никто не защищал бы яйца (ну разве что на каком-то кулинарном форуме :).

А фраза «явоголовые мудаки», как мне показалось, отражает Ваше отношение к Java-программистам.
0
Я разве кого-то защищал? Я всего лишь пытаюсь выяснить откуда такой идиотский термин вообще появился.
0
да, и каким боком он к проблеме сишной либы.
0
С++ знает, что такое виртуальные ф-ции. И его компилятор может приводить их вызовы к прямым в случае разрешаемости в компилтайме, или вообще вырезать, если они не используются.
Подозреваю это не имеет никакого отношения к делу. Поскольку либа универсальная, то в ней, скорее всего, предусмотрена обработка всех событий возможных при обмене через USB. Замечу, что программисты на жабе ничего такого не знают, поскольку компилятор ничего подобного не делает. А если вдруг начнет, то его авторам немедленно оторвут выступающие части тела, что бы не размножались, а затем авторов и компилятор выбросят на помойку.

Хотя в С такое делать нельзя, а нужно пользоваться условной компилляцией.
Вот в этом они и виноваты.

В безграмотности программистов жаба не виновата.

И, да. Java програмисты детектед. 2шт. :)
Бесмысленные наезды умноженные на незнание детектед. Пока 1шт :)
0
Бесмысленные наезды умноженные на незнание детектед. Пока 1шт :)
Уже 2.
0
Бесмысленные наезды умноженные на незнание детектед. Пока 1шт :)
Какой наезд бессмысленен? С цитатами?
Ну от чего в интернете люди ведут себя менее внимательно?
0
Там выше я написал. С цитатами.
0
Только там наездов небыло
0
Реализация универсальной библиотеки для USB – достаточно сложная задача (сам протокол достаточно непростой). За универсальность нужно платить (использовать полиморфизм, или, банально callback функции в С). Если Вас не устраивает данная реализация – поищите другую, или напишите свою. Но причем здесь Java?
0
Я Яву и не трогал, это всё ваше больное воображение. А трогал я как раз програмистов.
0
тащемта да. если че не так, виноват язык/компилятор. а в либах косяков найти не проблема, всем не угодишь, и либу лучше под себя самому писать, имхо
0
Вы еще не видели их Motor Control library.
Сделали псевдо-ООП на С-структурах, для простейших настроек нужно как-то хитро «наследовать» их закрытые «классы», и вообще куча ненужных действий.
ИМХО проще написать свою библиотеку.
+2
Новомодные «камни» для явоголовых мудаков и созданы. Меня тоже поначалу заинтересовали STM32, но по мере прочтения «The Insiders Guide to the STM32 ARM based microcontrollers» настроение всё больше портилось. Кроме удобства написания быдлокода, похоже, авторы «камушков» ни о чём не думали.
+1
Новомодные «камни» для явоголовых мудаков и созданы.
Эк вы лихо всех пользователей армов в явоголовые мудаки-то записали. Кстати, у вас смартфон/планшет есть?
0
Смартфоны и планшеты — поделки тех же явоголовых мудаков. В них всё настолько криво, глючно и непрозрачно, что подобные девайсы годятся лишь для понтов и тыканья иконок.
+1
Смартфоны и планшеты — поделки тех же явоголовых мудаков. В них всё настолько криво, глючно и непрозрачно, что подобные девайсы годятся лишь для понтов и тыканья иконок.
Да-да, это я уже понял. Но речь-то не об этом. Пользователей-то вы за что вы в явоголовые мудаки записали?
0
Тащемта процессоры делают не для пользователей, а для разработчиков. Пользователя интересуют только характеристики девайса в целом.

Правда противно наблюдать, как пользователи покупают очередной бесполезный кусок пластмассы, который через несколько месяцев становится немодным или сам разваливается.
Современная вещь старится и умирает физически еще быстрее, чем морально, хотя гад производитель и убеждает нас в обратном. Делает он это именно для того, чтобы мы не догадались о никчемности его товара. «Чувак, – говорит он, – будь крутым, выбрось эту мобилку, такую носят сейчас только лохи, а ты же не лох, ты думаешь про свой имидж, а еще лучше намажь его кетчупом и ебани об стенку – трах-бах, это прикольно, гы-гы-гы, вот смеху было, так поприкалывались». И ты, дебил, слушаешь его, мажешь кетчупом и лупишь свою цацку об стенку, смеешься, как счастливый даун, и идешь покупать себе другое пластмассовое говно – так тебе, мудаку, и надо. Потому что если ты этого не сделаешь, завтра цацка все равно сломается сама, а так мы бережем тебя от разочарований, а себя – от судов и рекламаций. А еще мы бережем свою драгоценную ауру от пробивной силы матюков, а еще нам удалось втюхнуть тебе, придурку, очередной приборчик, который тоже скоро сломается, но пока люби его быстротечной любовью, покупай ему футлярчик из крокодила, показывай своим прыщавым друзьям, трать свои денежки на дурацкие мелодии и играй в «змею» или какие-нибудь паззлы, пока не охренеешь. Приблизительно так думает эта товаропроизводительная сволочь, забрасывая нас всяким дерьмом, которое с каждым годом становится все хуже и хуже. И только игрушки мальчиков не подвержены этой чуме. Оружие производится с любовью и как бы без ограничения срока годности. Даже армейские ботинки, купленные мной в американском «военторге», как легендарный пиджак Ипполита Матвеича, не имеют сносу. Зато купленные месяц назад водопроводные краны в моей мастерской уже пускают неконтролируемые струи мне в нос, и я не знаю, кто в этом виноват – милейший Цезарь Карлыч, который мне их прикрутил, сука-продавец, который мне их продал, или противные девчонки, которые все это замутили.
Ещё противнее наблюдать, как таким же образом мыслят «разработчики».
+3
а ты же не лох, ты думаешь про свой имидж, а еще лучше намажь его кетчупом и ебани об стенку – трах-бах, это прикольно, гы-гы-гы, вот смеху было, так поприкалывались
habrahabr.ru/post/113210/
0
Тащемта процессоры делают не для пользователей, а для разработчиков.
Самовлюбленность разработчиков не знает границ?
Если бы процессоры делались для разработчиков, каждый процессор стоил бы как мерседес. Господам разработчикам иногда полезно напоминать себе, что они существуют не в собственном изолированном мирке и что они всего лишь один из (пусть и важных) элементов системы удовлетворения потребностей конечного потребителя. Потому что именно конечный потребитель за все это добро платит и именно благодаря ему тиражи чипов меряются сотнями миллионов штук, что, в свою очередь, делает их дешевыми в пересчете на штуку.

(не имеющая отношения к делу цитата поскипана)

Ещё противнее наблюдать, как таким же образом мыслят «разработчики».

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

P.S. наезд на «разработчиков» мимо кассы, в ембеде я хоббист.
+1
позволю указать на маленькую логическую неточность: процессоры делают для паяльщиков. Паяльщики делают платы — они для программистов. Программисты делают программу — получаем девайс, который для маркетологов. После рекламной акции, процесса ценообразования и прочего получаем товар, который для магазинов. И только магазин делает что-то для пользователей.
Мне кажется, что я правельно понял логику?
Если нет, то тогда получается, что и кремний добывают для пользователей, и новый паяльник делают для пользователей, и компелляторы тоже для них шлифуют.
0
Позвольте с Вами не согласится.

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

Электронщики и программисты, в данном случае только «страдают» — одним приходится разводить плату под крошечный корпус с кучей ног, вторым – изучать новое ядро.

ИМХО, если бы чипы выпускали для электронщиков (или «паяльщиков») – они были бы в огромных корпусах :) А если бы для программистов – процессоров без аппаратной поддержки деления не существовало бы как класса :)
0
позволю указать на маленькую логическую неточность: процессоры делают для паяльщиков. Паяльщики делают платы — они для программистов. Программисты делают программу — получаем девайс, который для маркетологов.
Все с точностью до наоборот: маркетологи говорят «девайс будет продаваться, если он будет таким», а остальная цепочка в силу знаний, навыков и технических возможностей пытается получить нужный девайс. Иногда случаются «встречные» движения, типа того, что разработчики придумали нечто, что потенциально можно продать. И такие идеи даже воплощаются в жизнь и даже приносят неплохой (часто даже отличный) результат. Но уже ко второй версии продукта цепочка выглядит так, как я описал.
При всей моей нелюбви к маркетолухам, я прекрасно понимаю, что только от того, насколько хорошо продается конечный товар конечным потребителям, зависит благополучие всех, задействованных в создании этого продукта, а, следовательно, именно специалисты по определению спроса задают тон во всей этой цепочке. Так что хоть мне это и не нравится, но я не собираюсь убеждать себя, как это делают некоторые разработчики, что процы создаются для разработчиков.
Если нет, то тогда получается, что и кремний добывают для пользователей, и новый паяльник делают для пользователей, и компелляторы тоже для них шлифуют.
Именно так и обстоят дела. Единственный нюанс — конечный пользователь паяльника это инженер или монтажник или любитель, а не блондинка с айфоном. Аналогично с компиляторами. Но это никак не меняет сути дела.

P.S. супер-пупер разработчикам периодически стоит напоминать об их месте в этой цепочке. не самое плохое место, кстати. скажем, сисадминам куда как обиднее, в типичной конторе они, в лучшем случае, что-то вроде высококвалифицированной уборщицы, то есть просто обслуживающий персонал, статья сплошных расходов в бухгалтерской отчетности.
+1
Ерунда какая-то. Разработчик берёт технические требования и проектирует в соответствии с ними девайс. Какие детальки выбрать решает он. Проц — такая же деталька, как резистор. Разрабатывают же детальки под требования разработчика, а не пользователя. Пользователю нужен девайс а не кучка деталек.
0
Вот только требования разработчика растут из требований пользователя. И если производитель процессоров знает, что у потребителей популярны айфоны — он сделает упор на производство процессоров для айфонов, которые потом и выберут разработчики айфонов.
0
Ерунда какая-то.
Да, когда вы пишете, что детальки разрабатываются под требования разработчика, это именно, что ерунда. «Требования разработчика» есть не более чем трансляция требований пользователя в технические требования. От того, что требования в процесс обрастают кучей технических подробностей, источник требований не меняется.
0
Ну и что. Важно лишь то, что проц в конечном итоге выбирает разработчик. По каким соображениям — в данном случае не важно.
0
Ну и что. Важно лишь то, что проц в конечном итоге выбирает разработчик. По каким соображениям — в данном случае не важно.
Даже если абстрагироваться от соображений разработчика, то выбирать он может только из того, что существует. А то, что существует появилось как следствие удовлетворения (или прогноза) требований потребителей.
0
Дело в том, что процесс R&D у производителей микросхем очень затратный и долгий.

«Разработчику» (абстрактному электронщику или программисту) проще, его технологический процесс достаточно гибок. О действительно « берёт технические требования и проектирует в соответствии с ними девайс.» Ели что-то пошло не так – часть программы можно переписать, схему переделать. Изменилась тенденция на рынке (например, вышла новая версия ОС с «принципиально новым» интерфейсом) – ок, не вопрос, садим дизайнера, пару программистов и в следующем релизе получаем программу с «принципиально новым» интерфейсом :) Мы можем достаточно оперативно реагировать на потребности рынка.

А вот с производством процессоров такого не получится. Там «релиз цикл» очень длинный. Производители тратят огромные суммы и годы времени на разработку нового ядра. И быстро, на ходу подстроится под рынок они не могут. Поэтому им приходится предугадывать тенденции на рынке на несколько лет вперед. Кто угадал – получит проффит, что не угадал понесет убытки.

Проц — такая же деталька, как резистор

Для Вас (и для меня) – возможно, это и так, но для производителей это не так.
0
но по мере прочтения «The Insiders Guide to the STM32 ARM based microcontrollers» настроение всё больше портилось

А чем Вам так не понравилась архитектура чипа? Привязки к языкам высокого уровня он не имеет, нравиться – пишите на ASM’е… Чем виновата архитектура ARM ядра? Дело в периферии?

Или дело принципа «только i4040, только хардкор»?
0
Или дело принципа «только i4040, только хардкор»?
Причем каждый его должен выпилить из песка дома вручную, иначе не кошерно.
+2
В прошлом декабре у меня были те же эмоции.
Только текста раз в 20 больше.
0
Только текста раз в 20 больше.
А этот текст где-то можно почитать?
0
К счастью, этот текст был изложен мною оральным способом (преимущественно от слова «орать»), правда, неоднократно и с использованием матерных слов и оборотов.))
0
Орально от меня страдает наша лаборатория уже 10 дней. Особенно хаскеллист-С++шник, который в моих глазах является воплощением современного подхода к проектированию программных комплексов и принципу «пусть работает медленнее, зато отлаживать проще»
0
Попробуйте реализацию USB от CooCox. Вместе с их COXом. Я когда-то использовал, работала отлично. А так да, ST сильно дискредитирует идею библиотек периферии своим говнокодом. Индусы же, кришну им в раму.
0
У них есть отдел в Индии?
0
Подозреваю что и без отдела им хватает тайно внедренных чалмастых вредителей :).
0
за stm32 не скажу — всё ещё не пробовал, но весь отдел stm8 явно находится в индийских джунглях, причём прямо посередине плантации лютой индийской конопли, на которой постоянно происходят пожары.
по крайней мере, их либа и документация пишутся именно там.
+3
Для общего развития, можно объяснить на примере что не так?
0
  • avatar
  • John
  • 28 ноября 2012, 00:57
Присоединяюсь. Если бы гуру программирования на С потрудились над хорошим разбором типичных конструкций — было бы здорово. Ну или хотя бы пример библиотечки «как писать надо».
0
Посмотреть как НЕ надо писать можно во всеми нелюбимой, но всеми юзаемой StdPeriphLib. Посмотреть как МОЖНО писать код под АРМы — libmapple. Очень достойная вещь, как по мне.
+1
Обосрать то, что кем-то сделано — это мы всегда можем. Сами при этом мы ничего не предлагаем. Вам ST дала бесплатно кучу софта, не претендуя на нобелевскую премию. Чем лить говно, напишите альтернативную библиотеку и поделитесь с сообществом — это будет достойный уважения поступок. Приятно почитать, когда человек постит свою разработку, пусть даже не совсем удачную, по крайней мере он старался улучшить этот мир. А обсерать — это нехорошо. Стыдно товарищи!
+2
«сперва добейся», лол. ну совсем же толсто, ну!
0
Я работаю над тем, чтобы написать что-то более менее удобное. Просто иногда надо выкинуть эмоции.
0
Обосрать то, что кем-то сделано — это мы всегда можем.
Полностью поддерживаю этот тезис. Обидно становится, когда читаешь посты «пальцовых авторов и критиков». Не думаю, что такое отношение к творчеству других можно оправдать. Мне кажется, что администрации сайта следует обратить на это внимание. Так недалеко можно оказаться в ситуации других русскоязычных сайтов и форумов по похожей тематике. Будет просто падать активность ресурса. Посещая различные англоязычные форумы такого обычно не наблюдается. Давайте просто помогать друг другу, а не обижать.
Уверен, это всем пойдет на пользу…
0
давайте жить дружно, или вы решительно напишете в спортлото?
а я уверен, что вы никогда не видели кода библиотек ST Microelectronics. и ещё мне кажется, что вы вообще топик не читали:
1. причём здесь творчество вообще?
2. кто "друг друга" обижает? или на изе, оказывается, прописаны программисты STM?

серьёзно, я не понимаю, зачем этот коммент. даже coredumped, написавший «а чего добился ты?», вложил больше смысла. да, дарёному коню в зубы не смотрят. но данном случае у коня не только зубов этих в принципе нет, но и ног нет, и голова почему-то с задницей перепутана. вот так разве хорошо делать? это разве не вопиющая жестокость по отношению к коням? вот об этом автор и пишет, а вы конесадизм почему-то «творчеством» называете!
0
Уважаемый, а с чего вы вдруг решили, что я поддерживаю пост автора топика?
Я об этом ни слова не написал. У меня скорее негативное отношение к содержимому и форме данного блога. Мне вообще не нравится когда кто-либо безапеляционно заявляет о чем либо. Каждый из нас имеет свое собственное мнение и может его высказывать. Мой жизненный опыт убедил меня, что сложно читаемые выражения, сдобренные изрядной долей ненормативной лексики, вряд ли несут большой объем полезной информации, и направлены в первую очередь на стремление поддержать свой собственный имидж «крутого парня (программера/эмбеддера)».
Я просто высказываю свое мнение и не претендую на роль автора, излагающего «истину в последней инстанции».
0
У STM все библиотеки такие, вспомнить тот же календарь, их библиотеки пишут жопоголовые недопрограммисты.
0
Чёт не пойму, что в этих либах такого-этакого явоголового. Вполене труЪшная СИшная либа. Структурки, указатели на функции в них, и.т.д. Весь всеми любимый Linux построен по подобному принципу. Чтоб два байта из одного модуля ядра переслать в другой, нужно не одну такую структурку снициализировать, и не один метод одну функцию по указателю у нее позвать. И никто не кричит, что разработчики ядра Линукса «явоголовые мудаки». Их обычно другими словами кличут.
0
Да, этот же подход и в ядре. И там открыто говорят, что это мол разделение интерфейса и конкретной реализации. Но на МК с 20Кбайтами памяти это уже не в какие рамки не лезет.
0
А мне всегда нравилось «ручное ОП на C» как в ядре. ИМХО поддержка ОП не для языков работающих с памятью по голым указателям.
0
там еще могут быть приколы с разными адресными пространствами и разными схемами защиты в разных процах. отсюда попытка абстрагироваться.
0
Вот в том то и проблема, что либы пишутся с расчетом «под любой компилятор» и «на все случаи жизни». К тому-ж еще и под С++ чтоб собралось. Если надо оптимизировать — берите либы и кромсайте под себя, никто-ж не запрещает :)
0
Завелось в итоге?
0
Знаете, примерно такие же впечатления у меня были от библиотек stm, когда я впервые открыл их ) но вот по мере изучения…
Не хочу голословно обвинять тех, кто называет программистов библиотек STM тупыми индусами, но библиотеки отличные ) они очень хорошо структурированы и прекрасно задокументированы, надо только чуток почитать. Они написаны для универсальности разработки и удобства людей. В них достаточно легко разобраться (в отличие от пресловутого индусского кода). ST предлагает широкую линейку микроконтроллеров как раз для того, что бы можно было подобрать наиболее подходящий под конкретную задачу, а потом слегка модифицировать код. При этом С для STM строго ANSI C, никакой отсебятины. Отладочные средства дешевы и доступны каждому. Не понимаю, чем Вы недовольны… Естественно, всем не угодишь и если Вам больше подходит АВР — используйте АВР ) в конце концов, в этом и состоит задача разработчика — подобрать наиболее рациональное решение.
0
Ну, наиболее чувствительный их недостаток — несмотря на преизрядное сходство периферии разных семейств, API библиотек для них совершенно разные.
0
Вроде как дефайнами они это решают, но, конечно, да, все не задефайнишь. Я когда купил STM32F3Discovery, некоторое время не понимал в чем дело, а потом нашел файлик «Migrating from STM32F1 to STM32F3», а там…
0
Примерно. А еще есть STM8, которая имеет сходную периферию и совершенно другой API. Более того, SPL для серий 8L и 8S также несовместима по API.
0
Не знаю кто дизайнил эти либы, но его к программированию подпускать нельзя на пушечный выстрел. Это даже не библиотека, по большому счету, поскольку этот кусок кода не решает ту задачу, для которой либы были вообще говоря придуманы — создание уровней абстракции. Какая уж тут абстракция, если все потроха конкретного контроллера торчат кишками наружу, а по многословности и нечитаемости код использующий эти «либы» легко даст фору визуальному васику. Судя по стилистике, именно на нем автор(ы) либы и учились так «программировать».
0
Я так понимаю, что абстракция как цель в SPL и не ставилась. Там просто есть интерфейс ко всем функциям МК. А раз функции разные в разных контроллерах, то и интерфейс тоже.

*Хотя я их не использую*
0
Я так понимаю, что абстракция как цель в SPL и не ставилась. Там просто есть интерфейс ко всем функциям МК. А раз функции разные в разных контроллерах, то и интерфейс тоже.
Ситуация такая: или вводится абстрагирующий слой (для этого, в частности, могут применяться структуры подобные тем, которые используются в SPL при вызове функций), но тогда должен быть определенный уровень независимости от железа (для изоляции от которого и нужен этот код) или не забиваем юзеру мозги мусором и показываем как колупаться в регистрах руками напрямую, а он уже сам пусть рисует уровень абстракции, такой, который ему удобен. Судя по моим наблюдениям значительная часть пользователей SPL использует ее как учебник по прямому колупанию в потрохах. А это значит, что смысла в SPL как в библиотеке никакого нет — лишний уровень вызовов и лишний код, который не привносит никакой функциональности и/или абстракции (а последнее невозможно без добавления функциональности).
0
Я вот тоже самопал пользую, правда, более halный. И последовательности операций подсматривал в SPL, это тоже верно =)

Может, оно кому и нужно. Но было бы хуже, если б библиотеки не было — даже подсматривать было бы нельзя.
0
По большому счету она, вобщем-то, и не нужна. Скажем libmaple и вот эта штука прекрасно без нее обходятся. Собственно, это два возможных варианта того, как могла бы выглядеть правильная SPL.
0
При этом С для STM строго ANSI C, никакой отсебятины.
Что имелось в виду под ANSI C — ANSI C89/ISO C90?

Как я понимаю, стандартным для ПО MCU является превосходный и допиленный почти до идеала ISO C99, а не ветхозаветный ANSI C(ANSI C89/ISO C90).
0
Пздц!!! Это вышиб мозга.Эти производители своих мк, специально раскидывают необходимые файлы в разных каталогах, с большим числом вложений. Простой пример ногодрыганья занимает дохренище места в мк и на жёстком диске. Отключив любую библиотеку, компиляция не проходит. Что за фигня. Приходится для каждого примера, копировать всю папку с библиотекой.
Кто пишет эти библиотеки… Причём для одного и тогоже чипа, разные примеры выглядят совсем по разному…
это был крик души чела который переписывает примеры под пмк19пб2 :D

Ктонибудь полностью разобрался в библиотеках от стм? Просто интересно.
+1
:) то же самое — в STM32 motor control firmware library.
Структуру выдумали м«даки, проще свою либу за несколько дней написать.
0
Вот я тоже думаю, написать либу свою, со своими дефайнами, и все файлы в одной папке чтоб были.
Сейчас вот пытаюсь сделать программные задержки delay_CLK(время), delay_NS(время), delay_US(время), delay_MS(время).
задержки через таймер delay_timUS(время), delay_timMS(время).
добавить управление отдельным пином PORTB(1)=1 итд.
Хард либы под пинборду2, например управление семисегментом, используя команды DIGsegment1(5);…
Или например ноты для bizzer_DO(время), bizzer_RE(время), bizzer_MI(время).

С описанием команд на РУССКОМ ЯЗЫКЕ…

В данный момент мигание лампочками у меня делается так например:
PORTB = BIN(11110000000);
delay_CLK  (10000000);
PORTB = BIN(00001100100);
delay_CLK  (10000000);

Это ведь понятнее чем написать так:

for (t=0; t<0xFFFFF; t++)
MDR_PORTA->RXTX =0x780;
for (t=0; t<0xFFFFF; t++)
MDR_PORTA->RXTX =0x064;

Но ведь всем не устроишь, обзовут говнокодером…

Не знаю честно наши писали либу или нет.
Но блеан, Отечественный продукт(Миландр), а либы пишут на английском, нафига МНЕ НАПРЯГАТЬ МОСККК…
#define LEDs_PORT MDR_PORTD /*!< LEDs port for MDR32F9Q1 evaluation board */
#define LEDs_PINs (PORT_Pin_10 | PORT_Pin_11 | \
PORT_Pin_12 | PORT_Pin_13 | \
PORT_Pin_14) /*!< LEDs pins for MDR32F9Q1 evaluation board */
#define NUM_LEDs 5 /*!< Number of LEDs on MDR32F9Q1 evaluation board */
#define LEDs_OFS 10 /*!< Offset first LED pin in the port (for MDR32F9Q1 evaluation board) */

Хотя может быть либа скомунизжена у стмщиков… И вместо MDR32F9 там например стоял STM32Discovery итд. тогда всё понятно. Либу своими силами писать надо.Пойду пожалусь на их форум в 4-5 часа утра…

Я думаю многие пишут дефайны под себя, но может есть какойто народный стандарт? чтобы не делать велик…
0
Вот delay us/ms/s через цикл:

	void delay_loops(U32 loops) {
		asm volatile (
			"1: SUBS %[loops], %[loops], #1 \n"
			"   BNE 1b \n"
			: [loops] "+r"(loops)
		);
	}
	#ifndef DELAY_LOOP_CYCLES
		#define DELAY_LOOP_CYCLES 3.0
	#endif
	#define DELAY_US_LOOPS(US) ((U32)((double)US * F_CPU / DELAY_LOOP_CYCLES / 1000000.0))
	#define DELAY_MS_LOOPS(MS) ((U32)((double)MS * F_CPU / DELAY_LOOP_CYCLES / 1000.0))
	#define DELAY_S_LOOPS(S)   ((U32)((double)S  * F_CPU / DELAY_LOOP_CYCLES))
	#define delay_us( US ) delay_loops( DELAY_US_LOOPS(US) )
	#define delay_ms( MS ) delay_loops( DELAY_MS_LOOPS(MS) )
	#define delay_s( S )   delay_loops( DELAY_S_LOOPS(S) )
0
Да, примерно так. Только вот в асме не силён. Пока пишу на сях такие функции.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.