原创 IAR FOR AVR 编译环境中将数据定义在FLASH中的方法

2010-5-26 09:22 6910 7 8 分类: MCU/ 嵌入式

         IAR FOR AVR 编译环境中将数据定义在FLASH中的方法


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


在产品开发过程中,我们可能需要一些小的字库,或者有一些提示用的字符串,这些数据按照通常的方法定义的话,则会占据RAM空间,对于RAM空间本来就很小的AVR单片机来说,就显得问题比较严重了,可能会导致数据空间不够。在这种情况下,我们可以将这些数据分配到FLASH中,引用时直接从FLASH中取出。


程序例子如下:


#include <ioavr.h>   


__flash char s[10]={"0123456789"};


int main(void)


{


    int i;


    char a[10];


   


    for(i=0;i<10;i++)


    {


        a = s;


    }


}


此时对应的map文件显示:


 


f2f71561-35c7-4c54-a518-e69bfb8eca12.JPG


 



 


    从表中可以看出,有一段名为NEAR_F的段,属于代码空间的,且大小正好为10,应该就是所定义的数组s。因为,在数据空间中,我们没有看到有它的分配。


将编译后的代码进行模拟调试,并看反汇编窗口,如下图所示:


42e076da-7d7c-4e65-a8d6-4c5d7b805736.JPG


 



 


注意看a=s语句的等效汇编代码,其中有一条指令LPM R17Z,就是根据Z寄存器(R31,R30)从代码空间中取出一个字节,存放到寄存器R17中。


通过这个方法,就成功地将常量数据存放到代码空间中。


 


 


 


                          2010519日星期三

文章评论1条评论)

登录后参与讨论

用户1653229 2011-10-11 23:22

可是如果是大的字库呢?比如说图片logo的字库呢,请问如何放到flash中? 如果知道给我邮件:605097807@qq.com
相关推荐阅读
用户1203741 2012-04-24 12:00
STM32L开发经验之一
STM32L开发经验之一   这2天在调试单位的一个电路板,电路板的核心芯片是ST公司的STM32L152,在进行系统时钟源切换时发现一个问题:当选择系统时钟源为外接振荡器HSE时,有时对...
用户1203741 2011-09-01 22:32
液晶显示器FP71G+不亮的维修
液晶显示器FP71不亮的维修 有一台液晶显示器,型号是FP71G+,开机后不亮。上网查找了一些信息,据说此款显示器出现这种现象多半都是高压有问题,而且还指出了大部分问题都出现那对三极管上(型号为570...
用户1203741 2010-09-19 16:06
算法优化的重要性
                    算法优化的重要性 前些日子,在开发一个单片机的产品时,遇到这么一个问题,就是要将一个无符号的16位数,乘以1.2288后,再赋给另一个无符号的16位数。用C语言...
用户1203741 2010-08-19 16:56
STM8的C语言编程(14)-- PWM
                STM8的C语言编程(14)-- PWM 在单片机应用系统中,也常常会用到PWM信号输出,例如电机转速的控制。现在很多高档的单片机也都集成了PWM功能模块,方便用户的应...
用户1203741 2010-08-16 10:02
STM8的C语言编程(13)-- 蜂鸣器
                 STM8的C语言编程(13)-- 蜂鸣器 蜂鸣器是现在单片机应用系统中很常见的,常用于实现报警功能。为此STM8特别集成了蜂鸣器模块,应用起来非常方便。在应用蜂鸣器模...
用户1203741 2010-08-13 09:10
STM8的C语言编程(12)-- AD转换
                                       STM8的C语言编程(12)-- AD转换 在许多的单片机应用系统中,都需要A/D转换器,将模拟量转换成数字量。在STM8...
我要评论
1
7
关闭 站长推荐上一条 /2 下一条