我有一个项目,其中ATtiny2313V正在控制7x5 LED矩阵以显示滚动文本.为了显示文本,我构建了一个字体,该字体与程序的其余部分一起存储在闪存中.
整个程序,包括整个字体,占用1106个字节.但是当我把它加载到芯片中时,它似乎没有运行; 相反,它只是点亮了几个LED,就是这样.
但是,当我删除大部分字体,并仅使用字母A到J进行编译时,程序的大小为878字节,运行正常.
这是因为AVR闪存的某种溢出?
ATtiny2313V的数据表显示它有2KB的闪存!1106字节怎么样太多了?
更新:为了清楚起见,我使用的工具链是AVR Studio(编译代码)然后AVRDude将其上传到微控制器.据我所知,AVR Studio使用avr-gcc版本来编译代码.
我不确定你正在使用什么样的工具链,但是在avr-gcc中你需要使用<avr/pgmspace.h>
标题来存储和访问flash中的数据 - 仅仅const
因为它仍然被加载到内存中而声明数据是不够的.运行时,因此占用flash和ram中的空间(就像任何其他初始化变量一样).
有关更多信息,请查看用户手册和标题文档.用法很简单,在flash中声明一个char数组,使用PROGMEM
宏:
char data[] PROGMEM = {0xc4, 0x77}; // etc
Run Code Online (Sandbox Code Playgroud)
然后,为了访问数据,您需要使用提供的宏
char d = pgm_read_byte(&(data[i]));
Run Code Online (Sandbox Code Playgroud)
编辑:还要记住,avrdude只报告全局和静态变量等的ram(.data和.bss)的静态分配部分.你需要为堆栈留出空间 - 多少取决于你的程序(提示:递归)不好).