Указатели функций, которые вызывают одну функцию

Я читаю файл библиотеки timer.h для основной библиотеки STM, которую я только что установил в аппаратную папку Arduino.

Конечно, у меня как у новичка должно быть много вопросов о многих подходах/стратегиях, которыми руководствуются программисты при написании кода.

Во-первых, вызов функции с помощью указателя функции вызывает только одну функцию, но разница в том, что указатель функции объявляется/определяется как встроенная функция.


Редактировать: я удалил код и разместил ссылку на него в github.

заголовочный файл stm32/timer

Хорошо, часть, о которой я начал думать, начинается со строки 595.

Это объявления функций.

В строке 598 это объявление функции, которая получает указатель на функцию.

В последующих строках, начиная со строки 634, эти функции должны выполняться только в одной строке. Итак, мой вопрос: зачем разрабатывать функцию для выполнения только одной строки?

Почему они не поместили эту строку напрямую, а не внутри функции?

, 👍0

Обсуждение

Не могли бы вы скинуть ссылку на полный файл?, @Edgar Bonet

Где именно здесь находится указатель на функцию, которая вызывается? Я думаю, что bb_perip — это не указатель на функцию, а функция, которая возвращает указатель на переменную. Хотя я не могу быть уверен только из этого фрагмента кода, @chrisl

...\Program_Files\Arduino\hardware\Arduino_STM32-master\STM32F1\system\libmaple\include\libmaple, например, в зависимости от расположения корневого файла на моем компьютере., @R1S8K

Я разместил, как и большинство встроенных функций. Не удалось опубликовать полный код, который намного превышает ограничения символов более 30000 символов., @R1S8K

Опять же, я не вижу, чтобы здесь использовался указатель на функцию. Пожалуйста, укажите нам, где именно вы видите проблему. Также не могли бы вы дать ссылку на используемое вами ядро STM32, чтобы мы могли прочитать этот файл в Интернете. У меня лично не установлено ядро STM32, также мы не знаем, какое ядро вы использовали. В лучшем случае это будет ссылка на github с рассматриваемым файлом., @chrisl

Хорошо, я добавил информацию в основной пост. Мне так проще, но я не знаю, что лучше добавить сюда нужную информацию или отредактировать основной пост?, @R1S8K

@ R1S8K - Пожалуйста, отредактируйте вопрос и добавьте в него новую информацию., @VE7JRO


1 ответ


2

bb_perip — это функция, которая возвращает указатель на бит из регистра, связанного с определенным периферийным устройством таймера (их несколько). Затем этот указатель разыменовывается с помощью оператора * для создания *bb_perip(...).

То, что возвращает bb_perip, зависит от того, какой таймер вы используете и какое значение вас интересует.

bb_perip не является указателем на функцию, это обычная функция, которая возвращает указатель.

,

Что-то новое для меня заключается в том, что этой функции передается целое число! Впервые сталкиваюсь с этой функцией. *bb_perip(&(dev->regs).bas->CR1, TIMER_CR1_CEN_BIT) = 0; этой функции передается 0, как это сделать?, @R1S8K

Нет, целое число не передается в функцию. Целое число присваивается разыменованному указателю, возвращаемому функцией., @Majenko

оооо, извините за ошибку, я хотел сказать «назначено», а не «сдано» :) совершенно разные подходы. Да, я имел в виду, что для меня это новая возможность назначать что-либо функции., @R1S8K

Или потому, что это указатель на функцию, где указатель в основном является переменной, поэтому я могу присвоить ему значение. это верно ?, @R1S8K

Вы *ничего* не назначаете функции. Функция возвращает указатель на место в памяти. Вы берете этот указатель, а затем используете его для помещения значения в память по этому адресу. Как только функция вернула указатель, она больше не играет никакой роли. Вы можете с тем же успехом использовать (в псевдокоде) *func() = 4, что и pointer = func(); *pointer = 4; - все, что вы делаете, это исключаете посредника., @Majenko

Ах да, теперь я понимаю, что они поставили 0, потому что роль функции - приостановить таймер. static inline void timer_pause(timer_dev *dev) { *bb_perip(&(dev->regs).bas->CR1, TIMER_CR1_CEN_BIT) = 0; } , @R1S8K