gpt4 book ai didi

avr - 我的 AVR 闪存是否因太大的程序而溢出?

转载 作者:行者123 更新时间:2023-12-04 01:41:26 26 4
gpt4 key购买 nike

我有一个项目,其中 ATtiny2313V 控制 7x5 LED 矩阵以显示滚动文本。为了显示文本,我构建了一个字体,它与程序的其余部分一起存储在闪存中。

整个程序,包括整个字体,占用 1106 字节。但是当我将它加载到芯片中时,它似乎没有运行;相反,它只会点亮几个 LED,仅此而已。

但是,当我删除大部分字体并仅使用字母 A 到 J 进行编译时,程序大小为 878 字节,并且运行良好。

这是因为 AVR 闪存的某种溢出吗?

ATtiny2313V 的数据表显示它有 2KByte 的闪存! 1106字节怎么可能太多了?

更新:为了清楚起见,我使用的工具链是 AVR Studio(用于编译代码),然后 AVRDude 将其上传到微 Controller 。据我所知,AVR Studio 使用了一个版本的 avr-gcc 来编译代码。

最佳答案

我不确定您使用的是什么工具链,但在 avr-gcc 中您需要使用 <avr/pgmspace.h>用于在闪存中存储和访问数据的 header - 仅声明您的数据是不够的 const因为它仍然在运行时加载到内存中,因此会占用闪存和内存中的空间(就像任何其他初始化变量一样)。

查看 User ManualHeader Docs了解更多信息。用法很简单,在flash中声明一个char数组,使用PROGMEM宏:

char data[] PROGMEM = {0xc4, 0x77}; // etc

然后为了访问数据,您需要使用提供的宏

char d = pgm_read_byte(&(data[i]));

编辑:还请记住,avrdude 仅报告 ram 的静态分配部分(.data 和 .bss),用于全局变量和静态变量等。您需要为堆栈留出空间 - 具体取决于您的程序(提示:递归不好)。

关于avr - 我的 AVR 闪存是否因太大的程序而溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1587810/

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