pico-sdk(八)-程序架构之自定义预处理变量
pico-sdk(八)-程序架构之自定义预处理变量
- Board 配置文件中的预处理变量
- CMake 中的预处理变量
SDK可以使用编译时定义来配置库的行为和功能,能够对那些不太可能在运行时更改的配置(例如物理引脚)进行设置。这样做可以生成更小、更高效的代码,能够避免额外的运行时开销且不会包含实际上不会使用的配置代码(例如,当仅需要使用I2S1时,却不得不包含了PWM音频支持)!
由于使用了INTERFACE库,导致所有的应用程序在构建时会将依赖的库的源代码进行构建,因此,对于同一应用程序,可以构建具有不同内置行为的多个版本。
预处理器变量可以通过多种方式指定,具体内容将在以下各节中描述。
是否支持编译时配置或运行时配置或两者兼有,取决于特定库本身。然而,一般的理念是允许在用户未指定任何设置(超出板级配置提供的设置之外)的情况下实现合理的默认行为。
Board 配置文件中的预处理变量
许多常见的配置设置与实际所使用的特定RP系列微控制器板有关,包括各种SDK库的默认引脚设置。可以通过PICO_BOARD
CMake变量来指定使用的板子型号,该变量可以通过CMake命令行或环境变量设置。
板子配置提供了一个头文件,如果未另行指定,则该头文件指定了默认值;例如,pico.h 头文件中指定了这些默认设置。
#ifndef PICO_DEFAULT_LED_PIN
#define PICO_DEFAULT_LED_PIN 25
#endif
通过设置 PICO_BOARD=my_board_name
,头文件 my_board_name.h
将被所有其他SDK头文件包含。这样开发人员就可以创建自己的板子头文件。
CMake 中的预处理变量
可以通过修改应用程序的 CMakeListst.txt
中的 target_compile_definitions
来指定使用一组不同的 UART2 引脚。
修改后的hello_world CMakeLists.txt指定了不同的UART引脚。
add_executable(hello_world
hello_world.c
)
# SPECIFY two preprocessor definitions for the target hello_world
target_compile_definitions(hello_world PRIVATE
PICO_DEFAULT_UART_TX_PIN=16
PICO_DEFAULT_UART_RX_PIN=17
)
# Pull in our pico_stdlib which aggregates commonly used features
target_link_libraries(hello_world pico_stdlib)
# create map/bin/hex/uf2 file etc.
pico_add_extra_outputs(hello_world)
target_compile_definitions
设置了预处理器定义,这些定义将传递给目标 hello_world
中的每个源文件的编译器(正如前面提到的,这包括所有依赖的INTERFACE库的所有源文件)。PRIVATE
3 是由CMake要求用来指定编译定义作用范围的。请注意,SDK使用的所有预处理器定义都有一个 PICO_
前缀。
I2S(Inter-IC Sound)是一种数字音频接口标准,用于集成电路之间的音频数据传输。它由Philips Semiconductors(现在的NXP Semiconductors)开发,并于1986年首次推出。I2S设计的初衷是为了简化音频设备之间的连接,尤其是在消费电子领域,如CD播放机、数字音频处理器、DAC(数模转换器)和ADC(模数转换器)等设备之间。 ↩︎
UART(Universal Asynchronous Receiver-Transmitter)是一种常见的串行通信协议,用于在两个设备之间进行异步数据传输。UART广泛应用于嵌入式系统、计算机硬件、传感器网络和其他电子设备中,因为它简单且可靠。 ↩︎
PRIVATE
是target_compile_definitions
命令中的一个作用域关键字,它决定了编译定义的作用范围。具体来说,PRIVATE
关键字表示这些编译定义仅对当前目标有效,不会传递给依赖该目标的其他目标。 ↩︎