Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Указатели на функции
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Twen
Добрый день уважаемые!
У меня сложилась такая ситуация, жил я себе спокойно, программировал 8 битные авр МК, потом перешёл на МСП и стал разбираться с ИАРом и углубляться в язык С, до недавно я на любительском уровне, что-то делал, паял...но захотелось выжимать максимум из языка С и ИАра, изучить их по детальнее...так вот начал я с языка С, узнал, что есть такое понятие как указатели на функции...почитал, ну вроде разобрался...а теперь вот думаю как бы их можно было использовать, разумеется эффективно )...К примеру я пишу программу на какой-нибудь прибор - регулятор температуры...где скажем мне у алгоритме указатели на функции понадобятся или они всё же эффективно используюся только для написания меню...За раннее благодарен.

Также хотел бы уточнить ещё одну вещь, в ИАРе есть тип памяти data16 и data20. Выходит они отличаются разным диапазоном адресов 64кБ(0xFFFF) и 1МБ(0xFFFFF) и соответственно размером указателей (16 и 32 бита).Тип памяти, который я буду использовать завит от железа? Если я объявляю переменную, она буде по умолчанию типа data16? И зачем предвидено эти 2 типа памяти, как я могу использовать data20 для своих удобств?
rezident
Указатели на функции требуются в основном только там, где сами вызываемые функции должны быть разные при унифицированном обработчике их вызовов. Кроме UI (пользовательский интерфейс/меню) и планировщика ОС такая ситуация может быть возможна, например, при написании функции разбора запроса какого-нибудь сетевого протокола. Сам запрос обрабатывается единообразно, но в зависимости от типа запрошенных данных эти данные могут располагаться где угодно, не обязательно в ОЗУ МК, но и, например, во внешней Flash, SDCard или в другом устройстве, подключенном к данному коммуникационному МК.
Twen
Понятно, спасибо, просто хочется применить на практике прочитанный материал )

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

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

Теперь нет, видимо, что-то не сработало сразу в моей голове при чтении Вашего текста wink.gif
_Pasha
Цитата(rezident @ Dec 1 2010, 00:35) *
Считайте switch как "унифицированный обработчик вызовов". Теперь возражения есть? rolleyes.gif

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