реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Структура функций, В чём преимущество ?
pokk
сообщение Feb 14 2014, 00:34
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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(); ?
И на сколько дольше выполняется первый метод по сравнению со вторым?


Go to the top of the page
 
+Quote Post
smalcom
сообщение Feb 14 2014, 10:16
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



>> т.е при таком подходе можно их местами менять ? )
да

>> Так вот чём преимущество такого подхода WIZCHIP.CS._select();
объектно ориентированный дизайн. возможность подмены низкого уровня(драйверов) не изменяя верхний(API т.с.).

>> И на сколько дольше выполняется первый метод по сравнению со вторым?
в теории на время загрузки индексного регистра. на практике компилятор может и подставить значение. собрать и посмотреть дизасм.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 14 2014, 13:57
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(pokk @ Feb 14 2014, 04:34) *
Так вот чём преимущество такого подхода WIZCHIP.CS._select(); по сравнению с просто вызовом функции wizchip_cs_select(); ?

Код с етим WIZCHIP не зависит от конкретной платы. А это даёт такой профит: например, его можно собрать в либу и больше не тратить времени на перекомпиляцию. Разумеется, в мелких проектах сие значения не имеет, но правильность подхода придает уверенность, что оно может работать и в составе более сложных систем без изменений. Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит.


Цитата
И на сколько дольше выполняется первый метод по сравнению со вторым?

если вызываемая функция в том же модуле и описана как static - то ни насколько.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Feb 14 2014, 14:14
Сообщение #4


Ally
******

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



Цитата(pokk @ Feb 14 2014, 02:34) *
т.е получается просто вызывается функция wizchip_cs_select()

Так вот чём преимущество такого подхода WIZCHIP.CS._select(); по сравнению с просто вызовом функции wizchip_cs_select(); ?
И на сколько дольше выполняется первый метод по сравнению со вторым?


Думаю никакого преимущества здесь нет.
Просто у того китайского программитста возможно какие-то шаблонные подходы наработанные на других проектах. Социокультурные особенности может быть.
Главное ведь чтобы ему самому нравилось.

А я например такому коду сразу делаю беспощадный рефакторинг.
Go to the top of the page
 
+Quote Post
pokk
сообщение Feb 17 2014, 07:14
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Спасибо за помощь. Я примерно так и думал только где-то там в комментариях увидел про ОС. Думал что-то с ней может быть связанно.
Цитата
Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит.

Это точно сейчас вот с этим воюю, так как изначально чёрти что понаделал.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Feb 17 2014, 16:36
Сообщение #6


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(_Pasha @ Feb 14 2014, 08:57) *
Код с етим WIZCHIP не зависит от конкретной платы. А это даёт такой профит: например, его можно собрать в либу и больше не тратить времени на перекомпиляцию. Разумеется, в мелких проектах сие значения не имеет, но правильность подхода придает уверенность, что оно может работать и в составе более сложных систем без изменений. Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит.



если вызываемая функция в том же модуле и описана как static - то ни насколько.


Все это можно было бы достичь и без таких извращений. Виртуальные функции на С, это все-таки ужасный изврат.

Какая связь между независимыми модулями, и этим кодом?
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 3 2014, 09:31
Сообщение #7


Универсальный солдатик
******

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



Что такое callback функция? И в Википедии читал, и все равно не понимаю. Функция, вызываемая по указателю на нее? Функция, вызывающая функцию, указатель на которую передан в параметрах? Кто бы определил ясно и четко. Вижу, этим термином злоупотребляют, где ни попадя.
В чем преимущество по сравнению с "функцией, вызываемой из функции"?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 3 2014, 09:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ May 3 2014, 13:31) *
Что такое callback функция?

Это функция, вызываемая по событию. Способ вызова значения не имеет.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 3 2014, 10:07
Сообщение #9


Универсальный солдатик
******

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



Цитата(aaarrr @ May 3 2014, 12:54) *
Это функция, вызываемая по событию. Способ вызова значения не имеет.

http://ru.wikipedia.org/wiki/Callback_(%D0...BD%D0%B8%D0%B5)
Тут трошачки не так написано. Ваше определение - как частный случай.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 3 2014, 10:29
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



"передача исполняемого кода в качестве одного из параметров другого кода"
Да уж, отличное определение. Исполняемый код обычно никуда не передается, "параметр кода" - это тоже что-то заоблачное.

Хорошо, напишем так: это функция, вызываемая по событию, и заранее не определенная для вызывающего её (условно "библиотечного") кода.
Go to the top of the page
 
+Quote Post
doom13
сообщение May 3 2014, 10:41
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 3 2014, 10:46
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Callback функции часто встречаются в API библиотеках инициализации и конфигурирования микроконтроллера и его периферии, для указания вызова функции (callback) из прерывания (чаще всего), например настраивается (инициализируется) условие внешнего прерывания IO pin и тут же указывается callback, при этом программист даже не задумывается по какому вектору будет происходить вызов функции обработки прерывания, из которой уже будет произведен запуск callback.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 3 2014, 10:50
Сообщение #13


Универсальный солдатик
******

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



Цитата(aaarrr @ May 3 2014, 13:29) *
Хорошо, напишем так: это функция, вызываемая по событию, и заранее не определенная для вызывающего её (условно "библиотечного") кода.

В том и дело, что по Википедии получается, не обязательно по событию, а просто в качестве параметра функции. Или это принципиальное свойство?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 3 2014, 11:08
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ May 3 2014, 14:50) *
В том и дело, что по Википедии получается, не обязательно по событию, а просто в качестве параметра функции. Или это принципиальное свойство?

Ну, любая функция так или иначе вызывается по событию sm.gif
Принципиальное свойство - параметризуемость вызываемого объекта (не обязательно передача именно как параметра функции, т.к. это может быть отдельная структура и т.п).

Вещь простая, но дать краткое и исчерпывающее определение, не опускаясь при этом в частности, трудно.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение May 3 2014, 19:47
Сообщение #15


Знающий
****

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



Цитата(ViKo @ May 3 2014, 05:50) *
В том и дело, что по Википедии получается, не обязательно по событию, а просто в качестве параметра функции. Или это принципиальное свойство?

Не знаю то там в википедии, но смысл именно чтобы по какомуто событию передать данные обратно.
Асинхронно! Именно это и имеют ввиду "callback". Когда он "обратно позвонит" неизвестно.
Ждать нам некогда. Поэтому вот финкция и "будут деньги - звони, а мне некогда"


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016