|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
|
Нужны ли коллбэки или это синтаксический сахарок сомнительно18.09.2017, 21:57. Показов 13026. Ответов 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
|
|
| 18.09.2017, 22:13 | |
|
Callback - как следует из его названия - обратный вызов. Некая функция, вызываемая откудато, чтобы захватить чего-то в другом месте и вытянуть это чето в изначальное место. Пофик как она передается - через указатель или по имени - вообще пофик. В машинных кодах это, один хрен, будет инструкция вида branch <адрес_памяти>.
И callback, как функция, при ее вызове будет расходовать стек. Большое число вложенных коллбэков - одна из причин сильного колебания размера стека. А размер высокоскоростной оперативки, работающей на частоте ядра - от нескольких единиц килобайт до нескольких сотен килобайт. И вся эта ваша пурга с "динамическим распределением памяти" разбивается об прыгающий размер стека. Все остальное, чего пишет этот товарисчь про какие-то "черные ящики" и про необходимость что-то править руками - это вообще одно с другим не связанное. Коллбэки никак не связаны с ручными настройками библиотеки. В том то и фишка, что в эмбедде даже готовая библиотека может иметь "ручные" настройки, делаемые до компиляции кода, а не программно во время работы. и это совершенно нормально! Кароче говоря, как в случае с "динамическим распределением памяти" - харэ пороть пургу уже, и либо не лезьте не в свою сферу деятельности, либо займитесь самообразованием без менторского тона. Хотите что-то спросить, в чем-то разобраться - так спросите прямо, что именно интересует, а не устраивать всей этой ебаной херни в таком разоблачительном тоне бульварных газетенок.
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
|
| 18.09.2017, 23:53 | |
|
Гуглить "dependency injection" и "inversion of control".
Вкратце - начиная с некоторого уровня сложности системы очень нужны, потому что дают способ разобрать её на независимые части. Но это уже профессиональное программирование, приходит или с обучением, или с опытом.
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
|
|
| 19.09.2017, 00:25 | |
|
callbackи нужны в прикладном программировании для асинхронной модели, там где есть долгие процессы, которые не должны лочить основной код. В остальном же это зло которое приводит к callback Hell и прочим велосипедам для их обхода.
В МК с прерываниями они нах не нужны.
0
|
|
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 19.09.2017, 07:14 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
|||
| 19.09.2017, 07:26 | |||
0
|
|||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||||
| 19.09.2017, 07:38 | ||||
0
|
||||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
||
| 19.09.2017, 07:53 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
|
|||
| 19.09.2017, 10:17 | |||
В МК на одном ядре асинхронность... Ну ну.
0
|
|||
|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
||
| 19.09.2017, 14:18 [ТС] | ||
Т.е. да, такое софтовое прерывание нужно. Но способ его написания может быть различен. Или пробрасывание функции указателем через аргументы или дописывание руками библиотечки. И вот опять: есть ли в таком случае хоть какие-нибудь преимущества у механизма, связанного с указателем на функции? За вчерашний вечер мне пришел в голову интересный пример. С одной стороны - он здорово ложится на идеологию коллбэков, с другой стороны - его применение в mbed сомнительно. Может быть вы как нибудь его прокомментируете. В каком случае функция может принимать на вход другую функцию, как аргумент? Если наша функция производит дифференцирование, интегрирование, преобразование Фурье, свертку и т.д. Т.е. если представить библиотеку для мат.анализа, ее функции будут предназначены для работы над другими функциями. И данная библиотека будет нуждаться в передаче из нашего приложения функций, как аргументов. Но хоть убейте, не представляю задачи для микроконтроллера, что бы она сам пытался зачем-то подыскать нужную функцию перебирая их из какого-нибудь набора и подставляя их в нашу гипотетическую библиотеку. Подобного рода библиотеки характерны для какого-нибудь MathCAD.
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 19.09.2017, 14:33 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 19.09.2017, 14:43 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
|
|
| 19.09.2017, 14:51 | |
|
Коллбэк не всегда асинхронщина, асинхрон - не всегда коллбэк.
Тот же классический qsort, которому надо передавать и функцию сравнения элементов. Никакой асинхронщины, но коллбэк в чистом виде.
0
|
|
|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
|
| 19.09.2017, 14:55 [ТС] | |
|
Большое спасибо, ув.ivsy за развернутый, взвешенный и интересный ответ. Хотелось бы уточнить несколько вопросов:
1. Пишете ли вы что-либо для mbed? В частности, для mcu. 2. Если да, то используете ли вы паттерны проектирования? В частности, "стратегию". 3. Если да, то могли бы вы привести один или несколько кейсов?
0
|
|
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 19.09.2017, 16:07 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
|
|
| 19.09.2017, 18:33 | |
|
callbackи на МК с большим трудом можно оправдать в либах, которые используются поверх или совместно с OS, там где нужно ждать ответы от периферии или действий из-вне пользователей.
Ну или вот как выше приводили пример с функций сортировки. В С есть достаточно хороший механизм определения wiok функций. И давайте не лезть в высокие материи прикладного (и прочего за рамками МК) программирования, там с callbacks тоже далеко не все гладко и не всегда оправдано их использование.
0
|
|
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 19.09.2017, 18:40 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
|||
| 19.09.2017, 18:52 | |||
0
|
|||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 382
|
||
| 19.09.2017, 19:21 | ||
Я сам занимаюсь промышленной автоматикой. И контроллер шпинделя не тупо ждет раскрутки, а в реальном времени получает инфу с высокосростного абсолюного углового энкодера, следя за вращением шпинделя в реальном времени, постоянно, а не по прерыванию. Конечно, в такие сферы всяких там Арсениев и на пушечный выстрел не подпустят, "дабы чего не вышло"
0
|
||
|
0 / 0 / 0
Регистрация: 13.03.2015
Сообщений: 52
|
||
| 19.09.2017, 19:26 [ТС] | ||
0
|
||
| 19.09.2017, 19:26 | |
|
Помогаю со студенческими работами здесь
20
Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? Сомнительно работают клавиши Сомнительно сильные просадки ФПС Коллбэки Коллбэки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера 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, то после закрытия окошка. . .
|