Как определить источник констант в библиотеках?
Преамбула:
Я пытаюсь понять, как программировать и использовать таймеры в Feather M0 с помощью Arduino IDE. Я видел несколько опубликованных примеров, но я не из тех, кто просто слепо копирует какой-то код и ожидает, что он работа. Проблема, с которой я столкнулся (и, похоже, она вездесуща в Arduino), заключается в том, что, похоже, нет концепции зависимостей. Чтобы ссылаться на константы, их нужно где-то определить.
Вопрос:
Как мне найти источник определения констант, на которые люди постоянно ссылаются в своем коде? Например, в этом коде пример таймера Arduino Zero, M0, среди других констант есть ссылка на TC_CTRLA_PRESCALER_DIV1
. Где определена эта константа?
Усилия:
Я искал эти константы в целом и в частности. Но, как вы можете себе представить, в C трудно найти фактический источник, а не просто ссылку на константу.
Я также пробовал искать в установленной среде Arduino IDE с установленными библиотеками SAMD и Adafruit SAMD. Например
~/Arduino$ grep -r --include=*.h --include=*.cpp "TC.*_PRESCALER_DIV"
Ничего не дало. Прошу прощения, если это наивный вопрос, но я не смог найти простого, очевидного ответа. На самом деле, я не смог найти никакого ответа.
@BE-Bob, 👍2
Обсуждение2 ответа
Лучший ответ:
Имя TC_CTRLA_PRESCALER_DIV1
указывает, что это макрос. Хитрость для быстрого нахождения точного местоположения определения макроса:
- Файл > Настройки > Предупреждения компилятора > Все > ОК
В своем скетче добавьте директиву
#define
для имени макроса, которая определенно изменяет определение:#define TC_CTRLA_PRESCALER_DIV1 foobar
Набросок > Проверка/Компиляция
- После завершения компиляции проверьте вывод компилятора в черном консольном окне в нижней части окна Arduino IDE (вам нужно будет прокрутить вверх, чтобы увидеть все) на предмет предупреждения "переопределено". В предупреждении будет указан путь к исходному определению:
C:\Users\per\AppData\Local\Temp\arduino_modified_sketch_804921\sketch_aug05a.ino:1:0: warning: "TC_CTRLA_PRESCALER_DIV1" redefined [enabled by default]
#define TC_CTRLA_PRESCALER_DIV1 foobar
^
In file included from C:\Users\per\AppData\Local\Arduino15\packages\arduino\tools\CMSIS-Atmel\1.1.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:268:0,
from C:\Users\per\AppData\Local\Arduino15\packages\arduino\tools\CMSIS-Atmel\1.1.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69,
from C:\Users\per\AppData\Local\Arduino15\packages\arduino\tools\CMSIS-Atmel\1.1.0/CMSIS/Device/ATMEL/samd.h:105,
from C:\Users\per\AppData\Local\Arduino15\packages\arduino\tools\CMSIS-Atmel\1.1.0/CMSIS/Device/ATMEL/sam.h:470,
from C:\Users\per\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.19\cores\arduino/Arduino.h:48,
from C:\Users\per\AppData\Local\Temp\arduino_build_309126\sketch\sketch_aug05a.ino.cpp:1:
C:\Users\per\AppData\Local\Arduino15\packages\arduino\tools\CMSIS-Atmel\1.1.0/CMSIS/Device/ATMEL/samd21/include/component/tc.h:113:0: note: this is the location of the previous definition
#define TC_CTRLA_PRESCALER_DIV1 (TC_CTRLA_PRESCALER_DIV1_Val << TC_CTRLA_PRESCALER_Pos)
^
в Eclipse сочетание клавиш F3 открывает исходный код определения значения. end если это переопределение некоторого макроса более низкого уровня, я углубляюсь с помощью следующего F3. И значение макроса также отображается в подсказке. И то же самое для функций., @Juraj
Во-первых, определения этих констант не скажут вам многого. Они просто представляют регистры и биты, используемые в техническом описании микроконтроллера.
Если вы хотите найти их определения, попробуйте поискать в ~/.arduino15/
.
- Создание массива с длиной, полученной из библиотеки
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
- Wire.h не найден!
- Почему выходит ошибка: invalid conversion from 'const char*' to 'char' [-fpermissive]??
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
В Eclipse я использую «перейти к определению» с помощью клавиши F3, @Juraj