Как определить источник констант в библиотеках?

library samd21g constants

Преамбула:

Я пытаюсь понять, как программировать и использовать таймеры в 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"

Ничего не дало. Прошу прощения, если это наивный вопрос, но я не смог найти простого, очевидного ответа. На самом деле, я не смог найти никакого ответа.

, 👍2

Обсуждение

В Eclipse я использую «перейти к определению» с помощью клавиши F3, @Juraj


2 ответа


Лучший ответ:

1

Имя TC_CTRLA_PRESCALER_DIV1 указывает, что это макрос. Хитрость для быстрого нахождения точного местоположения определения макроса:

  1. Файл > Настройки > Предупреждения компилятора > Все > ОК
  2. В своем скетче добавьте директиву #define для имени макроса, которая определенно изменяет определение:

    #define TC_CTRLA_PRESCALER_DIV1 foobar
    
  3. Набросок > Проверка/Компиляция

  4. После завершения компиляции проверьте вывод компилятора в черном консольном окне в нижней части окна 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


1

Во-первых, определения этих констант не скажут вам многого. Они просто представляют регистры и биты, используемые в техническом описании микроконтроллера.

Если вы хотите найти их определения, попробуйте поискать в ~/.arduino15/.

,