gpt4 book ai didi

debugging - 如何可视化 AVR 程序的内存 (SRAM) 使用情况?

转载 作者:IT王子 更新时间:2023-10-28 23:29:46 26 4
gpt4 key购买 nike

我在 AVR 微 Controller (ATMega328P) 上运行的 C 程序中遇到了问题。我相信这是由于堆栈/堆冲突,但我希望能够确认这一点。

有什么方法可以可视化堆栈和堆的 SRAM 使用情况?

注意:程序用avr-gcc编译,使用avr-libc。

更新: 我遇到的实际问题是 malloc 实现失败(返回 NULL)。所有 malloc 发生在启动时,所有 free 发生在应用程序结束时(实际上从来没有,因为应用程序的主要部分处于无限循环中) .所以我确信碎片化不是问题。

最佳答案

您可以使用 avr-size 实用程序检查 RAM 静态使用情况,如
中所述 http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=62968 ,
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=82536 ,
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=95638 ,
http://letsmakerobots.com/node/27115

avr-size -C -x Filename.elf

(avr 大小的文档:http://ccrma.stanford.edu/planetccrma/man/man1/avr-size.1.html)

以下示例说明如何在 IDE 上进行设置:在 Code::Blocks, Project -> Build options -> Pre/post build steps -> Post-build steps, 包括:

avr-size -C $(TARGET_OUTPUT_FILE)
avr-size -C --mcu=atmega328p $(TARGET_OUTPUT_FILE)

构建结束时的示例输出:

AVR Memory Usage
----------------
Device: atmega16

Program: 7376 bytes (45.0% Full)
(.text + .data + .bootloader)

Data: 81 bytes (7.9% Full)
(.data + .bss + .noinit)

EEPROM: 63 bytes (12.3% Full)
(.eeprom)

数据是你的SRAM使用量,它只是编译器的数量在编译时知道。您还需要空间来容纳在运行时(尤其是堆栈使用)。

要检查堆栈使用情况(动态 RAM),来自 http://jeelabs.org/2011/05/22/atmega-memory-use/

这是一个小实用函数,用于确定 RAM 的大小目前未使用:

int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

这是使用该代码的草图:

void setup () {
Serial.begin(57600);
Serial.println("\n[memCheck]");
Serial.println(freeRam());
}

freeRam() 函数返回在堆的末尾和堆栈上最后分配的内存之间存在多少字节,因此它实际上是堆栈/堆在它们碰撞之前可以增长多少。

您可以围绕您怀疑可能导致堆栈/堆冲突的代码检查此函数的返回。

关于debugging - 如何可视化 AVR 程序的内存 (SRAM) 使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/960389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com