You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C程序中查询Raspberry Pi Pico的可用RAM容量

Raspberry Pi Pico C程序查询可用RAM方案(排除malloc尝试分配方式)

以下方法均基于Pico SDK默认内存布局实现,无需额外依赖第三方库:

方法1:通过链接脚本导出符号计算总空闲RAM

Pico SDK的链接脚本默认导出了内存分段的边界符号,直接声明为外部变量后取地址即可获取分段地址,无需调用任何内存分配相关函数,适合未使用动态内存分配的场景:

  • __bss_end__:bss段结束地址,也是静态分配内存的最高地址、堆的默认起始地址
  • __StackLimit:栈的最低允许地址(Pico栈采用从高地址向低地址增长的方式)

示例代码:

#include <stdint.h>

// 声明链接脚本导出的符号,需取地址获取实际内存地址
extern uint32_t __bss_end__;
extern uint32_t __StackLimit;

uint32_t get_total_free_ram(void) {
    return (uint32_t)&__StackLimit - (uint32_t)&__bss_end__;
}

返回值为当前未被静态分配的总内存大小,也就是堆和栈可共用的总空闲空间。

方法2:通过mallinfo查询堆空闲内存

如果项目使用了动态内存分配,可以调用newlib库提供的mallinfo()函数读取堆管理结构体,该操作仅读取已有的堆管理数据,不会触发内存分配,符合排除malloc尝试分配的要求:

#include <malloc.h>

uint32_t get_free_heap_size(void) {
    struct mallinfo mi = mallinfo();
    // fordblks字段对应堆上空闲块的总字节数
    return mi.fordblks;
}

方法3:查询当前栈剩余可用空间

可通过读取当前栈指针寄存器的值,和栈最低边界对比得到栈剩余空间:

#include <stdint.h>

extern uint32_t __StackLimit;

uint32_t get_free_stack_size(void) {
    uint32_t current_sp;
    // 内嵌汇编读取当前栈指针寄存器值
    __asm__ __volatile__("mov %0, sp" : "=r"(current_sp));
    return current_sp - (uint32_t)&__StackLimit;
}

注意事项

  • 以上方法默认适配Pico SDK默认链接脚本,若自行修改了内存分段配置,需对应调整符号名称
  • 多核场景下,核心1的栈最低边界符号为__StackLimit1,计算核心1栈剩余时需替换对应符号
  • 所有链接脚本导出的符号需取地址才能获得正确的内存地址,不可直接读取变量值

内容的提问来源于stack exchange,提问作者tim11g

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:15:05