Указатели функций, которые вызывают одну функцию
Я читаю файл библиотеки timer.h
для основной библиотеки STM, которую я только что установил в аппаратную папку Arduino.
Конечно, у меня как у новичка должно быть много вопросов о многих подходах/стратегиях, которыми руководствуются программисты при написании кода.
Во-первых, вызов функции с помощью указателя функции вызывает только одну функцию, но разница в том, что указатель функции объявляется/определяется как встроенная функция.
Редактировать: я удалил код и разместил ссылку на него в github.
заголовочный файл stm32/timer
Хорошо, часть, о которой я начал думать, начинается со строки 595.
Это объявления функций.
В строке 598 это объявление функции, которая получает указатель на функцию.
В последующих строках, начиная со строки 634, эти функции должны выполняться только в одной строке. Итак, мой вопрос: зачем разрабатывать функцию для выполнения только одной строки?
Почему они не поместили эту строку напрямую, а не внутри функции?
@R1S8K, 👍0
Обсуждение1 ответ
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
- Разница между (*(volatile unsigned int *) и (volatile unsigned int)?
- Передача массивов, глобальных массивов внутри функций, указателей и объявление размеров массивов.
- Запуск нескольких функций с различной структурой аргумента/возврата по одному указателю функции
- Как работают массивы?
- Можно ли создать массив для функций?
- Ошибка получения адреса временного массива при передаче массива составных литералов
- Вызов логической функции с вводом указателя символа - не понимаю, как получить обновленное значение указателя
- Как получить исходные файлы для библиотек Arduino?
Не могли бы вы скинуть ссылку на полный файл?, @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