|
Структура функций, В чём преимущество ? |
|
|
|
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(); ? И на сколько дольше выполняется первый метод по сравнению со вторым?
|
|
|
|
|
 |
Ответов
(60 - 68)
|
May 7 2014, 16:39
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Цитата(GetSmart @ May 7 2014, 14:53)  Драйвер устройства хранения вызывает функции файловой системы? Если да, то это будет callback. Даже если функция вызывается по статическому адресу. Или если вызывается синхронно, например fopen->fs_open_xxx->drv_read_blk->fs_alloc_blk. Главное, что вызов направлен в обратную строну, назад.
|
|
|
|
|
May 7 2014, 18:28
|

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

|
Цитата(GetSmart @ May 7 2014, 19:17)  Как в жизни. "Перезвони(те) мне" = асинхронность + разговор за чужой счёт (чужой тред). Плюс нет 100% гарантии, что перезвонит  Понятие асинхронности не связано с понятием обратного вызова. Обратный вызов - это просто направление. Мне не нравится аналогия с телефоном, но если уж её применять, то это будет выглядеть так: - Вы звоните оператору сортировки (qsort company), и делаете заказ - отсортировать список гостей на свадьбу.
- При этом вы сообщаете ему номер жены для консультаций о порядке сортировки (compare). Трубку не кладёте, ждёте результата.
- Оператор в процессе сортировки перезванивает вашей жене другому номеру (compare) и уточняет (кого с кем посадить).
- По окончании сортировки оператор сообщает вам результат.
Это получается синхронный callback. То же самое, но вы кладёте трубку после заказа, а оператор перезванивает вам после выполнения - асинхронный. Добавлю, что понятие callback-функция появилось в программировании задолго до появления многозадачности и многопоточности. Цитата(A. Fig Lee @ May 7 2014, 19:30)  Кстати по поводу "qsort callback" Это как "шампанское" "Советское шампанское". Все называют. Хотя правильное определение шампанского, если спросить: Не болтайте ерундой. Это именно callback. Такова устоявшаяся терминология в данной отрасли (программирование).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 7 2014, 19:16
|

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

|
Цитата(ViKo @ May 8 2014, 00:37)  Переведите это на язык программы. Что значит "не кладете трубку" и что "кладете"? Очень просто. Если "не кладёте трубку" - все вызовы колбэков идут _до_ возврата из функции сортировки. Если "кладёте" - вызовы могут идти после возврата из функции сортировки. То есть, мы из main() вызвали qsort(), qsort в процессе работы много раз вызвал compare(), отсортировал, и только после этого вернул управление в main(). Здесь compare - синхронный callback. Второй вариант. Мы вызвали qsort_async(compare, done). Этот qsort вернул управление сразу, мы можем делать что-то другое. А qsort в это время работает, вызывает compare. Это уже асинхронные обратные вызовы. Ну и когда он отсортирует, он вызовет ф-ю done(). Такой callback называют completion routine.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 7 2014, 20:11
|

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

|
Цитата(AHTOXA @ May 7 2014, 22:16)  Второй вариант. Мы вызвали qsort_async(compare, done). Этот qsort вернул управление сразу, мы можем делать что-то другое. А qsort в это время работает, вызывает compare. Это уже асинхронные обратные вызовы. Ну и когда он отсортирует, он вызовет ф-ю done(). Такой callback называют completion routine. Первый вариант - понятно. А второй - предполагает многозадачную или многопроцессорную систему? А, может, пускай они уже сами по себе работают - один проц сортирует, а другой... перемешивает  ? Ах, да, еще же прерывания есть...
|
|
|
|
|
May 7 2014, 22:16
|

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

|
Цитата(AHTOXA @ May 7 2014, 14:16)  Очень просто. Если "не кладёте трубку" - все вызовы колбэков идут ... Никуда они не идут. Дозвонится не получится. Управление надо получить сначала Цитата(AHTOXA @ May 7 2014, 13:28)  Не болтайте ерундой. Это именно callback. Такова устоявшаяся терминология в данной отрасли (программирование). Нет. Не согласен.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 8 2014, 08:08
|

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

|
Цитата(ViKo @ May 8 2014, 02:11)  Первый вариант - понятно. А второй - предполагает многозадачную или многопроцессорную систему? Да, естественно. Асинхронность подразумевает несколько потоков выполнения. Цитата(GetSmart @ May 8 2014, 08:40)  "Их" устоявшаяся терминология понятна. Как минимум два типа вызовов, принципиально непохожих. Но зачем-то обозванных одним обобщающим термином. Причём, кто-то и семафоры в эту "кучу" "притягивает" как способ возврата информации. Термин в принципе тоже понятен - обратный вызов из библиотеки. Вас постоянно сбивает аналогия с телефоном. Но между телефонным обратным вызовом и обратным вызовом функции есть принципиальная разница: телефонный обратный вызов обычно производится по тому же самому телефону, который инициировал вызов. В случае же с вызовом функции - вызывается другая функция, не та, что инициировала весь этот процесс. Поэтому представить синхронный колбэк по телефону сложнее (приходится приплетать жену  ).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 10 2014, 14:40
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (AHTOXA @ May 8 2014, 01:28)  Понятие асинхронности не связано с понятием обратного вызова. Обратный вызов - это просто направление. Мне не нравится аналогия с телефоном, но если уж её применять, то это будет выглядеть так: - Вы звоните оператору сортировки (qsort company), и делаете заказ - отсортировать список гостей на свадьбу.
- При этом вы сообщаете ему номер жены для консультаций о порядке сортировки (compare). Трубку не кладёте, ждёте результата.
- Оператор в процессе сортировки перезванивает вашей жене другому номеру (compare) и уточняет (кого с кем посадить).
- По окончании сортировки оператор сообщает вам результат.
Это получается синхронный callback. То же самое, но вы кладёте трубку после заказа, а оператор перезванивает вам после выполнения - асинхронный. Добавлю, что понятие callback-функция появилось в программировании задолго до появления многозадачности и многопоточности. Не болтайте ерундой. Это именно callback. Такова устоявшаяся терминология в данной отрасли (программирование). Всё верно, ни убавить, ни добавить. За пример с телефоном и сортировкой отдельный респект.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|