|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
|
Нужны ли коллбэки или это синтаксический сахарок сомнительно18.09.2017, 21:57. Показов 13030. Ответов 135
Метки нет (Все метки)
Коллбэк - исполняемый код, передаваемый посредством указателя в функцию как аргумент.
Обычно механизм коллбэков (касательно mbed) применяется при использовании какой-нибудь обширной библиотеки, оказавшейся строго между физическим уровнем и уровнем приложения. Классический пример - библиотека файловой системы. Разумно, что мы подключаем библиотеку для физической реализации протокола обмена данными с носителем (HDD, SD-card и т.д.) плюс библиотеку ФС. И на уровне приложения используем что-нибудь вроде функций readFile/writeFile из библиотеки ФС пробрасывая через эти функции указатели на функции readData/writeData из библиотеки физической реализации. Типа все библиотеки работают как черные ящики, всё прекрасно. Проблема в том, что в самой популярной библиотеке ФС для mbed - FatFs - не используются коллбэки. В числе файлов библиотеки дается файлик, который нужно подправить руками. Т.е. чуточку залезть в черный ящик. Т.е. концепция "библиотека - это черный ящик, а коллбэки - это способ послать в черный ящик исполняемый код" ступает нафиг. Т.е. зачем тогда нужны коллбэки? Механизм-то их применения нихрена не простой. По сравнению с "подправить файлик в библиотеке". Не, я понимаю в библиотеках USB они буйным цветом цветут. Но в случае библиотеки USB такой механизм навязан разработчиками библиотеки. Есть ли кейсы на которые механизмы коллбэков ложаться идеально ровно? Или коллбэки - это синтаксический сахар сомнительного свойства?
0
|
|
| 18.09.2017, 21:57 | |
|
Ответы с готовыми решениями:
135
Зачем нужны коллбэки? Потоки или коллбэки?
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
||
| 19.09.2017, 19:33 | ||
Я прикидываю, если управление шпинделем винторезного станка будет ждать, пока засвопится ОЗУ. Блин, писюковые погромисты пусть лучче громят компы, а если и хотят переходить на сложные низкоуровневые вещи, то пусть занимаются нормальным самообразованием, без этого долбанного кича. Вообще мне кажется, что Ирсений тупо пописывает где-то статейки, потому сюда и вылезает с вопросом о "кейсах", выдавая потом набранное за своё. Стопудово. Уж больно его стиль похож на журналюшный разоблачительно-бульварный. Заголовок этой темы посмотрите, ётс.. И вообще, я чето так смотрю, тут почемуто путают коллбэки и прерывания. Прерывыния - они действительно могут возникать "внезапно" для ничего не подозревающей программы. Ну а коллбэк? Он всегда предсказуем, потому что вызывается прямо и непосредственно в строго определенном шаге программы. Или опять писюковые погромисты че-то где-то перепутали? Callback - это обычная йобаная стандартная функция, а названа она так, потому что по своему характеру похожа на "побежал-схватил-прибежал-отдал". И в машинных кодах коллбэк представляет собой инструкцию типа branch <адрес_памяти>, то есть ровно такую же, как и при обычном вызове функции.
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
||
| 19.09.2017, 20:22 | ||
Функция qsort из стандартной библиотеки, которую тут вспоминали - очень характерный пример. Интересно, есть тут люди, способные написать её аналог без callback? (если что - это возможно, только код усложнится) Аналог - в смысле, сортировка массива любых данных, функция qsort или что там её заменит не должна ничего о них знать (т.к. может быть вызвана для разных массивов), а вызывающий код не должен ничего знать о внутреннем устройстве сортировки (замена quick sort на shitt или heap sort не должна менять вызывающий код).
0
|
||
|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
||
| 19.09.2017, 21:29 [ТС] | ||
0
|
||
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
| 19.09.2017, 21:51 | |
|
Ирсений, вы несете откровенную чушь. А последствия
просачивания быдлокодинга в эмбедд можете ощутить в полной мере , посетив сайты адептов ардуиньи.
0
|
|
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
||
| 20.09.2017, 00:10 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 20.09.2017, 09:18 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
||
| 20.09.2017, 12:32 [ТС] | ||
Можно себе представить написанную нами библиотеку с алгоритмами сортировки на любой вкус. И каждая функция будет требовать аргументом указатель на функцию сравнения. Но. А по каким критериям мы вообще можем сортировать? 1) По возрастанию абсолютного значения? Ок. 2) По возрастанию модуля? Ну - ок. 3) А еще? На ум приходит сортировка по алфавиту. Ну-у... вещь специфическая. Особенно для mbed. 4) Сортировка массива структур по значению, вычисляемому "на лету" и не содержащемуся в элеметнах структуры? Условно, в структуре есть координаты точек X и Y, нам нужно отсортировать точки по удаленности от некой базовой точки. Э-э-э... при каждом перемещении элемента вместо простого сравнения - возведение в квадрат, возведение в квадрат, сумма, корень, сравнение. И так - по многу раз. Быстрее добавить элемент в структуру, вычислить его один раз для каждого элемента массива и далее - см. 1) Может лучше вместо проброса функции сравнения аргументом сделать галочку "модуль/абсолютное_значение"? Да и qsort - рекурсивный алгоритм, что для mcu - достаточно рискованное мероприятие.
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
|||
| 20.09.2017, 13:14 | |||
0
|
|||
|
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
|
||
| 20.09.2017, 13:38 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
| 20.09.2017, 13:43 | |
|
callback (в виде параметра, таблицы) полезен если у меня он меняется.
Если он один и не меняется я могу и через wiok, #define сделать - по фиг как. Обычно писатели библиотек предполагают, что будет более универсально с динамическими callback. При этом раздутие кода и лишние действия их не очень волнуют. Работает и ладно. ST еще не очень, а вот nRF или TI они во все дырки их суют (да и вообще там мрак внутри - хотя снаружи всё чинно и благородно).
0
|
|
|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
||
| 20.09.2017, 13:54 [ТС] | ||
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 20.09.2017, 14:08 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
||
| 20.09.2017, 14:38 [ТС] | ||
1) выясняем самое длинное слово. Пускай в нем N знаков 2) считаем слова (для русского алфавита) - 33-ричными числами. Причем, если слово состоит из M символов, то дополняем его на этапе вычисления числового ключа 33-ричными нулями справа в количестве N-M шт. 3) заполняем доп.поле для сортировки сосчитанными числами 4) выполняем сортировку по числовому ключу. Т.е. в самой сортировке нужно, пожалуй, два флажка "возрастание/убывание" и "абсолютное_значение/модуль".
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
||
| 20.09.2017, 15:18 | ||
Слухайте, погромисты - Арсюша, ivsy и им сочувствующие - господа, вы че, с дубу рухнули или вообще не в теме хоть сколь-ко то??? Писец, я фсю жызнь пользовался ASCII кодировкой для перевода буквы в число, для сортировки по алфавиту, для перевода между "маленькими" и "большими" буквами, для перекодировки и вывода шрифтов... и безо всяких там 33-ричных цифр. А тут - на тебе, новое слово Арсюши ломает стереотипы. Ну ващеее ребзя вы чето ващеееее. И вы еще называете себя "очень важными персонами", ётс... Не, ну что не день, так новые "открытия". Куда котицца мир... Че ваапще происходит?
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
||
| 20.09.2017, 16:46 | ||
Можно себе представить написанную нами библиотеку с алгоритмами сортировки на любой вкус. И каждая функция будет требовать аргументом указатель на функцию сравнения. Но. А по каким критериям мы вообще можем сортировать? 1) По возрастанию абсолютного значения? Ок. 2) По возрастанию модуля? Ну - ок. 3) А еще? На ум приходит сортировка по алфавиту. Ну-у... вещь специфическая. Особенно для mbed. 4) Сортировка массива структур по значению, вычисляемому "на лету" и не содержащемуся в элеметнах структуры? Условно, в структуре есть координаты точек X и Y, нам нужно отсортировать точки по удаленности от некой базовой точки. Э-э-э... при каждом перемещении элемента вместо простого сравнения - возведение в квадрат, возведение в квадрат, сумма, корень, сравнение. И так - по многу раз. Быстрее добавить элемент в структуру, вычислить его один раз для каждого элемента массива и далее - см. 1) Может лучше вместо проброса функции сравнения аргументом сделать галочку "модуль/абсолютное_значение"? Да и qsort - рекурсивный алгоритм, что для mcu - достаточно рискованное мероприятие. Вот! Это ключевой момент. Штука в том, что так действительно можно сделать. Но за это вы расплатитесь тем, что у вас sort будет знать про ваши типы данных. Т.е. вы не сможете использовать библиотечный sort - вам надо будет написать свой, именно для ваших типов. Получается, что функция sort жёстко сцеплена (coupling) с остальным кодом. https://ru.wikipedia.org/wiki/... %B8%D0%B5) В мелком проекте - это не проблема вообще, и такой подход зачастую оправдан. Проблемы - только в крупных проектах. Нельзя написать sort раз и навсегда, при изменении кода или структур данных в одном месте - приходится менять в других местах, вылезают трудноотлавливаемые баги... В общем, с какого-то момента привыкаешь добиваться слабого зацепления, и callbacks - просто инструмент для этого. А разработчикам библиотек без этого вообще никак. У них нет доступа к вашему коду, поэтому написать функцию sort, понимающую флажок - они не могут. Практически единственный вариант - callbacks. Хотя есть, есть ещё один вариант. Реализован в STM32CubeMX (сейчас сюда сбегутся люди с воплями "калокуб"). Дать вам шаблон кода, в который вы должны вписывать свои кусочки. Поверьте, вам не понравится =)
0
|
||
|
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
|
||
| 20.09.2017, 17:18 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
||
| 20.09.2017, 19:30 [ТС] | ||
Как я понял, если проект большой, такого уровня как пишет ув.ivsy, то коллбэки начинают играть красками. Если это программа - контроллер от лифта - дописывание удобней. Хотелось бы оценить граничную сложность проекта начиная с которой надо отходить от дописывания в сторону коллбэков.
0
|
||
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
| 20.09.2017, 20:13 | |
|
Пишите как вам удобнее, нет единых правил. Система должна работать согласно ТЗ отвечать необходимым требованиям. Как именно это сделано - уже на совести программиста. В одном из "больших и сложных" проектов коллбэки были только в библиотеке gui emWin, и то, неудобства не доставляли. Крутится в низкоприоритетнои таске и пускай. При этом был, ethernet, http/ftp серверы на несколько клиентов, fatfs с дисками на флеш памяти и виртуальный в sdram, куча различной периферии, всякие виды памяти на разных интерфейсах, кучка шаговых движков и dc. В общем чуть сложнее мигалки. Рулила всем freertos с кучей в sdram. Указатели на функции были, коллбэки в своем коде как то не пригодились. И как то все крутилось "параллельно". Файлы на фтп заливались по 9 мБ/с, двигатели работали, тайминги соблюдались. В чем проблема залезть в черный ящик и посмотреть что там внутри? Ничего критичного в этом нет. У кучи сторонних библиотек порты под определенный проц без каких либо коллбэков, сам пишешь функции драйвера под свое железо. Хотя взять тот же TI , например cc2640 с двумя ядрами - там черт ногу сломит в их ОС, все на коллбэках. С другой стороны удобно - функцию написал, зарегил в недрах их либы, вызывается тогда когда нужно. Слегка непрозрачная работа, но проблем не было.
0
|
|
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 20.09.2017, 20:29 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
||
| 20.09.2017, 21:21 | ||
Ещё, может, и к концепции интерфейсов привыкнете (это чуть сложнее callback: не одна функция, а несколько, см. https://ru.wikipedia.org/wiki/... %B8%D0%B5)). Тоже одна из базовых вещей. Ну и библиотеки порой вам callbacks навязывают - но это просто потому, что их авторы в это ограничение уже упёрлись (ну, как в том же qsort: крайне сложно его написать без "втягивания" внутрь вашей функции сравнения, а проще callback для этого ничего нет).
0
|
||
| 20.09.2017, 21:21 | |
|
Помогаю со студенческими работами здесь
40
Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? Сомнительно работают клавиши Сомнительно сильные просадки ФПС Коллбэки Коллбэки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
в-строка - входное арифметическое выражение в инфиксной(обычной). . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|