如何在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
相关产品推荐
相关产品推荐

