pico-platform
为 RP2 系列设备/架构提供针对底层编译器/平台特定内容的通用抽象的宏、定义(以及在非汇编代码中包含时的函数)。
详细描述
用于访问 CPU 寄存器的宏和定义。
此头文件可被汇编代码包含。
此头文件可被汇编代码包含。
宏
#define __fast_mul(a, b) (__builtin_constant_p(b) && !__builtin_constant_p(a) && __builtin_popcount(b) >= 2 ? __mul_instruction(a,b) : (a)*(b))#define __isr#define __force_inline __always_inline#define count_of(a) (sizeof(a)/sizeof\((a)[0]))#define [MAX](a, b) \((a)>(b)?(a):(b))#define [MIN](a, b) \((b)>(a)?(a):(b))#define __check_type_compatible(type_a, type_b) _Static_assert(__builtin_types_compatible_p (type_a, type_b), __STRING(type_a) " is not compatible with " __STRING(type_b));#define __after_data(group) __attribute__\((section(".after_data." group)))#define __in_ram(group) __attribute__\((section(".time_critical." group)))#define __in_scratch_x(group) __attribute__\((section(".scratch_x." group)))#define __scratch_x(group) __in_scratch_x(group)#define __in_scratch_y(group) __attribute__\((section(".scratch_y." group)))#define __scratch_y(group) __in_scratch_y(group)#define __in_psram(group) __attribute__\((section(".psram_initialised." group)))#define __uninitialized_psram(group) __attribute__\((section(".psram_uninitialised." group)))#define __in_xip_ram(group) __attribute__\((section(".xip_ram." group)))#define __uninitialized_ram(group) __attribute__\((section(".uninitialized_data." #group))) group#define __in_flash(group) __attribute__\((section(".flashdata." group)))#define __persistent_data(name) __attribute__\((section(".persistent_data." #name))) name#define __not_in_flash(group) PICO_NOT_IN_FLASH_PLACEMENT(group)#define __not_in_flash_func(func_name) __not_in_flash (__STRING(func_name)) func_name#define __time_critical_func(func_name) __noinline PICO_TIME_CRITICAL_PLACEMENT (__STRING(func_name)) func_name#define __no_inline_not_in_flash_func(func_name) __noinline__not_in_flash_func(func_name)
函数
static void busy_wait_at_least_cycles (uint32_t minimum_cycles): 忙等待至少给定数量的时钟周期的辅助方法。static __force_inline void __breakpoint (void)
执行断点指令。
static __force_inline uint get_core_num (void)
获取当前核心编号。
static __force_inline uint __get_current_exception (void)
获取此核心上当前的异常级别。
static __force_inline bool pico_processor_state_is_nonsecure (void) RP2350
如果当前在 NonSecure 状态下执行则返回 true(仅 Arm)。
uint8_t rp2350_chip_version (void) RP2350
返回 RP2350 芯片版本号。
static uint8_t rp2040_chip_version (void) RP2350
为兼容性返回 RP2040 芯片版本号。
static uint8_t rp2350_rom_version (void)RP2350: 返回 RP2350 ROM 版本号。static __force_inline int32_t __mul_instruction (int32_t a, int32_t b)
使用汇编MUL指令将两个整数相乘。
static __force_inline void tight_loop_contents (void)
用于紧密循环体的空操作函数。
static __always_inline void __compiler_memory_barrier (void)
确保编译器不会将内存访问移过此方法调用。
void panic_unsupported (void): 以"Unsupported"消息触发 panic。void panic (const char *fmt,...)
显示 panic 消息并停止执行。
宏定义文档
__fast_mul
#define __fast_mul(a, b) (__builtin_constant_p(b) && !__builtin_constant_p(a) && __builtin_popcount(b) >= 2 ? __mul_instruction(a,b) : (a)*(b))
使用最快方式将两个整数值相乘。
高效地将值 a 与可能为常量的值 b 相乘。
如果 b 是已知常量且非零或非 2 的幂次,则使用 mul 指令而非 gcc 默认的移位和加法组合(后者通常较慢)。如果 b 是 2 的幂次,则显然优先使用单次移位。
参数
a: 第一个操作数b: 第二个操作数
返回
a * b
__isr
#define __isr
中断处理函数的标记。
例如,名为 my_interrupt_handler 的 IRQ 处理函数:
void __isr my_interrupt_handler(void) {
__force_inline
#define __force_inline __always_inline
强制内联函数(无论优化级别)的属性。
例如,此处的 my_function 将始终被内联:
int __force_inline my_function(int x) {
count_of
#define count_of(a) (sizeof(a)/sizeof\((a)[0]))
用于确定数组元素数量的宏。
MAX
#define MAX(a, b) \((a)>(b)?(a):(b))
返回两个可比较值中较大值的宏。
MIN
#define MIN(a, b) \((b)>(a)?(a):(b))
返回两个可比较值中较小值的宏。
__check_type_compatible
#define __check_type_compatible(type_a, type_b) _Static_assert(__builtin_types_compatible_p (type_a, type_b), __STRING(type_a) " is not compatible with " __STRING(type_b));
用于断言两个类型等价的工具宏。
此宏可在其他宏中与 typeof 配合使用,断言两个参数的类型等价(或单个参数为预期类型)。
__after_data
#define __after_data(group) __attribute__\((section(".after_data." group)))
用于在 .data 节之后的 RAM 中放置数据的节属性宏。
例如,一个放置在 .data 节之后的 400 元素 uint32_t 数组:
uint32_t __after_data("my_group_name") a_big_array[400];
节属性为 .after_data.<group>。
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__in_ram
#define __in_ram(group) __attribute__\((section(".time_critical." group)))
用于在 RAM 中放置的节属性宏。
节属性为 .time_critical.<group>,用于保持与旧链接器脚本的兼容性。
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__in_scratch_x
#define __in_scratch_x(group) __attribute__\((section(".scratch_x." group)))
用于在倒数第二个 SRAM bank(称为"scratch X")中放置数据的节属性宏。
Scratch X 通常用于仅被一个核心访问的关键数据和函数(当只有一个核心访问该 RAM bank 时,不存在停顿机会)。
例如,一个放置在"scratch X"中的 uint32_t 变量:
uint32_t __in_scratch_x("my_group_name") foo = 23;
节属性为 .scratch_x.<group>。
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__scratch_x
#define __scratch_x(group) __in_scratch_x(group)
用于在倒数第二个 SRAM bank(称为"scratch X")中放置数 据的节属性宏。
__in_scratch_x 的别名。
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__in_scratch_y
#define __in_scratch_y(group) __attribute__\((section(".scratch_y." group)))
用于在最后一个 SRAM bank(称为"scratch Y")中放置数据的节属性宏。
Scratch Y 通常用于仅被一个核心访问的关键数据和函数(当只有一个核心访问该 RAM bank 时,不存在停顿机会)。
例如,一个放置在"scratch Y"中的 uint32_t 变量:
uint32_t __in_scratch_y("my_group_name") foo = 23;
节属性为 .scratch_y.<group>。
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__scratch_y
#define __scratch_y(group) __in_scratch_y(group)
用于在最后一个 SRAM bank(称为"scratch Y")中放置数据的节属性宏。
__in_scratch_y 的别名。
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__in_psram
#define __in_psram(group) __attribute__\((section(".psram_initialised." group)))
用于在 PSRAM 中放置的节属性宏。
PSRAM 通常用于额外的数据节。可以将数据放置在已初始化或未初始化的 PSRAM 中,具体取决于数据如何加载到 PSRAM 中。
例如,一个放置在 PSRAM 中的 uint32_t 变量:
uint32_t __in_psram("my_group_name") foo = 23;
或放置在未初始化的 PSRAM 中:
uint32_t __uninitialized_psram("my_group_name") foo;
节属性为 .psram_initialised.<group> 或 .psram_uninitialised.<group>
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__uninitialized_psram
#define __uninitialized_psram(group) __attribute__\((section(".psram_uninitialised." group)))
用于在未初始化 PSRAM 中放置的节属性宏。
用于未初始化数据的 __in_psram 版本。
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__in_xip_ram
#define __in_xip_ram(group) __attribute__\((section(".xip_ram." group)))
用于在 XIP SRAM 中放置的节属性宏。
XIP 缓存可用作额外数据节的 SRAM,但如果您的二进制文件从 Flash 运行(例如默认二进制类型),则会产生性能损失。
例如,一个放置在 XIP SRAM 中的 uint32_t 变量:
uint32_t __in_xip_ram("my_group_name") foo = 23;
节属性为 .xip_ram.<group>
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__uninitialized_ram
#define __uninitialized_ram(group) __attribute__\((section(".uninitialized_data." #group))) group
用于标记不需要初始化的数据的节属性宏。
以此方式标记的数据在复位后将保留其值(通常,未初始化数据——在 .bss 节中——在运行时初始化期间会被清零)。
例如,一个在程序因复位重启后仍保留其值的 uint32_t foo:
uint32_t __uninitialized_ram(foo);
节属性为 .uninitialized_data.<group>。
参数
group: 用于区分可被链接器独立垃圾回收的组的节名后缀字符串
__in_flash
#define __in_flash(group) __attribute__\((section(".flashdata." group)))