当前位置: 首页 > article >正文

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库的所有源文件)。PRIVATE3 是由CMake要求用来指定编译定义作用范围的。请注意,SDK使用的所有预处理器定义都有一个 PICO_ 前缀。


  1. I2S(Inter-IC Sound)是一种数字音频接口标准,用于集成电路之间的音频数据传输。它由Philips Semiconductors(现在的NXP Semiconductors)开发,并于1986年首次推出。I2S设计的初衷是为了简化音频设备之间的连接,尤其是在消费电子领域,如CD播放机、数字音频处理器、DAC(数模转换器)和ADC(模数转换器)等设备之间。 ↩︎

  2. UART(Universal Asynchronous Receiver-Transmitter)是一种常见的串行通信协议,用于在两个设备之间进行异步数据传输。UART广泛应用于嵌入式系统、计算机硬件、传感器网络和其他电子设备中,因为它简单且可靠。 ↩︎

  3. PRIVATEtarget_compile_definitions 命令中的一个作用域关键字,它决定了编译定义的作用范围。具体来说,PRIVATE 关键字表示这些编译定义仅对当前目标有效,不会传递给依赖该目标的其他目标。 ↩︎


http://www.kler.cn/a/414976.html

相关文章:

  • opengl 三角形
  • 开发需求总结19-vue 根据后端返回一年的数据,过滤出符合条件数据
  • Python编程实例-实现环形缓冲(Ring Buffer)
  • Lerna管理和发布同一源码仓库的多个js/ts包
  • FPGA实现GTP光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供3套工程源码和技术支持
  • 如何让控件始终处于父容器的居中位置(父容器可任意改变大小)
  • 【opencv-python】的cv2.imdecode()与cv2.imencode()
  • 力扣--LCR 148.验证图书取出顺序
  • 二维码有哪些网络安全风险隐患?
  • 【C语言篇】探索 C 语言结构体:从基础语法到数据组织的初体验
  • 力扣,88. 合并两个有序数组
  • [2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(1))
  • 项目整合logback日志打印线程id
  • GraphRAG访问模式和知识图谱建模
  • HarmonyOS-初级(一)
  • 【ANC系统】主动噪声控制系统结构分类
  • 前端——自定义组件
  • ubuntu防火墙入门(一)——设置服务、关闭端口
  • 重塑视频新语言,让每一帧都焕发新生——Video-Retalking,开启数字人沉浸式交流新纪元!
  • elasticsearch的索引模版使用方法
  • C#中面试的常见问题002
  • 将WPS的PPT 无损的用微软的PowerPoint打开
  • 基于Linux的repmgr搭建
  • golang 实现比特币内核:transaction 结构中输入和输出两部分的一些说明
  • iOS 系统中使用 webView 打印 html 的打印边距问题
  • 【C51】单片机与LED数码管的动态显示接口案例分析