|
|
  |
Структура функций, В чём преимущество ? |
|
|
|
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(); ? И на сколько дольше выполняется первый метод по сравнению со вторым?
|
|
|
|
|
Feb 14 2014, 13:57
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(pokk @ Feb 14 2014, 04:34)  Так вот чём преимущество такого подхода WIZCHIP.CS._select(); по сравнению с просто вызовом функции wizchip_cs_select(); ? Код с етим WIZCHIP не зависит от конкретной платы. А это даёт такой профит: например, его можно собрать в либу и больше не тратить времени на перекомпиляцию. Разумеется, в мелких проектах сие значения не имеет, но правильность подхода придает уверенность, что оно может работать и в составе более сложных систем без изменений. Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит. Цитата И на сколько дольше выполняется первый метод по сравнению со вторым? если вызываемая функция в том же модуле и описана как static - то ни насколько.
|
|
|
|
|
Feb 14 2014, 14:14
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(pokk @ Feb 14 2014, 02:34)  т.е получается просто вызывается функция wizchip_cs_select()
Так вот чём преимущество такого подхода WIZCHIP.CS._select(); по сравнению с просто вызовом функции wizchip_cs_select(); ? И на сколько дольше выполняется первый метод по сравнению со вторым? Думаю никакого преимущества здесь нет. Просто у того китайского программитста возможно какие-то шаблонные подходы наработанные на других проектах. Социокультурные особенности может быть. Главное ведь чтобы ему самому нравилось. А я например такому коду сразу делаю беспощадный рефакторинг.
|
|
|
|
|
Feb 17 2014, 07:14
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Спасибо за помощь. Я примерно так и думал только где-то там в комментариях увидел про ОС. Думал что-то с ней может быть связанно. Цитата Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит. Это точно сейчас вот с этим воюю, так как изначально чёрти что понаделал.
|
|
|
|
|
Feb 17 2014, 16:36
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(_Pasha @ Feb 14 2014, 08:57)  Код с етим WIZCHIP не зависит от конкретной платы. А это даёт такой профит: например, его можно собрать в либу и больше не тратить времени на перекомпиляцию. Разумеется, в мелких проектах сие значения не имеет, но правильность подхода придает уверенность, что оно может работать и в составе более сложных систем без изменений. Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит.
если вызываемая функция в том же модуле и описана как static - то ни насколько. Все это можно было бы достичь и без таких извращений. Виртуальные функции на С, это все-таки ужасный изврат. Какая связь между независимыми модулями, и этим кодом?
|
|
|
|
|
May 3 2014, 10:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(ViKo @ May 3 2014, 12:31)  Что такое callback функция? И в Википедии читал, и все равно не понимаю. Функция, вызываемая по указателю на нее? Функция, вызывающая функцию, указатель на которую передан в параметрах? Кто бы определил ясно и четко. Вижу, этим термином злоупотребляют, где ни попадя. В чем преимущество по сравнению с "функцией, вызываемой из функции"? Недавно читал доку wifi_stack_api_reference_v0.8.pdf и там прикольное определение было: "Callback programming is a style of computer programming, which allows lower layer of software to call functions defined on a higher layer. Callback is piece of code or a reference to a piece of code that is passed as an argument." Там же ссылка. "Сallback function is a function that is called through a function pointer. If you pass the pointer (address) of a function as an argument to another, when that pointer is used to call the function it points to it is said that a call back is made."
Сообщение отредактировал doom13 - May 3 2014, 11:04
|
|
|
|
|
May 3 2014, 11:08
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(ViKo @ May 3 2014, 14:50)  В том и дело, что по Википедии получается, не обязательно по событию, а просто в качестве параметра функции. Или это принципиальное свойство? Ну, любая функция так или иначе вызывается по событию  Принципиальное свойство - параметризуемость вызываемого объекта (не обязательно передача именно как параметра функции, т.к. это может быть отдельная структура и т.п). Вещь простая, но дать краткое и исчерпывающее определение, не опускаясь при этом в частности, трудно.
|
|
|
|
|
May 3 2014, 19:47
|

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

|
Цитата(ViKo @ May 3 2014, 05:50)  В том и дело, что по Википедии получается, не обязательно по событию, а просто в качестве параметра функции. Или это принципиальное свойство? Не знаю то там в википедии, но смысл именно чтобы по какомуто событию передать данные обратно. Асинхронно! Именно это и имеют ввиду "callback". Когда он "обратно позвонит" неизвестно. Ждать нам некогда. Поэтому вот финкция и "будут деньги - звони, а мне некогда"
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|