Полная версия этой страницы:
Указатели на функции
Добрый день уважаемые!
У меня сложилась такая ситуация, жил я себе спокойно, программировал 8 битные авр МК, потом перешёл на МСП и стал разбираться с ИАРом и углубляться в язык С, до недавно я на любительском уровне, что-то делал, паял...но захотелось выжимать максимум из языка С и ИАра, изучить их по детальнее...так вот начал я с языка С, узнал, что есть такое понятие как указатели на функции...почитал, ну вроде разобрался...а теперь вот думаю как бы их можно было использовать, разумеется эффективно )...К примеру я пишу программу на какой-нибудь прибор - регулятор температуры...где скажем мне у алгоритме указатели на функции понадобятся или они всё же эффективно используюся только для написания меню...За раннее благодарен.
Также хотел бы уточнить ещё одну вещь, в ИАРе есть тип памяти data16 и data20. Выходит они отличаются разным диапазоном адресов 64кБ(0xFFFF) и 1МБ(0xFFFFF) и соответственно размером указателей (16 и 32 бита).Тип памяти, который я буду использовать завит от железа? Если я объявляю переменную, она буде по умолчанию типа data16? И зачем предвидено эти 2 типа памяти, как я могу использовать data20 для своих удобств?
rezident
Nov 29 2010, 21:02
Указатели на функции требуются в основном только там, где сами вызываемые функции должны быть разные при унифицированном обработчике их вызовов. Кроме UI (пользовательский интерфейс/меню) и планировщика ОС такая ситуация может быть возможна, например, при написании функции разбора запроса какого-нибудь сетевого протокола. Сам запрос обрабатывается единообразно, но в зависимости от типа запрошенных данных эти данные могут располагаться где угодно, не обязательно в ОЗУ МК, но и, например, во внешней Flash, SDCard или в другом устройстве, подключенном к данному коммуникационному МК.
Понятно, спасибо, просто хочется применить на практике прочитанный материал )
А по поводу дата16 и 20 я уже понял, внимательно прочитал даташит, просто есть ядро 430X, в котором есть дополнительные инструкции и большее пространство памяти 1МБ.
rezident
Nov 29 2010, 22:19
Цитата(Twen @ Nov 30 2010, 02:14)

А по поводу дата16 и 20 я уже понял, внимательно прочитал даташит, просто есть ядро 430X, в котором есть дополнительные инструкции и большее пространство памяти 1МБ.
Да, верно. Если вы работаете с функциями, расположенными в пределах Flash 64кБ (размер исходника не превышает) и/или с функциями расположенными в RAM, то можете просто не заморачиваться с data20. Доп. команды компилятор использовать не будет.
Dog Pawlowa
Nov 30 2010, 11:20
Цитата(rezident @ Nov 30 2010, 01:02)

Указатели на функции требуются в основном только там...
Позволю себе не согласиться.
Я широко использую для организации автомата состояний вместо switch.
Хотя современные компиляторы и могут заоптимизировать switch в массив функций, все ж функции нагляднее получаются, да и средствами препроцессора проще править состояния.
rezident
Nov 30 2010, 20:35
Цитата(Dog Pawlowa @ Nov 30 2010, 16:20)

Позволю себе не согласиться.
Я широко использую для организации автомата состояний вместо switch.
Ну и как это противоречит моему обрезанному вами в цитате полному предложению? Считайте switch как "унифицированный обработчик вызовов". Теперь возражения есть?
Dog Pawlowa
Dec 1 2010, 03:02
Цитата(rezident @ Nov 30 2010, 23:35)

Теперь возражения есть?

Теперь нет, видимо, что-то не сработало сразу в моей голове при чтении Вашего текста
Цитата(rezident @ Dec 1 2010, 00:35)

Считайте switch как "унифицированный обработчик вызовов". Теперь возражения есть?

Самое главное - что история полемики по switch() уже лет 20 тянется, а оптимизаций "без сюрпризов" так и нету. Именно поэтому в ГЦЦ использую известную как "labels as values" фичу, для устранения неоднозначностей толкования.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.