|
Структура функций, В чём преимущество ? |
|
|
|
Feb 14 2014, 00:34
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Здравствуйте, есть вот такая хитрая структура (тут мне не совсем понятно что делает union и зачем он там нужен) CODE typedef struct __WIZCHIP { uint16_t if_mode; ///< host interface mode uint8_t id[6]; ///< @b WIZCHIP ID such as @b 5100, @b 5200, @b 5500, and so on. /** * The set of critical section callback func. */ struct _CRIS { void (*_enter) (void); ///< crtical section enter void (*_exit) (void); ///< critial section exit }CRIS; /** * The set of @ref\_WIZCHIP_ select control callback func. */ struct _CS { void (*_select) (void); ///< @ref \_WIZCHIP_ selected void (*_deselect)(void); ///< @ref \_WIZCHIP_ deselected }CS; /** * The set of interface IO callback func. */ union _IF { /** * For BUS interface IO */ struct { uint8_t (*_read_byte) (uint32_t AddrSel); void (*_write_byte) (uint32_t AddrSel, uint8_t wb); }BUS; /** * For SPI interface IO */ struct { uint8_t (*_read_byte) (void); void (*_write_byte) (uint8_t wb); }SPI; // To be added // }IF; }_WIZCHIP;
Заполнение её (.if_mode .id и др указывают место расположение ? т.е при таком подходе можно их местами менять ? ) Код _WIZCHIP WIZCHIP = { .id = _WIZCHIP_ID_, .if_mode = _WIZCHIP_IO_MODE_, .CRIS._enter = wizchip_cris_enter, .CRIS._exit = wizchip_cris_exit, .CS._select = wizchip_cs_select, .CS._deselect = wizchip_cs_deselect, .IF.BUS._read_byte = wizchip_bus_readbyte, .IF.BUS._write_byte = wizchip_bus_writebyte // .IF.SPI._read_byte = wizchip_spi_readbyte, // .IF.SPI._write_byte = wizchip_spi_writebyte }; Работа с ней выглядит так Код WIZCHIP.CS._select(); т.е получается просто вызывается функция wizchip_cs_select() Так вот чём преимущество такого подхода WIZCHIP.CS._select(); по сравнению с просто вызовом функции wizchip_cs_select(); ? И на сколько дольше выполняется первый метод по сравнению со вторым?
|
|
|
|
|
 |
Ответов
(15 - 29)
|
May 3 2014, 23:10
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(ViKo @ May 3 2014, 17:01)  Обратно - это куда? "Сигнал посылаем - вы что это там? А нас посылают обратно!" Можете привести пример менее аб... абстрактный? Привожу. Посылаю CAN message. Записать я его по SPI записал. Теперь когда результат доставки будет - неизвестно, а мне надо еще посылать. Передаю "позывные" своего message и говорю: свиснешь как доставишь - получилось, нет.. И передаю следующий в буффер.. Вот когда будет результат доставки, CAN вызовет callback (позовет меня обратно) и скажет смог или нет
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 4 2014, 13:01
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(AHTOXA @ May 4 2014, 01:29)  По-моему, callback - это просто. Например, есть функция вывода jpg-картинки на экран. Она умеет декодировать картинку. Но не знает, как отрисовать пиксель на экране. Мы вызываем её, и в качестве параметра передаём указатель на функцию отрисовки пикселя. Такой подход позволяет уменьшить связность программ. Можно не передавать функцию в качестве параметра при вызове каждый раз, а передать её один раз при инициализации библиотеки. Функция может выполняться в отдельном потоке. Тогда она будет вызывать наш callback асинхронно. Но это уже частности, суть от этого не меняется. нет, это не callback. Это аналог виртуальной функции в C++, которая может быть подменена на ходу. Callback всегда асинхронен. И всегда по какому то событию. Цитата(ViKo @ May 4 2014, 01:13)  Handshake? По-моему, вы спекулянт (понятиями). Это абсолютно другое понятие.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 4 2014, 15:10
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(AHTOXA @ May 4 2014, 08:09)  Вы что-то путаете. callback - это функция обратного вызова. И всё. Нет гарантии что каллбэк синхронен. Именно поэтому он так и называется. "Право на звонок" передается другому треду. Если функция вызывается из того же треда то это не каллбэк. Как там экономно такси вызывают? Звонишь на номер и отключаешся. Ждешь каллбэк. Полная аналогия.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 4 2014, 18:36
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(AHTOXA @ May 4 2014, 11:56)  Ага. Было "Callback всегда асинхронен", теперь "Нет гарантии что каллбэк синхронен"  А это одно и тоже. он асинхроннен, но в теории может совпасть. Цитата(ViKo @ May 4 2014, 13:19)  Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции. Нет. Не то. Не понимаю, что не понятно? Это не "туда обратно". Это аналогично прерыванию. Время события как правило неизвестно. Поэтому ни какие "туда-обратно". Это не "функция возвращающаяся назад". И не "вызывающая другие функции". У ембеддеров есть понятие прерывания, у десктопных или как вы их называете, обычных программеров прерывания нет. Если ему надо переслать чтото в последовательный порт, он запишет данные в буффер, вызовет функцию работы с портом, передаст туда аддресс callback функции и уйдет по делам делать другую работу. Когда посылка завершится, система вызовет callback и передаст туда результаты. Никакая это не "тудаобратно". И не "возвращающаяся назад"
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 4 2014, 18:43
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ViKo @ May 5 2014, 00:19)  Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции. Нормальный перевод. Мы вызываем библиотечную функцию, она в процессе своей работы вызывает нас обратно, через переданную ей в качестве параметра функцию обратного вызова. Цитата(A. Fig Lee @ May 5 2014, 00:36)  А это одно и тоже. он асинхроннен, но в теории может совпасть. Ну хватит уже нести чушь. Вы неправильно понимаете, что такое callback. Вот пример синхронного калбэка: EnumWindowsЦитата BOOL WINAPI EnumWindows( _In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam );
Parameters: lpEnumFunc [in] Type: WNDENUMPROC A pointer to an application-defined callback function. For more information, see EnumWindowsProc.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 4 2014, 18:55
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(AHTOXA @ May 4 2014, 21:43)  Нормальный перевод. Мы вызываем библиотечную функцию, она в процессе своей работы вызывает нас обратно, через переданную ей в качестве параметра функцию обратного вызова. По-вашему, получается, callback - это функция, в которую передали другую функцию в качестве параметра. Так прямо "вызывает"? Может, все таки, возвращается? Разве вызываемая функция не вернется в вызывающую (библиотечную, в вашем примере)? По-моему, callback - это как раз та функция, которую передали. Функция, возвращающаяся назад...? Так они все назад...
|
|
|
|
|
May 4 2014, 18:58
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(ViKo @ May 4 2014, 21:19)  Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции. Не хочу использовать понятие функции, поскольку возможны подмены из математики. Переход по адресу подпрограммы с возвратом - вызов подпрограммы, что и есть "вызов функции". Себе Вы можете представить что угодно, но поскольку Вы не нативный носитель языка и не лингвист, то лучше обратиться к причинам, по которым "callback" появился. Причины просты: при декомпозиции программы появляются отдельные независимые модули, которые могут получать данные, которые должны обрабатываться различно в зависимости от контекста выполнения. Поэтому им не надо их обрабатывать, а надо сообщить о них "знающему" модулю. Это легко сделать, когда программа монолитна, а если модули независимы, то необходимо передавать в связанные модули адреса подпрограмм для "обратной связи" по обработке данных. Вот подпрограмма, адрес которой передается в таком случае - имеет жаргонизм "callback". P.S. И прошу помнить о раздельной компиляции модулей.
|
|
|
|
|
May 4 2014, 19:10
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(ViKo @ May 4 2014, 22:06)  То есть, события, асинхронность - не при чем? Просто передаем один из возможных методов (функций)? Конечно (Только "методы" - это такое ограничение на "функции", которое наложил C++). Вот у Вас есть программно-аппаратный модуль, который программирует таймер, обрабатывает от него прерывания. Он все знает о таймере. Вы его запрограммируете и все. А как узнать, что время, которое Вы заказали, прошло? Надо передать адрес подпрограммы, которая будет вызвана по истечении времени. Это как раз простейший пример "callback" подпрограммы. P.S. В данном контексте подпрограмма для "обратной связи" модулей.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|