SPRINTF / От любви до ненависти. Или пару слов о стандартных библиотеках.

  Рет қаралды 7,131

Vladimir Medintsev

Vladimir Medintsev

4 жыл бұрын

Короткий ролик о проблемах стандартных библиотек языка Си. К сожалению именно привычка использования функций стандартных библиотек без проверки на скорость выполнения и ресурсы часто приводит начинающих программистов в небольшое замешательство. Просто ролик для размышлений.
Канал в телеграмм - t.me/vladimir_medintsev
Канал Яндекс.Дзен - zen.yandex.ru/vladimir_medintsev
Канал на RuTube - rutube.ru/channel/1797552/
Канал на KZfaq - / vladimirmedintsev
------------------------------------------
Если вы хотите поддержать автора канала номер карты Сбер:
2202-2023-2480-4008
------------------------------------------
github.com/mpredfearn/simple-...
github.com/cjlano/tinyprintf
github.com/mludvig/mini-printf

Пікірлер: 60
@avi-crakhome2524
@avi-crakhome2524 4 жыл бұрын
Каждый должен написать свою ос и очередную версию printf. У меня получилось printo на дженериках. Не нужно указывать тип и стиль печати. Если в коде переменная с типом int32_t сменится на float (или что иное) - то функцию печати править не нужно. Это удобно при отладке кода, когда алгоритм только формируется. Скорость не измерял, важен был размер. github.com/AVI-crak/Rtos_cortex/blob/master/sPrint.c
@tx-rx
@tx-rx 4 жыл бұрын
Пример прошивка занимает 1-4кб. но в ней нужно преобразовывать немного строк. sprintf вроде бы идеальный вариант , ну или по крайней мере самый простой. НО весит он 9,5кб и включает в себя 99.5% того что мне не нужно. Вот я из принципа не хочу(и не буду) тратить 9.5кб на пару преобразований, даже когда вопросы расходования памяти вообще не волнуют. Просто из принципа не хочу. (хотя думаю, кто пишет на HAL и с FreeRTOS скорее всего не поймут мой выбор. Но сколько людей, столько и мнений)
@NIKOLAY_PSHONIA
@NIKOLAY_PSHONIA 4 жыл бұрын
Спасибо. взял на вооружение. semple-printf (взял только кусок) из кода понравилась реализация.
@sovchem1275
@sovchem1275 4 жыл бұрын
По опыту говорю - sprintf заметно жрет стек в RTOSах. Если используете ее c OS, имейте в виду - если вдруг начал зависать, глючить весь код/1 поток- увеличивайте стек. Для эксперимента можно заремить sprintf
@ajdarseidzade688
@ajdarseidzade688 4 жыл бұрын
Vladimir Medintsev, Владимир, спасибо Вам что снимаете такие видео. Это я к комментарию тут типа "А зачем это нужно и что сразу непонятно было и т.п.?" Все тут понятно, но что теперь не снимать человеку такие видео? Про разные катастрофы, невероятные факты, вирусы, галкины и о прочем мусоре писать? И да - полезного тут узнал (про ссылку тоже спасибо). Благодарность еще раз.
@eng283
@eng283 4 жыл бұрын
Я так вывожу hex значения, int аналогично: uint8_t H = 0x4F; char Str[] = "00"; Str[0] = "0123456789ABCDEF"[H/16]; Str[1] = "0123456789ABCDEF"[H%16]; LCD_Write_String(Str);
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
И главное ну вообще без малейших тормозов.
@user-pc9wg4jt8l
@user-pc9wg4jt8l 4 жыл бұрын
Это ерунда. Вот если вы придумаете обратное преобразование, такое же простое, вместо sscanf...
@drone_tales
@drone_tales 4 жыл бұрын
@@user-pc9wg4jt8l stoi
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
@@user-pc9wg4jt8l Вот скоростная преобразовалка HEX текста uint8_t HEXToInt(uint8_t *Buf) { uint8_t rint; if (Buf[0] >= '0' && Buf[0] = 'A' && Buf[0] = '0' && Buf[1]
@acrsofter
@acrsofter 4 жыл бұрын
никогда не использовал printf на микроконтролерах, не понимаю зачем она нужна, есть функции для отдельных преобразований
@stanislavdambrauskas1101
@stanislavdambrauskas1101 4 жыл бұрын
Владимир, подскажите, как загрузить на stm текстовые файлы в составе проекта, например: html, css?
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Прочитать с sd карточки, прочитать из внешней flash. Как текстовые константы.
@stanislavdambrauskas1101
@stanislavdambrauskas1101 4 жыл бұрын
Спасибо
@k0x024
@k0x024 4 жыл бұрын
Вкусное видео, сука! Спасибо!
@masterkit9517
@masterkit9517 4 жыл бұрын
сделайте MIDI нажать кнопку на миди клавиатуре 1 шт. из STM щиков во всем ютубе никто не сделал урок ни один о MIDI клавиатуре может возможно портировать с ардуино?
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Я зарабатываю деньги на жизнь изготавливая электронику на заказ. А данный канал это просто блог. Если мне закажут изготовление MIDI устройства, то я его сделаю, а про интересные моменты расскажу на канале. Однако я скажу вам что в MIDI ну вообще сложного ничего нету и масса примеров есть. И кстати видел что на одном из каналов вам это видео уже обещали. Скоро сделают.
@masterkit9517
@masterkit9517 4 жыл бұрын
@@VladimirMedintsev да уже на всех обещали) не сделают никак)
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Т.е. исходников www.chipdip.ru/product/midi которые даются вот с этим набором мало? Да и вот dml.compkaluga.ru/forum/index.php?showtopic=95923 с исходными текстами.
@masterkit9517
@masterkit9517 4 жыл бұрын
@@VladimirMedintsev вторая ссылка полностью без прошивок, схем, а первая на какой то специфической плате от амперки которую не купить в китае, спасибо за ссылки, но 2й пример понравился, но там ноль информации, ни прошивок ни исходников ни схем. Урок писали "скоро" сделают на одном из каналов, но похоже это затянется на годы.
@vladim12345
@vladim12345 4 жыл бұрын
Вы как то делали обзор на STM32CubeIDE и довольно хорошо отзывались про нее, почему не работаете с нею?
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Под тем же обзором было сказано, что в CubeIDE я делаю коммерческие проекты. А для видео так и останется Keil. Хотябы по той причине, что в нем удобно увеличивать шрифт и хорошо показывать в низком разрешении.
@vladim12345
@vladim12345 4 жыл бұрын
@@VladimirMedintsev Я только начал изучать микроконтроллеры, остановился на STM32, но с IDE еще не определился, с одной стороны CubeIDE предлагает сам производитель ST, плюс она бесплатная а с другой стороны все примеры в интернете в основном на Keil, IAR
@user-nl8oq5ol6p
@user-nl8oq5ol6p 2 жыл бұрын
Я может совсем новичок, но возникла проблема - надо В стс32 переменную, объявленную как 32-х разрядная передать через уарт ( т.е. перевести в массив 8-ми разрядных). Может я лишнюю проблему создаю? Спасибо.
@VladimirMedintsev
@VladimirMedintsev 2 жыл бұрын
Ну и передавайте. Похоже у вас проблема не в знании и понимании микроконтроллеров, а в понимании языка Си. Почитайте про ссылки и сможете.
@user-nl8oq5ol6p
@user-nl8oq5ol6p 2 жыл бұрын
С Си у меня проблемы. Я перешёл из схемотехники..
@user-nl8oq5ol6p
@user-nl8oq5ol6p 2 жыл бұрын
@@VladimirMedintsev Ссылки и указатели - это организация косвенной адресации. Т.е. обратившись по указателю к 32-хбитной переменной и далее увеличивая этот указатель я буду перемещаться по байтам???? Так было бы в 8-ми разрядном МК и то на ассемблере. Здесь такое явно не пройдет. Или я не правильно вас понял???
@CoBaldr
@CoBaldr 8 ай бұрын
А тесты сравнение?
@viyacheslav.
@viyacheslav. 8 ай бұрын
Писать на ассемблере и никаких проблем!
@asurahan
@asurahan 4 жыл бұрын
в недавнем интервью илон маск как раз говорил что наш код деградирует. мы говорит используем библиотеки написанные так давно что уже те кто их написал отправились в новую жизнь. у нас не хватает программистов как оказалось. я то думал такое у нас в СНГ а оказывается по всему миру так.
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
А Илон Маск это кто?
@alexandrakovshova3748
@alexandrakovshova3748 4 жыл бұрын
@@VladimirMedintsev какой-то очередной американский блогер наверное
@asurahan
@asurahan 4 жыл бұрын
@@alexandrakovshova3748 ну да типо того)
@easystm6865
@easystm6865 4 жыл бұрын
Работаю в coocox. Подключил библиотеку си в репозитории, использовал эту функцию, и сразу объём прошивки вырос с 5кб до 27кб !! Неужели такая прожорливая функция?
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Дык я про то и говорю.
@sovchem1275
@sovchem1275 4 жыл бұрын
Что то у тебя не то, у меня небольшой проект под f103c8t с freeRtos, hal и использованием sprintf примерно так же весил. (Keil5)
@Leech00001
@Leech00001 4 жыл бұрын
Может кому пригодиться в части зависания FreeRTOS от sprintf если использовать float или double github.com/leech001/STM32-FreeRTOS-float
@TruVi-13
@TruVi-13 4 жыл бұрын
Есть ещё хороший вариант для встраиваемых систем - xprintf.
@VladimirMedintsev
@VladimirMedintsev 4 жыл бұрын
Рука-лицо.
@TruVi-13
@TruVi-13 4 жыл бұрын
@@VladimirMedintsev И что эта фраза значит?
@ravil6018
@ravil6018 2 жыл бұрын
@@VladimirMedintsev Добрый день, Владимир. Давно на вашем канале, и ваше мнение для меня является экспертным. Я может быть много прошу, но если у вас найдется минутка, не могли вы сказать чем плох этот пресловутый xprintf?
@VladimirMedintsev
@VladimirMedintsev 2 жыл бұрын
@@ravil6018 Вот тут есть хорошая статья на эту тему. Там ближе к концу прямо отдельный раздел по xprintf. we.easyelectronics.ru/Soft/formatnyy-vyvod-na-si-dlya-mikrokontrollerov.html
@ravil6018
@ravil6018 2 жыл бұрын
@@VladimirMedintsev Понял. Спасибо большое!
@Al.Sy.
@Al.Sy. 4 жыл бұрын
06:58 тинипринт? Не, тайнипринт. :)
@alexandrekokushkin7032
@alexandrekokushkin7032 4 жыл бұрын
Добрый день! Спасибо за интересное видео, 1. глаз сразу режет "x
@JingoBo
@JingoBo 4 жыл бұрын
С третьим пунктом не согласен - зависит от компилятора. Слушать дядиньку из гугла конечно хорошо, но лучше или проверить в дизассемблере результат на используемом компиляторе или не выкобеливаться и писать как все привыкли, ведь большую часть времени программист читает код, а не пишет. Был у меня случай похожий. Я считал что лучше использовать битовый сдвиг вместо деления/умножения на 2, а оказалось что компиляторы про это тоже в курсе. В итоге с использованием битового сдвига ухудшается читабельность и понимание алгоритма другими программистами. А надо было лишь раз проверить что получается на выходе.
@drone_tales
@drone_tales 4 жыл бұрын
@@JingoBo Скорее даже не от компилятора, а от того, где сие используется. Для цикла, наверное, без разницы. В присваивании, и в выражениях - нужно смотреть конкретный код ассемблерный.
@alexandrekokushkin7032
@alexandrekokushkin7032 4 жыл бұрын
@@JingoBo префиксный инкремент это l-value, а постфиксный это r-value, тут компилятору сложнее сообразить, если Google Code Style не авторитет, вот Yandex clickhouse.tech/docs/ru/development/style/ 32. Всегда используйте префиксный инкремент/декремент, если постфиксный не нужен. for (Names::const_iterator it = column_names.begin(); it != column_names.end(); ++it) за каждым for-ом в ассемблерный код не налазиешься, лучше сразу писать правильно, читабельность такая-же.
@user-dk6nt5gg9b
@user-dk6nt5gg9b 4 жыл бұрын
Если речь идёт об итерации (цикла for, в частности), то операция ++ используется исключительно ради побочного эффекта, т.е. нас не волнует значение, ею порождаемое. В этом случае машинный код будет одним и тем же, напиши вы ++i, i++, i+=1 или i=i+1 - компилятор с этим справится. Это справедливо как для Си, так и для C++, если не используется поделие под названием STL. В случае же STL в форме ++i значением, возвращаемым из operator++, будет _новое_ значение итератора, при этом возвращается ссылка на свой собственный объект - "бесплатная" операция, которую оптимизатор всё равно выкинет. Если же используется форма i++, нужно вернуть значение, которое _было_, поэтому приходится сделать копию самого себя (на стеке, есстно) и вернуть объект по значению (переменная ведь локальная), что бьёт по производительности, т.к. оптимизатор тут уже практически бессилен. Именно по этой причине STL-фаги "настоятельно рекомендуют" в C++ всегда писать ++i, т.е. просто вот взять и привыкнуть писать вот так, и никогда не писать наоборот, чтобы не вызвать "не тот" метод итератора. Но в обозначенном выше примере это, повторюсь, не играет никакой роли.
@alexandrekokushkin7032
@alexandrekokushkin7032 4 жыл бұрын
@@user-dk6nt5gg9b любопытно, как использование STL может повлиять на инкремент инта?
@ibrag2012
@ibrag2012 4 жыл бұрын
Дивився як роблять іноземні друзі: на кожен моторчик окремий MCU.
@drone_tales
@drone_tales 4 жыл бұрын
Честно говоря, совершенно не понятно, о чем видео. Работа со строками всегда была дорогой операцией. Это раз. Функции семейства print никогда не предназначались для преобразования числа . Это функции печати. Это два. Ну и три: для преобразования есть itoa (и аналогичные) и обратные atoi. Они быстрее. Проблемы со стеком исключительно кривизна рук тех, кто не знает как работают эти функции. Количество параметров в % должно точно соответствовать количеству параметров функции. Потому как см. функции с открытым количеством параметров.
@daigosaito111
@daigosaito111 2 жыл бұрын
ничего что GetTick возвращает в миллисекундах значение? то есть 3 секунды занимает цикл
@AlexandrBaytaluk
@AlexandrBaytaluk Жыл бұрын
В цикле 1000 итераций. Соответственно автор и говорит в видео о времени одного вызова sprintf.
@streamdx
@streamdx 3 жыл бұрын
Не, ну нормально мужик америку открыл. Принтф с флоата на проце где нет FPU...)) Кто с риалтаймом работает тот стандартную библиотеку обычно почти не использует. А уж принтф так тем более.
What it feels like cleaning up after a toddler.
00:40
Daniel LaBelle
Рет қаралды 93 МЛН
Amazing weight loss transformation !! 😱😱
00:24
Tibo InShape
Рет қаралды 67 МЛН
Пранк пошел не по плану…🥲
00:59
Саша Квашеная
Рет қаралды 7 МЛН
Каха заблудился в горах
00:57
К-Media
Рет қаралды 10 МЛН
WebCam на коленке или хозяйке на заметку.
7:32
ПРОГРАММИСТЫ! ВСЕ СЮДА...
14:25
Winderton
Рет қаралды 334 М.
Rate This Smartphone Cooler Set-up ⭐
0:10
Shakeuptech
Рет қаралды 7 МЛН
Samsung laughing on iPhone #techbyakram
0:12
Tech by Akram
Рет қаралды 7 МЛН