|
废话不多说,直接贴程序:
大概的讲一下程序的功能和结构,首先定义了两个const类型的数组,然后每个一段时间从这个数组中取出一个值赋给PORTC和PORTD,PORTC和PORTD上分别连接了8个LED灯。这样LED灯就会呈现出各种定义好的亮法。用的硬件是atmega128,编译器是avrstudio+winavr。问一下大家,这个const修饰的两个数组存储在哪里?估计很多人和我一样认为这两个数组存储在单片机的程序存储区即flash中,但实施情况是否如此呢?我们来看一下汇编代码:
分析程序可知,R18是作为i来计数的
MOV R30,R18 ;i的值赋值到R30中
LDI R31,0x00 ;R31的值为0,也就是说Z的值为i
MOVW R26,R30 ;将Z的值复制到X中
SUBI R26,0x00 ;X-0xff00,0xff00最高位为1,所以为负数,二进制补码为0x0100,等价于X=X+0x0100
SBCI R27,0xFF
LD R24,X ;将X地址处的值加载到R24中
OUT 0x15,R24 ;将R24的值赋给PORTC
所以,经过上面的代码分析可以得出结论,我们定义的const修饰的数组Pattern_P0存储在地址为0x0100地址的RAM中。为了验证我们的结论,我们来看一下RAM中的数据:
对比Pattern_P0中定义的值,可以很清楚的看到我们的结论是正确的。
对于这样的结论我觉得很奇怪,为什么定义的常数会存在RAM中呢???网上搜寻看到有文章说要使用#include <avr\pgmspace.h>,然后用prog_uchar来定义,随后我将程序代码修改为:
编译之后看汇编,貌似没有什么变化,于是继续修改:
编译之后看汇编:
可以很明显的看到了LPM指令,也就是说,从程序存储器中读取数据了,
MOV R24,R18 ;将i的值复制到R24中
LDI R25,0x00 ;将R25的值设置为0,也就是说R25:R24存储了i
MOVW R30,R24 ;将R25:R24的值复制到Z中
SUBI R30,0x74
SBCI R31,0xFF ;Z = Z - 0xFF74 等同于Z = Z + 0x8C也就是说Z = 0x8C + i
LPM R30,Z ;从程序存储器中加载数据到R30
OUT 0x15,R30 ;PORTC = R30
从上面的分析可以得出结论,我们定义的const修饰的数组Pattern_P0存储在地址为0x8C地址的FLASH中。为了验证我们的结论,我们来看一下FLASH中的数据,有一点需要注意的是,由于LPM指令需要的地址为8bit字节地址,而程序存储器的地址为16bit word地址,所以我们的数据应该存储在0x8C/2(0x46)的程序存储器地址处:
现在我想将程序修改成:
然后
在汇编文件中实现上面所述的功能。现在就遇到一个问题,我如何才能在汇编中访问这个在C程序中定义的const 变量Pattern_P0呢?
望高手指点啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
小弟不胜感激~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|