pico-sdk(八)-程序架构之自定义预处理变量

embedded/2024/11/29 20:27:39/

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_worldhello_world.c
)
# SPECIFY two preprocessor definitions for the target hello_world
target_compile_definitions(hello_world PRIVATEPICO_DEFAULT_UART_TX_PIN=16PICO_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.ppmy.cn/embedded/141568.html

相关文章

python-解决一元一次方程

【题目】解决一元一次方程数学问题 【问题描述】 我们要解决一个较为复杂的一元一次方程数学问题,方程形如:ax b c,其中a、b、c为已知常数,x为未知数。 现在我们要通过编程的方式解决这个问题,即找到方程的解x。 【…

linux一键部署apache脚本

分享一下自己制作的一键部署apache脚本: 脚本已和当前文章绑定,请移步下载(免费!免费!免费!) (单纯的分享!) 步骤: 将文件/内容上传到终端中 …

python代码示例(读取excel文件,自动播放音频)

目录 python 操作excel 表结构 安装第三方库 代码 自动播放音频 介绍 安装第三方库 代码 python 操作excel 表结构 求出100班同学的平均分 安装第三方库 因为这里的表结构是.xlsx文件,需要使用openpyxl库 如果是.xls格式文件,需要使用xlrd库 pip install openpyxl /…

Ubuntu EFI分区扩容

1.扩容原因 Ubuntu安装时默认将EFI设置为单独分区,原来EFI分区分配容量为100M,在经历一次BIOS和Firmware更新之后,占用量达到了70多M,所以选择扩容。 2.扩容踩坑 我的操作: 将Gparted工具制作为启动盘,…

力扣—912. 排序数组

912. 排序数组 题目: 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例: 示例 1: 输入:nums …

【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

w056基于web的教学资源库

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件&#xff0…

观察者模式和发布订阅模式

文章目录 手写观察者模式手写发布订阅模式 观察者模式 Subject 和 Observer 直接绑定,中间无媒介。如点击事件,事件直接和按钮进行绑定。 发布订阅模式 Publisher 和 Observer 相互不认识,中间有媒介。如在 A 组件中绑定一个事件&#xff…